1. 程式人生 > >技術人如何用Python找到房源資訊

技術人如何用Python找到房源資訊

11 月 18 日,北京西紅門鎮新建二村“聚福緣公寓”突發火災。火災後,隨之而來的是一場全北京市的“安全隱患大排查大清理大整治”風暴。

聚集著幾萬外來務工人員的新建村在幾天之內被清理一空。很多人正面臨著要重新找房子或是離開北京的問題。

違建的公寓正在消失,危房出租正在被拆,這些被“風暴”涉及到的外來上班族怎麼辦?只有接受現實,勇敢面對。

為了生存,為了能留在帝都,為了改變人生、出人頭地,再貴的房子他們都要租,或者他們可以再尋找一處稍遠點的房子。

租房的煩惱,相信大家或多或少都有過。獨自一人在大都市打拼,找個溫暖的小窩實屬不易,租個稱心又價格公道的房子是件重要的事兒。

站在技術人的角度,今天我就如何從各大租房網的房源裡面,找到最稱心如意的小窩做些分享,供大家參考。

在找房子的過程中我們最關心是價格和通勤距離這兩個因素。關於價格方面,現在很多租房網站都有,但是這些租房網站上沒有關於通勤距離的衡量。

對於我這種對帝都不是很熟的人,對各個區域的位置更是一臉懵逼。所以我就想著能不能自己計算距離呢,後來查了查還真可以。

實現思路就是:先抓取房源資訊,然後獲取房源的經緯度,最後根據經緯度計算公司與具體房源之間的距離。

我們在獲取經緯度之前,首先需要獲取各個出租房所在地的名稱,這裡獲取的方法是用爬蟲爬取鏈家網上的資訊。

Xpath 介紹

在爬取鏈家網的資訊的時候用的是 Xpath 庫,這裡對 Xpath 庫做一個簡單的介紹。

Xptah 是什麼

Xpath 是一門在 XML 文件中查詢資訊的語言。Xpath 可用來在 XML 文件中對元素和屬性進行遍歷。

Xpath 在查詢資訊的時候,需要先對 requests.get() 得到的內容進行解析,這裡是用 lxml 庫中的 etree.HTML(html) 進行解析得到一個物件 dom_tree,然後利用 dom_tree.Xpath() 方法獲取對應的資訊。

Xpath 怎麼用

Xpath 最常用的幾個符號就是“/”、“//”這兩個符號,“/”表示該標籤的直接子節點,就比如說一個人的眾多子女,而“//”表示該標籤的後代,就比如說是一個人的眾多後代(包括兒女、外甥、孫子之類的輩分)。

Xptah

更多詳細內容這裡就不 Ctrl C/V了。

資料抓取

我們本次抓取資料的流程是先獲得目標網頁 url,然後利用 requests.get() 獲得 html,然後再利用 lxml 庫中的 etree.HTML(html) 進行解析得到一個物件 dom_tree,然後利用 dom_tree.Xpath() 方法獲取對應的資訊。

先分析目標網頁 url 的構造,鏈家網的 url 構造還是很簡單的,頁碼就是 pg 後面的數字,在租房這個欄目下一共有 100 頁,所以我們迴圈 100 次就好啦。

資料

還有就是明確我們要獲取的資訊,在前面我們說了目標是要研究公司附近的出租房資訊,但是我們在租房的時候也不是僅僅考慮距離這一個因素。

這裡我準備獲取標題、價格、區域(大概在哪一塊)、看房人數(說明該房的受歡迎程度),樓層情況(高樓層還是低樓層),房租建築時間等等。(就是你能看到的資訊差不多都要弄下來哈哈)。

開始程式碼部分:

程式碼

得到目標網頁的 url 後,對其進行解析,採用的方法是先用 lxml 庫的 etree 對 response 部分進行解析,然後利用 Xpath 進行資訊獲取。

 url

通過上圖可以看出,我們一共抓取到 2970 條房屋資訊,9columns。

經緯度的獲取

我們剛剛只是獲取了一些出租房的基本資訊,但是我們要想計算距離還需要獲得這些出租房所在的地理位置,即經緯度資訊。

這裡的經緯度是獲取的區域層級的,即大概屬於哪一個片區,本次爬取的 2970 條房屋資訊分佈在北京的 208 個區域/區域。

關於如何獲取對應地點的經緯度資訊,這裡利用的 XGeocoding_v2 工具:

 XGeocoding_v2

獲取經緯度資訊的地址如下:http://www.gpsspg.com/maps.htm

得到如下的結果(LATB 表示維度,LNGB 表示經度):

距離的計算

最後將距離以及區域與對應的小區拼接在一起,得到下面的結果。

進一步分析

通過 df.info() 可以看出,總共有 2454 條資料,這是在爬蟲獲取的 2970 條資料去重以後得到的。

