1. 程式人生 > >分享爬取鏈家地圖找房房價資料的小爬蟲

分享爬取鏈家地圖找房房價資料的小爬蟲

一、說在前面

受人所託,爬取鏈家上地圖找房的資料:https://bj.lianjia.com/ditu/
上面有按區域劃分的二手房均價和在售套數,我們的任務就是抓下這些資料。
這裡寫圖片描述

二、開幹

2.1失敗一次

老樣子,Chrome 按下F12開啟Chrome DevTools中的Network標籤檢視請求過程,像這種需要更新的資料大概率是通過後臺介面請求返回的,遺憾的是在XHR下並沒有找到介面,小洩氣。
繼續找,在JS下發現了一個可疑的請求:https://ajax.lianjia.com/map/search/ershoufang/
這裡寫圖片描述
嘻嘻,就是你了。然後就是熟悉的模擬請求過程了,把Headers、Query String Parameters都帶上,一通操作猛如虎之後:
這裡寫圖片描述


什麼鬼啊,一個簡單的GET請求,模擬了所有請求頭和引數,甚至在瀏覽器裡頭都無法再次請求成功。應該是鏈家做了什麼限制,如果有大牛不小心路過此篇能給予一些指導那是再好不過了。感激不盡,感激不盡。

2.2重新起航

此路不通,只好尋找別的辦法。鏈家的地圖找房功能其實找的是二手房,於是我進入二手房的房價頁面,發現了一個類似的資料展示頁面。https://bj.lianjia.com/fangjia/
這裡寫圖片描述
這個頁面就很有意思了,直接擺了一個明晃晃的介面。
Request URL:https://bj.lianjia.com/fangjia/priceMap/
資料也十分地明晃晃:
這裡寫圖片描述
可惜的是這個介面並不帶套數這個資料,不管了。先爬下來再說。

2.3程式碼簡單解讀

import requests
from bs4 import BeautifulSoup
from datetime import datetime

def get_city_list():
    city_list = {}
    city_from_url = 'https://m.lianjia.com/city/'
    mhtml = requests.get(city_from_url)
    mobj = BeautifulSoup(mhtml.content,'lxml')
    city_block = mobj.body.section.find_all('div'
,{'class':'block city_block'}) for cb in city_block: for cba in cb.find_all('a'): city_list[cba.get('href')] = cba.get_text() return city_list if __name__ == '__main__': cityd = get_city_list() f = open('houing_price_bycity.csv','w',encoding = 'utf-8') for citycode,city in cityd.items(): url = 'https://{}.lianjia.com/fangjia/priceMap/'.format(citycode[1:-1]) try: r = requests.get(url) if r.status_code == 200: res = r.json() else: continue except: continue for k,v in res.items(): if isinstance(v,(int,float)): pass else: cont = ','.join([city,v['name'],str(v['transPrice']),datetime.now().strftime("%Y-%m-%d %H:%M:%S")]) cont = cont + '\n' f.write(cont) f.close()

先是從一個鏈家移動端的頁面,抓取所有的城市列表和它們在鏈家內部的代號。用這個代號去替換請求中的城市部分,以此實現迴圈所有城市列表抓下所有城市的分割槽域房價資訊。實際應用中發現不是所有城市都有這個地圖找房的介面,主要是一些大城市才有。
因為是自用的小爬蟲,一些報錯處理也十分簡單粗暴,請求過程也沒有設定重試模組,也沒有限制訪問速度應對可能存在的鏈家反爬機制(結果來看,這個介面大概率沒有做反爬),結果也直接寫進了當前目錄的CSV文件。顯然存在許多可以優化的點。whatever,自己用用的小爬蟲就不講究這麼多了啦。
最後爬下來的結果長這樣:
這裡寫圖片描述

結束

本文到此就結束了,不過細心的小朋友可能會發現好像漏了什麼。
沒錯,一開始鏈家地圖找房的功能裡是有房價和在售套數兩個資料的,現在我們只獲取了其中一個。因為套數這個資料我們在接口裡沒有找到,不過我仍然找到了資料獲取的地方。
在鏈家-二手房-在售頁面,通過按區域搜尋可以看到這個資料直接展示在頁面上:
這裡寫圖片描述
這個資料是直接寫在網頁html程式碼裡的,按區域抓下來與之前的房價資料匹配起來即可。我們也由此可知,這個資料更新地不會很勤快,這一步就留給有需要的人去做吧。方法已經給到,實現自然不是什麼難事。
此篇正式終結,88。