爬蟲讀取鏈家網和趕集網租房信息,做可視化分析

爬蟲讀取鏈家網和趕集網租房信息,做可視化分析

來自專欄數據分析轉行

目的:爬取租房信息,練習數據處理,描述性分析,可視化。

#利用beautifulsoup和requests,通過網站的標籤或者正則,獲取需要的信息,以上海為例,結果如下,表格比較整潔,爬蟲過程中已經進行一定數據清洗。(爬蟲代碼見底部附錄)

鏈家網:

趕集網:

#該數據已經經過清洗,如提取地鐵信息、到地鐵的距離;分割房子年份、房型。

趕集網上發布的主要是整租,也有少量主卧和次卧,合租和隔斷間相對很少。

結合不同類型性價比,最好是選擇和認識的人一起整租,性價比最高。

下圖顯示,主卧性價比反而比次卧高,主要是由於兩者價格相差很少,而面積相差較大,及一般主卧面積比次卧大。建議可以多關注主卧,考察實際情況,說不定能找到更滿意的房間。

下圖繪製了鏈家網和趕集網不同戶型的房源數量,可以看出趕集網主要是1室的小戶型,鏈家網主要是2室/3室的大戶型,也有部分1室的小戶型。

下圖則顯示了不同地鐵線路的房源數量,從中可以看出上海市的規劃,最早的線路肯定是從最繁華的地段修起,作為反饋也帶動了線路周邊的建設,越晚的線路,相對房源也越少。

從租房到地鐵的距離看,平均值是680米,但由於數據有約2/5的缺失值,考慮缺失值大概率是距離地鐵較遠的房源,所以找到離地鐵680米以內的房源應該已經是比較理想的狀態。

下圖則顯示了不同年份建造,不同市區的房源。

可以看出黃浦/閘北/長寧/靜安/普陀/虹口這些區近年新建的租房比較少,應屬於老城區,城市規劃應已經接近飽和;

浦東/閔行/松江/嘉定則有較多的新建租房,其中浦東老租房可追溯到1983年,推測浦東屬於較早開始規劃開發的,閔行從92年左右開始建設,松江和嘉定開發的更晚。

從不同市區來看,徐匯/黃浦/虹口/長寧的價格最高,而浦東相對偏低,推測由於浦東區域較大,偏遠地區的租金拉低了靠近陸家嘴區域的租金。

對比鏈家和趕集網,普遍是趕集網的性價比較高,如果租房可以優先考察趕集網。

如果有興趣,還可以對數據做進一步處理,生產亞變數,利用這些特徵建模,預測租金,此處暫且忽略。

附錄:

#鏈家網爬蟲

house_info = []

#鏈家網只有100頁數據可讀取,故下列通過循環讀取100頁數據並添加到house列表裡

for page in range(1,101):

web = sh.lianjia.com/zufang/p %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=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)))


推薦閱讀:

80年代的趕集
趕集網
趕集網部分欄目被指含招嫖信息

TAG:趕集網 | 鏈家 | 數據分析 |