Python爬取數萬條北京租房資料,從6個維度揭穿房租瘋漲的祕密!!!
導讀:昨天還幻想海邊別墅的年輕人,今天可能開始對房租絕望了。
8月初,有網友在“水木論壇”發帖控訴長租公寓加價搶房引起關注。據說,一名業主打算出租自己位於天通苑的三居室,預期租金7500元/月,結果被二方中介互相擡價,硬生生擡到了10800。
過去一個月,全國熱點城市的房租如脫繮野馬。一線的房租同比漲了近20%。一夜醒來,無產青年連一塊立錐之地都懸了。
從2018下半年開始,租金海嘯洶洶來襲,資本狂歡,官方默然,房東糾結,租客尖叫。
這不是一方的過錯,而更像是一場全社會的“集體謀殺作品”。最令人不安的是,過去房地產的那套玩法和上漲邏輯,今天正在轉移到房租上。
房租暴漲的不只是北京。有資料顯示,7月份北京、上海、廣州、深圳、天津、武漢、重慶、南京、杭州和成都十大城市租金環比均有所上漲。其中北京、上海、深圳的租金漲幅最猛,北京7月份房租同比上漲3.1%,有小區甚至漲幅超過30%。
▲圖自“21世紀經濟報道”《最新房租資料出爐,你一個月要交多少錢?(附房租地圖)》一文
接下來,筆者通過Python大法通過獲取某網數萬條北京租房資料,給大家說說真實的房租情況。
還是老規矩,老套路(是不是有股熟悉的味道),筆者常用的三部曲:資料獲取、資料清洗預覽、資料分析視覺化,與你一起探究最近房租的狀況。
01 資料獲取
把目前市場佔有率最高的房屋中介公司為目標,來獲取北京、上海兩大城市的租房資訊。(目標連結:https://bj.lianjia.com/zufang/)
整體思路是:
-
先爬取每個區域的url和名稱,跟主url拼接成一個完整的url,迴圈url列表,依次爬取每個區域的租房資訊。
-
在爬每個區域的租房資訊時,找到最大的頁碼,遍歷頁碼,依次爬取每一頁的二手房資訊。
post程式碼之前簡單講一下這裡用到的幾個爬蟲Python包:
在這裡還是要推薦下我自己建的Python開發學習群:515267276,群裡都是學Python開發的,如果你正在學習Python ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2018最新的Python進階資料和高階開發教程,歡迎進階中和進想深入Python的小夥伴
-
requests: 就是用來請求對鏈家網進行訪問的包
-
lxml:解析網頁,用xpath表示式與正則表示式一起來獲取網頁資訊,相比bs4速度更快
詳細程式碼如下:
import requests
import time
import re
from lxml import etree
# 獲取某市區域的所有連結
def get_areas(url):
print('start grabing areas')
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
resposne = requests.get(url, headers=headers)
content = etree.HTML(resposne.text)
areas = content.xpath("//dd[@data-index = '0']//div[@class='option-list']/a/text()")
areas_link = content.xpath("//dd[@data-index = '0']//div[@class='option-list']/a/@href")
for i in range(1,len(areas)):
area = areas[i]
area_link = areas_link[i]
link = 'https://bj.lianjia.com' + area_link
print("開始抓取頁面")
get_pages(area, link)
#通過獲取某一區域的頁數,來拼接某一頁的連結
def get_pages(area,area_link):
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
resposne = requests.get(area_link, headers=headers)
pages = int(re.findall("page-data=\'{\"totalPage\":(\d+),\"curPage\"", resposne.text)[0])
print("這個區域有" + str(pages) + "頁")
for page in range(1,pages+1):
url = 'https://bj.lianjia.com/zufang/dongcheng/pg' + str(page)
print("開始抓取" + str(page) +"的資訊")
get_house_info(area,url)
#獲取某一區域某一頁的詳細房租資訊
def get_house_info(area, url):
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
time.sleep(2)
try:
resposne = requests.get(url, headers=headers)
content = etree.HTML(resposne.text)
info=[]
for i in range(30):
title = content.xpath("//div[@class='where']/a/span/text()")[i]
room_type = content.xpath("//div[@class='where']/span[1]/span/text()")[i]
square = re.findall("(\d+)",content.xpath("//div[@class='where']/span[2]/text()")[i])[0]
position = content.xpath("//div[@class='where']/span[3]/text()")[i].replace(" ", "")
try:
detail_place = re.findall("([\u4E00-\u9FA5]+)租房", content.xpath("//div[@class='other']/div/a/text()")[i])[0]
except Exception as e:
detail_place = ""
floor =re.findall("([\u4E00-\u9FA5]+)\(", content.xpath("//div[@class='other']/div/text()[1]")[i])[0]
total_floor = re.findall("(\d+)",content.xpath("//div[@class='other']/div/text()[1]")[i])[0]
try:
house_year = re.findall("(\d+)",content.xpath("//div[@class='other']/div/text()[2]")[i])[0]
except Exception as e:
house_year = ""
price = content.xpath("//div[@class='col-3']/div/span/text()")[i]
with open('鏈家北京租房.txt','a',encoding='utf-8') as f:
f.write(area + ',' + title + ',' + room_type + ',' + square + ',' +position+
','+ detail_place+','+floor+','+total_floor+','+price+','+house_year+'\n')
print('writing work has done!continue the next page')
except Exception as e:
print( 'ooops! connecting error, retrying.....')
time.sleep(20)
return get_house_info(area, url)
def main():
print('start!')
url = 'https://bj.lianjia.com/zufang'
get_areas(url)
if __name__ == '__main__':
main()
02 資料清洗預覽
資料共14038條,10個維度,由上圖可看出北京房源均價為9590元/月,中位數為7000。一半的房源價格在7000以下,所有房源的價格區間為[1000, 250000],價格極差過大。
03 資料分析視覺化
1. 四維度-北京房租均價
接下來,筆者將北京各區域、各路段、各樓盤房屋數量、均價分佈放在同一張圖上,更直觀地來看待房租
從圖中可看出,最近,北京市各區域的房租均在6000元/月以上,其中最高區域為東城,均價達12463元/月。不過,由於房源資訊過多過雜,房屋位置、面積、樓層、朝向等對價格均有較大影響,因此,價格這個維度需要進一步分析。
由上圖可得,各路段的均價基本都在6000以上,其中海淀北部新區的房源數最多,但均價最低,為3308元/月,這或許與海淀北部生態科技新區作為高新技術產業的承載區、原始創新策源地的研發基地,以及科技園集聚區,目前已入駐華為、聯想、百度、騰訊、IBM、Oracle等近2000家國內外知名的科技創新型企業有關。另一方面,海淀紫竹橋的房價竟一起沖天,其附近以博物館、體育場館為特色,交通便利,配套設施完善,均價較高也是情理之中。
可以看出,不同樓盤的均價浮動很大,但都在6000/月以上。最高的甚至達到17516/月。由於每個樓盤戶型差別較大,地理位置也較為分散,因此均價波動很大。每個樓盤具體情況還需具體分析。
附詳情程式碼:
#北京路段_房屋均價分佈圖
detail_place = df.groupby(['detail_place'])
house_com = detail_place['price'].agg(['mean','count'])
house_com.reset_index(inplace=True)
detail_place_main = house_com.sort_values('count',ascending=False)[0:20]
attr = detail_place_main['detail_place']
v1 = detail_place_main['count']
v2 = detail_place_main['mean']
line = Line("北京主要路段房租均價")
line.add("路段",attr,v2,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,
mark_point=['min','max'],xaxis_interval=0,line_color='lightblue', line_width=4,mark_point_textcolor='black',mark_point_color='lightblue',
is_splitline_show=False)
bar = Bar("北京主要路段房屋數量")
bar.add("路段",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,
xaxis_interval=0,is_splitline_show=False)
overlap = Overlap()
overlap.add(bar)
overlap.add(line,yaxis_index=1,is_add_yaxis=True)
overlap.render('北京路段_房屋均價分佈圖.html')
由上圖可以看出,均價在8000-10000之間的房屋數量最多,同時1500-2000這個價位之間房屋數少的可憐。
據北京市統計局的資料,2017年全市居民月人均可支配收入為4769元。另據58同城和趕集網釋出的報告,2017年北京人均月租金為2795元。
在這裡還是要推薦下我自己建的Python開發學習群:515267276,群裡都是學Python開發的,如果你正在學習Python ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2018最新的Python進階資料和高階開發教程,歡迎進階中和進想深入Python的小夥伴
北京租房者的房租收入比,驚人地接近60%。很多人一半的收入,都花在了租房上,人生就這樣被鎖定在貧困線上。
統計資料也表明,北京租房人群收入整體偏低。47%的租房人,年薪在10萬以下。在北京,能夠負擔得起每月5000元左右房租的群體,就算得上是中高收入人群。就這樣,第一批90後扛過了離婚、禿頭、出家和生育,終於還是倒在了房租面前。
附詳情程式碼:
#房源價格區間分佈圖
price_info = df[['area', 'price']]
#對價格分割槽
bins = [0,1000,1500,2000,2500,3000,4000,5000,6000,8000,10000]
level = ['0-1000','1000-1500', '1500-2000', '2000-3000', '3000-4000', '4000-5000', '5000-6000', '6000-8000', '8000-1000','10000以上']
price_stage = pd.cut(price_info['price'], bins = bins,labels = level).value_counts().sort_index()
attr = price_stage.index
v1 = price_stage.values
bar = Bar("價格區間&房源數量分佈")
bar.add("",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,
xaxis_interval=0,is_splitline_show=False)
overlap = Overlap()
overlap.add(bar)
overlap.render('價格區間&房源數量分佈.html')
2. 面積&租金分佈呈階梯性
上圖可以看出,80%的房源面積集中在0-90平方米之間,也符合租客單租與合租情況,大面積的房屋很少。
面積&租金分佈呈階梯性,比較符合常理。租房主力軍就是上班族了,一般對房子面積要求較低,基本集中在30平。
附詳情程式碼:
#房屋面積分佈
bins =[0,30,60,90,120,150,200,300,400,700]
level = ['0-30', '30-60', '60-90', '90-120', '120-150', '150-200', '200-300','300-400','400+']
df['square_level'] = pd.cut(df['square'],bins = bins,labels = level)
df_digit= df[['area', 'room_type', 'square', 'position', 'total_floor', 'floor', 'house_year', 'price', 'square_level']]
s = df_digit['square_level'].value_counts()
attr = s.index
v1 = s.values
pie = Pie("房屋面積分佈",title_pos='center')
pie.add(
"",
attr,
v1,
radius=[40, 75],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left",
)
overlap = Overlap()
overlap.add(pie)
overlap.render('房屋面積分佈.html')
#房屋面積&價位分佈
bins =[0,30,60,90,120,150,200,300,400,700]
level = ['0-30', '30-60', '60-90', '90-120', '120-150', '150-200', '200-300','300-400','400+']
df['square_level'] = pd.cut(df['square'],bins = bins,labels = level)
df_digit= df[['area', 'room_type', 'square', 'position', 'total_floor', 'floor', 'house_year', 'price', 'square_level']]
square = df_digit[['square_level','price']]
prices = square.groupby('square_level').mean().reset_index()
amount = square.groupby('square_level').count().reset_index()
attr = prices['square_level']
v1 = prices['price']
pie = Bar("房屋面積&價位分佈布")
pie.add("", attr, v1, is_label_show=True)
pie.render()
bar = Bar("房屋面積&價位分佈")
bar.add("",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,
xaxis_interval=0,is_splitline_show=False)
overlap = Overlap()
overlap.add(bar)
overlap.render('房屋面積&價位分佈.html')
3. 大多數房屋年齡在10年以上
由上圖看出,房屋年齡大多集中在10-20年、25年以上,而5年以下的不到2%;不過,別看這些都是老房子,最近房租變得這麼猖狂?原因其中之一就是資本圈地。
這條網貼立馬點燃了大眾的情緒:“好啊,原來是這些長租平臺燒錢圈地,一心只想要壟斷市場房源,哄擡租金,企圖賺取暴利差價!”
04 後記
拿自如舉例,表面上看跟中介公司沒啥兩樣,收了各種散盤,然後集中裝修、出租、管理,因為運營成本和住房質量提高,房租肯定有所上漲。
但更關鍵的事情在背後。自如把專案打包起來搞起了資產證券化,以租金收益權為基礎資產做擔保,投放到金融市場上發行國內首單租房市場消費分期類ABS,讓各路資金來認購,每年給大家搞點分紅。
大量資本都在賭租房這個風口,而前期誰的規模越大、資源越多,以後的定價權就越大,利潤空間就越不可想象。
這次筆者一共從鏈家網上爬取14038條資料,而那就是大概一週前,8月17日北京住建委約談了幾家中介公司。最終的結果是自如、相寓和蛋殼承諾將拿出12萬間房子投入市場其中,自如將拿出8萬間(鏈家、自如、貝殼找房,他們的實際控制人是同一個人——鏈家老闆左暉)。
也就是說,平常的時候,鏈家網+自如一共在網上待租的也就是1萬多套房子,但是一被約談他們就一口氣拿出了8萬套房子增援??怎麼增?繼續收房,讓房源更加供不應求?
昨天買不起房,今天租不起房,如果連這樣的生活也要因為市場的不規範而被逼迫、被奪走,真的會讓人對一個城市失去希望。
更多程式設計方面的分享請關注微信公眾號:程式設計師交流互動平臺!