python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据
前言
本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問(wèn)題請(qǐng)及時(shí)聯(lián)系我們以作處理
以下文章來(lái)源于啤酒就辣條 ,作者啤酒就辣條
一、網(wǎng)頁(yè)分析
爬取貝殼網(wǎng)石家莊二手房信息,先打開(kāi)鏈接
https://sjz.ke.com/ershoufang/。
不添加篩選條件,發(fā)現(xiàn)總共有42817套房子。我們點(diǎn)擊第二頁(yè),再查看鏈接變成了https://sjz.ke.com/ershoufang/pg2/。所以,可發(fā)現(xiàn)/pg{i},i就是頁(yè)碼。
所以最多可爬取3000套房產(chǎn)信息,距離上面給出的4萬(wàn)多差的還很遠(yuǎn),于是嘗試把pg{i}的那個(gè)i人為改變一下,點(diǎn)擊回車(chē)請(qǐng)求一下。
返回房產(chǎn)信息數(shù)據(jù)都一樣。都是第100頁(yè)的信息,于是乎,得出結(jié)論。通過(guò)貝殼網(wǎng)web端,查看某一條件下的房產(chǎn)信息,最多可以查看3000套。
所以呢,我們?cè)黾右恍l件,比如,滿五唯一,2室的。請(qǐng)求之~
發(fā)現(xiàn)鏈接變成了https://sjz.ke.com/ershoufang/pg2mw1l2/。mw1l2這個(gè)玩意應(yīng)該篩選條件。看到只有2399套,歐克,咱們就爬它了。
二、擼起袖子寫(xiě)代碼
麻雀雖小五臟俱全,本爬蟲(chóng)設(shè)計(jì)三個(gè)部分,爬取,解析,儲(chǔ)存。
爬取
爬取利用requests庫(kù),比python內(nèi)置庫(kù)urllib要好用很多。
importrequestsdefget_a_page(url):
result=requests.get(url)print(result.text)if __name__ == '__main__':for i in range(1, 101):
get_a_page(f'https://sjz.ke.com/ershoufang/pg{i}mw1l2/')
for循環(huán)打印返回?cái)?shù)據(jù),發(fā)現(xiàn)沒(méi)問(wèn)題。其實(shí)i循環(huán)到81就好了,畢竟咱們知道了,只有不到2400套嘛。
解析
解析使用pyquery?,這個(gè)庫(kù)使用起來(lái)類似于Jquery。完整API,https://pythonhosted.org/pyquery/api.html。還有一個(gè)解析庫(kù)`bs4,下次再嘗試。
在這里插入圖片描述
發(fā)現(xiàn)讀取如圖所示ul里面一個(gè)div就可以拿到我們想要的數(shù)據(jù)。
importrequestsfrom pyquery importPyQuery as pqimportjsondefget_a_page(url):
result=requests.get(url)
doc=pq(result.text)
ul= doc('.sellListContent')
divs= ul.children('.clear .info.clear').items()for div indivs:
count+= 1title= div.children('.title a').text()
place= div.children('.address .flood .positionInfo a').text()
msg= div.children('.address .houseInfo').text()
price= div.children('.address .priceInfo .totalPrice span').text()
per_meter= div.children('.address .priceInfo .unitPrice').attr('data-price')
dict={'title': title,'place': place,'msg': msg,'price': price,'per_meter': per_meter
}print(str(count) + ':' + json.dumps(dict, ensure_ascii=False))
代碼如上,pyquery 的children方法是查找子標(biāo)簽,find方法是找子孫標(biāo)簽,此處我們只需要找下一代就好。然后通過(guò)text找到標(biāo)簽所包含的文本。attr是獲取屬性內(nèi)容的,因?yàn)槟莻€(gè)per_meter從屬性中獲取比較簡(jiǎn)單,標(biāo)簽中的內(nèi)容還包含了“元/平米”。
儲(chǔ)存
本次我們直接儲(chǔ)存到csv中,一種類似于excel的文件格式。利用的是pandas庫(kù)。
完整代碼如下:
importrequestsfrom pyquery importPyQuery as pqimportjsonimportpandas as pd
columns= ['title', 'msg', 'price', 'per_meter']#爬取某網(wǎng)頁(yè)
defget_a_page(url):
result=requests.get(url)
doc=pq(result.text)
ul= doc('.sellListContent')
divs= ul.children('.clear .info.clear').items()
count=0
titles=[]
places=[]
msgs=[]
prices=[]
per_meters=[]for div indivs:
count+= 1title= div.children('.title a').text()
place= div.children('.address .flood .positionInfo a').text()
msg= div.children('.address .houseInfo').text()
price= div.children('.address .priceInfo .totalPrice span').text()
per_meter= div.children('.address .priceInfo .unitPrice').attr('data-price')
dict={'title': title,'place': place,'msg': msg,'price': price,'per_meter': per_meter
}
titles.append(title)
places.append(place)
msgs.append(msg)
prices.append(price)
per_meters.append(per_meter)print(str(count) + ':' + json.dumps(dict, ensure_ascii=False))
datas={'title': titles,'place': places,'msg': msgs,'price': prices,'per_meter': per_meters
}
df= pd.DataFrame(data=datas, columns=columns)
df.to_csv('sjz.csv', mode='a', index=False, header=False)if __name__ == '__main__':for i in range(1, 101):
get_a_page(f'https://sjz.ke.com/ershoufang/pg{i}mw1l2/')
多進(jìn)程
由于get_a_page函數(shù)要運(yùn)行100次,有點(diǎn)小慢,所以利用多進(jìn)程加快速度,這部分代碼,請(qǐng)直接copy。
將主函數(shù)改成如下所示
from multiprocessing.pool importPoolif __name__ == '__main__':
pool= Pool(5)
group= ([f'https://sjz.ke.com/ershoufang/pg{x}mw1l2/'for x in range(1, 101)])
pool.map(get_a_page,group)
pool.close()
pool.join()
三、結(jié)束
查看下效果:
效果還可以。有人會(huì)說(shuō),為什么不把msg信息拆分一下,分別儲(chǔ)存樓層、幾室?guī)讖d、建筑年代等等多好。剛開(kāi)始,我是那么做的,結(jié)果發(fā)現(xiàn)這個(gè)msg數(shù)據(jù)那幾項(xiàng)不是必填項(xiàng),有的建筑年代、樓層什么的房主不填寫(xiě),索性就整個(gè)拿過(guò)來(lái)了。
總結(jié)
以上是生活随笔為你收集整理的python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql error nr.2003_
- 下一篇: python罗马数字转换,Python3