爬蟲讀取鏈家網和趕集網租房信息,做可視化分析
來自專欄數據分析轉行
目的:爬取租房信息,練習數據處理,描述性分析,可視化。
#利用beautifulsoup和requests,通過網站的標籤或者正則,獲取需要的信息,以上海為例,結果如下,表格比較整潔,爬蟲過程中已經進行一定數據清洗。(爬蟲代碼見底部附錄)
鏈家網:
趕集網:
#該數據已經經過清洗,如提取地鐵信息、到地鐵的距離;分割房子年份、房型。
趕集網上發布的主要是整租,也有少量主卧和次卧,合租和隔斷間相對很少。
結合不同類型性價比,最好是選擇和認識的人一起整租,性價比最高。
下圖顯示,主卧性價比反而比次卧高,主要是由於兩者價格相差很少,而面積相差較大,及一般主卧面積比次卧大。建議可以多關注主卧,考察實際情況,說不定能找到更滿意的房間。
下圖繪製了鏈家網和趕集網不同戶型的房源數量,可以看出趕集網主要是1室的小戶型,鏈家網主要是2室/3室的大戶型,也有部分1室的小戶型。
下圖則顯示了不同地鐵線路的房源數量,從中可以看出上海市的規劃,最早的線路肯定是從最繁華的地段修起,作為反饋也帶動了線路周邊的建設,越晚的線路,相對房源也越少。
從租房到地鐵的距離看,平均值是680米,但由於數據有約2/5的缺失值,考慮缺失值大概率是距離地鐵較遠的房源,所以找到離地鐵680米以內的房源應該已經是比較理想的狀態。
下圖則顯示了不同年份建造,不同市區的房源。
可以看出黃浦/閘北/長寧/靜安/普陀/虹口這些區近年新建的租房比較少,應屬於老城區,城市規劃應已經接近飽和;
浦東/閔行/松江/嘉定則有較多的新建租房,其中浦東老租房可追溯到1983年,推測浦東屬於較早開始規劃開發的,閔行從92年左右開始建設,松江和嘉定開發的更晚。
從不同市區來看,徐匯/黃浦/虹口/長寧的價格最高,而浦東相對偏低,推測由於浦東區域較大,偏遠地區的租金拉低了靠近陸家嘴區域的租金。
對比鏈家和趕集網,普遍是趕集網的性價比較高,如果租房可以優先考察趕集網。
如果有興趣,還可以對數據做進一步處理,生產亞變數,利用這些特徵建模,預測租金,此處暫且忽略。
附錄:
#鏈家網爬蟲
house_info = []
#鏈家網只有100頁數據可讀取,故下列通過循環讀取100頁數據並添加到house列表裡
for page in range(1,101):
web = https://sh.lianjia.com/zufang/pg%d/ %page
response = requests.get(web,headers=headers).text
soup = BeautifulSoup(response,html.parser)
price = [int(re.findall( (d+)元,i.text)[0]) for i in soup.findAll(name=div,attrs={class:price})]
xiaoqu = [i.text.strip() for i in soup.findAll(name=span,attrs={class:region})]
fangxin = [i.text.strip() for i in soup.findAll(name=span,attrs={class:zone})]
area = [int(re.findall((d+)平, i.text.strip())[0]) for i in soup.findAll(name=span,attrs={class:meters})]
quyu = [i.text.split(/)[0][:-2] for i in soup.findAll(name=div,attrs={class:other})]
louceng = [i.text.split(/)[1] for i in soup.findAll(name=div,attrs={class:other})]
title = [i.text.split()[0] for i in soup.findAll(name=div,attrs={class:info-panel})]
subway = [re.findall(r<span class="fang-subway-ex"><span>(.*?)</span>, str(i)) for i in soup.findAll(name=div,attrs={class:view-label left})]
time=[i.text.split(/)[2] for i in soup.findAll(name=div,attrs={class:other})]
direction=[]
qu=[]
#朝向和城區數據在列表頁沒有,只有進入詳細頁讀取,先要在列表頁讀取出詳細頁的網址,然後在詳細頁讀取數據
urls = re.findall(<a href="(.*?)" target="_blank">,str(soup.findAll(name=div,attrs = {class:pic-panel})))
for url in urls:
response1 = requests.get(url,headers=headers).text
soup1 = BeautifulSoup(response1,html.parser)
d = re.findall(r<p class="lf"><i>房屋朝向:</i>(.+?)</p>, str(soup1.findAll(name=p,attrs = {class: lf})))
if len(d)==0:
direction.append(np.nan)
else:
direction.append(d[0])
q = soup1.findAll(name=div,attrs = {class: clear})[0].text.split()[4][:-2]
qu.append(q)
house_info.append(pd.DataFrame(dict(qu=qu,title=title,time=time,direction=direction,subway=subway,louceng=louceng,
quyu=quyu,area=area,fangxin=fangxin,price=price,xiaoqu=xiaoqu)))
#趕集網爬蟲
house_info=[]
for page in range(1,101):
url=http://sh.ganji.com/fang1/o%d/%page
response=requests.get(url,headers=header).text
soup = BeautifulSoup(response,html.parser)
jinzhuang = [i.text.split()[-1] for i in soup.findAll(name=dd,attrs={class:rdd-item size})]
direction = [re.findall(
(.*向),i.text) for i in soup.findAll(name=dd,attrs={class:rdd-item size})]
title = [i.text.split(
)[1] for i in soup.findAll(name=dd,attrs={class:dd-item title})]
zhengzu = [i.text for i in soup.findAll(name=span,attrs={class:rfirst js-huxing})]
huxing = []
for i in soup.findAll(name=dd,attrs={class:rdd-item size}):
if i.text.split()[1][-1] == ㎡:
huxing.append(np.nan)
else:
huxing.append(i.text.split()[1])
area = []
for i in soup.findAll(name=dd,attrs={class:rdd-item size}):
if i.text.split()[1][-1] == ㎡:
area.append(int(i.text.split()[1][:-1]))
elif i.text.split()[2][-1] == ㎡:
area.append(int(i.text.split()[2][:-1]))
else:
area.append(np.nan)
qu= [i.text.split()[0] for i in soup.findAll(name=span,attrs={class:area})]
quyu = []
for i in soup.findAll(name=span,attrs={class:area}):
if len(i.text.split())>3:
quyu.append(i.text.split()[2][:-2])
else:
quyu.append(np.nan)
xiaoqu = [i.text.split()[-1] for i in soup.findAll(name=span,attrs={class:area})]
price = [int(re.findall((d+)元,i.text)[0]) for i in soup.findAll(name=div,attrs={class:price})]
house_info.append(pd.DataFrame(dict(price=price,qu=qu,quyu=quyu,xiaoqu=xiaoqu,title=title,zhengzu=zhengzu,direction=direction,area=area,huxing=huxing,jinzhuang=jinzhuang)))
推薦閱讀: