python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据
前言
本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于啤酒就辣條 ,作者啤酒就辣條
一、網頁分析
爬取貝殼網石家莊二手房信息,先打開鏈接
https://sjz.ke.com/ershoufang/。
不添加篩選條件,發現總共有42817套房子。我們點擊第二頁,再查看鏈接變成了https://sjz.ke.com/ershoufang/pg2/。所以,可發現/pg{i},i就是頁碼。
所以最多可爬取3000套房產信息,距離上面給出的4萬多差的還很遠,于是嘗試把pg{i}的那個i人為改變一下,點擊回車請求一下。
返回房產信息數據都一樣。都是第100頁的信息,于是乎,得出結論。通過貝殼網web端,查看某一條件下的房產信息,最多可以查看3000套。
所以呢,我們增加一些條件,比如,滿五唯一,2室的。請求之~
發現鏈接變成了https://sjz.ke.com/ershoufang/pg2mw1l2/。mw1l2這個玩意應該篩選條件。看到只有2399套,歐克,咱們就爬它了。
二、擼起袖子寫代碼
麻雀雖小五臟俱全,本爬蟲設計三個部分,爬取,解析,儲存。
爬取
爬取利用requests庫,比python內置庫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循環打印返回數據,發現沒問題。其實i循環到81就好了,畢竟咱們知道了,只有不到2400套嘛。
解析
解析使用pyquery?,這個庫使用起來類似于Jquery。完整API,https://pythonhosted.org/pyquery/api.html。還有一個解析庫`bs4,下次再嘗試。
在這里插入圖片描述
發現讀取如圖所示ul里面一個div就可以拿到我們想要的數據。
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方法是查找子標簽,find方法是找子孫標簽,此處我們只需要找下一代就好。然后通過text找到標簽所包含的文本。attr是獲取屬性內容的,因為那個per_meter從屬性中獲取比較簡單,標簽中的內容還包含了“元/平米”。
儲存
本次我們直接儲存到csv中,一種類似于excel的文件格式。利用的是pandas庫。
完整代碼如下:
importrequestsfrom pyquery importPyQuery as pqimportjsonimportpandas as pd
columns= ['title', 'msg', 'price', 'per_meter']#爬取某網頁
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/')
多進程
由于get_a_page函數要運行100次,有點小慢,所以利用多進程加快速度,這部分代碼,請直接copy。
將主函數改成如下所示
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()
三、結束
查看下效果:
效果還可以。有人會說,為什么不把msg信息拆分一下,分別儲存樓層、幾室幾廳、建筑年代等等多好。剛開始,我是那么做的,結果發現這個msg數據那幾項不是必填項,有的建筑年代、樓層什么的房主不填寫,索性就整個拿過來了。
總結
以上是生活随笔為你收集整理的python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql error nr.2003_
- 下一篇: mysql 5.1.53_mysql 5