Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
做一個(gè)有趣的項(xiàng)目,首先整理一下思路,如何快速爬取關(guān)鍵信息。并且實(shí)現(xiàn)自動(dòng)翻頁(yè)功能。
想了想用最常規(guī)的requests加上re正則表達(dá)式,BeautifulSoup用于批量爬取
import requests
import re
from bs4 import BeautifulSoup
import pymysql
然后引入鏈接,注意這里有反爬蟲(chóng)機(jī)制,第一頁(yè)必須為https://tianjin.anjuke.com/sale/,后面頁(yè)必須為’https://tianjin.anjuke.com/sale/p%d/#filtersort’%page,不然會(huì)被機(jī)制檢測(cè)到為爬蟲(chóng),無(wú)法實(shí)現(xiàn)爬取。這里實(shí)現(xiàn)了翻頁(yè)功能。
while page < 11:
# brower.get("https://tianjin.anjuke.com/sale/p%d/#filtersort"%page)
# time.sleep(1)
print ("這是第"+str(page) +"頁(yè)")
# proxy=requests.get(pool_url).text
# proxies={
# 'http': 'http://' + proxy
# }
if page==1:
url='https://tianjin.anjuke.com/sale/'
headers={
'referer': 'https://tianjin.anjuke.com/sale/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
}
else:
url='https://tianjin.anjuke.com/sale/p%d/#filtersort'%page
headers={
'referer': 'https://tianjin.anjuke.com/sale/p%d/#filtersort'%page,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
}
# html=requests.get(url,allow_redirects=False,headers=headers,proxies=proxies)
html=requests.get(url, headers=headers)
第二步自然是分析網(wǎng)頁(yè)以及如何實(shí)現(xiàn)自動(dòng)翻頁(yè),首先找到圖片
正則表達(dá)式走起!
#圖片地址
myjpg=r'<img src="(.*?)" width="180" height="135" />'
jpg=re.findall(myjpg,html.text)
照片信息已經(jīng)完成爬取,接下來(lái)依葫蘆畫(huà)瓢,把其它信息頁(yè)也迅速爬取!
#描述
mytail=r'<a data-from="" data-company="" title="(.*?)" href'
tail=re.findall(mytail,html.text)
# 獲取總價(jià)
totalprice=r'<span class="price-det"><strong>(.*?)</strong>'
mytotal=re.findall(totalprice,html.text)
#單價(jià)
simpleprice=r'<span class="unit-price">(.*?)</span> '
simple=re.findall(simpleprice,html.text)
接下來(lái)實(shí)現(xiàn)用beauitfulsoup實(shí)現(xiàn)關(guān)鍵字標(biāo)簽取值!解析器我這里用lxml,速度比較快,當(dāng)然也可以用html.parser
soup=BeautifulSoup(html.content,'lxml')
看圖,這里用了很多換行符,并且span標(biāo)簽沒(méi)有命名,所以請(qǐng)上我們的嘉賓bs4
這里使用了循環(huán),因?yàn)槭且淮涡耘廊。粋€(gè)300條信息,由于一頁(yè)圖片只有60張,所以將其5個(gè)一組進(jìn)行劃分,re.sub目的為了將其中的非字符信息替換為空以便存入數(shù)據(jù)庫(kù)
#獲取房子信息
itemdetail=soup.select(".details-item span")
# print(len(itemdetail))
you=[]
my=[]
for i in itemdetail:
# print(i.get_text())
you.append(i.get_text())
k=0
while k < 60:
my.append([you[5 * k], you[5 * k + 1], you[5 * k + 2], you[5 * k + 3],re.sub(r'\s', "", you[5 * k + 4])])
k=k + 1
# print(my)
# print(len(my))
接下來(lái)存入數(shù)據(jù)庫(kù)!
db=pymysql.connect("localhost", "root", "" ,"anjuke")
conn=db.cursor()
print(len(jpg))
for i in range(0,len(tail)):
jpgs=jpg[i]
scripts=tail[i]
localroom=my[i][0]
localarea=my[i][1]
localhigh=my[i][2]
localtimes=my[i][3]
local=my[i][4]
total=mytotal[i]
oneprice=simple[i]
sql="insert into shanghai_admin value('%s','%s','%s','%s','%s','%s','%s','%s','%s')" % \
(jpgs,scripts,local,total,oneprice,localroom,localarea,localhigh,localtimes)
conn.execute(sql)
db.commit()
db.close()
大功告成!來(lái)看看效果!
以下為完整代碼:
這個(gè)程序會(huì)出現(xiàn)資料庫(kù)有的 3 個(gè)朋友,然后加上一個(gè)朋友 Howard,加了之后再將整個(gè)資料庫(kù)在控制臺(tái)打印出來(lái),這樣就會(huì)有 4 個(gè)了,多了一個(gè),就是在這里加的。
程序與之前的差異在于加了函數(shù),在這里有 SQL、INSERT、INTO、friends、VALUES,兩個(gè)問(wèn)號(hào)相對(duì)應(yīng)的是 f_name、f_phone,這是資料庫(kù)的名字和電話,這種寫(xiě)法就可以調(diào)用函數(shù)。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。