在這些項中,size(房屋面積)、second_feature 以及 third_feature 均帶有單位,為了後續分析方便,這裡統一進行去單位(字尾)操作。

我們把字尾去掉了,Size、third_feature 和 Distance 看上去是數字,但是通過 df.info() 看出,這兩個指標型別依然是 Object。為了進一步分析,我們要對它們繼續進行處理。

再次通過 df.info() 看出,該是數字型別的指標全部變成了 int/float 了,可以進行下一步了。

在文章剛開頭就說過,一般租房最看重的兩個因素就是距離&價格,價格可以直接在那些租房網上看到,肯定是越低越好,沒啥好說的。

主要是距離,關於距離,有兩種選擇方式,一種是先選出離你上班地最近的幾個區域,然後再在該區域內具體選擇;另一個是可以設定你可以接受的通勤距離,然後以這個距離作為條件,在小於等於這個距離內進行篩選。

我們這裡著重以第一種為主,先選擇距離最近的幾個區域,然後在這幾個區域內進行選擇。

因為距離是按 Region 來進行計算的,而表是按 Name 來統計的,所以要想計算出距離最近的 Region,需要先把 Region 和 Distance 部分提取出來,併合併成一個 DataFrame。

Region

可以看到,Region=“望京”距離最近,所以我們重點在該區域內選擇,接下來具體看看該區域內租房情況。

通過上表可以看到在望京區域總共有 101 套房源,接下來對這 101 套房源進行深入分析。

資料概覽,先對該區域的租房整體情況有個認識,看到 Price 指標的下界為 5000 左右,上界接近於 30000,中位數為 10000 出頭(有沒有感覺到好貴哈哈哈哈),但是我們也看到有一個大於 80000 的超級異常值,我們利用截尾均值對他進行替代。

關於房屋大小,中位數為 100 平,這與 Price 中位數正好可以對應,折算下來相當於 1 平 100 大洋,在與那些 10 平左右的合租房需要 2000+ 大洋比一比,是不是覺得還是 100 平 10000 大洋便宜哈。

所以論一平米的價格的話還是整租更便宜。

先找出那個大於 80000 的異常值具體值是多少,然後進行值替換。

這是將 Price 異常值處理以後得到的箱型圖,看起來就比較規範了哈。

Price

通過上圖可以看出:中樓層和高樓層的房源絕對數量基本持平,高出低樓層數量一半。

房屋修建時間也是 2003 年以後的居多,這就和前面的樓層型別可以對應上了,在剛開始的時候(2003 年以前)大部分房子都是低樓層,隨著時代的進步,科技的發展,人員的增多,樓層的數量和房屋的數量也隨之增加。

房屋型別上的 Top3 型別分別為:2 室 1 廳、3 室 2 廳和 1 室 1 廳。

通過上圖可以看出,隨著時間的推移,2003 年以後的房子的 Price 要明顯高於 2003 年以前的,如果要是對價格比較敏感,可以考慮 2003 年以前的房子。

隨著房屋型別的升級,價格也是隨之升高,但是我們也發現,有一些三室房子的價格(下邊界)要低於兩室的價格的,如果對房間數量和價格都有要求的可以考慮這部分房源。

通過上圖可以看到三個樓層的價格下界基本持平,但是中樓層的中位數和上界價格是要明顯高於其他兩個房型的,這也很正常,中樓層相比於其他兩個樓層的房屋是最宜居的啦,價格貴也正常。

當然了,對於現在租房都很困難的環境下,哪還考慮什麼宜居,當然是挑價格低的房型。

按 PV 進行降序,我們可以看出哪些房源是比較受歡迎,這些房源都有啥特徵。

從圖中可以看到,低樓層的房源數量不是最多的,但是看房次數卻是最多的(最受歡迎的),可能是低樓層價格低的原因吧。

2003 年和 2007 的房源 PV 最高,這和該年代的房源絕對數量基本維持一致;兩室一廳的戶型最為火爆;在價格方面 10000 以下的房源比較受歡迎。

結論

通過上面的分析我們可以得出一些參考:

  • 2003 年以前的房源的價格是要低於 2003 年之後的,對價格敏感的可以考慮 2003 年以前的房源。
  • 有一些三室的房子價格是低於兩室的,如果對房間數量和價格都有要求的可以考慮這部分。
  • 中樓層的價格整體上是要高於低樓層的,但是還有一部分是要比低樓層低,而且通過從 PV 最高的樓層來看,低樓層的火爆程度要比中樓層高,所以可以尋找那些不那麼火爆但是價格還低的中樓層。
  • 如果希望單位面積價格最低,還是整租比較合適。

注:本次的資料為鏈家網的整租房源資訊,非合租資訊,所以你會看到價格都很高。

作者:張俊紅

原文來自微信公眾號:51CTO技術棧