程序員租房妙招,爬一個好房

背景

春節過後回京,本想好好休息兩天結果家裏迎來了不速之客——老鼠。最後通過一系列的操作終於成功捕獲一家 8 口,這個過程筆者就不做多描述了。由於此次捕鼠事件留下陰影決定搬離。和媳婦開始尋找合適的房源,這還只是一個開始;之後看好房子(房子還在配置中)跟管家約定好釋放當日簽約;和媳婦兩臺手機兩臺電腦搶房子結果還是失之交臂。就算是雙十一也不過如此吧!

 

之後繼續找房發現基於小區搜索房源結果很不準確(用地鐵站能過濾出來的,但直接用小區名就是搜不全),再加上想對當前市場房源有一個更清晰的了解,於是便有了一個想法——能否通過爬蟲自己做個檢索來找房子

 

開始

通過爬蟲自己做個檢索來找房子,有了這個想法後就試着做一下,首先有一個大概思路:

  • 寫一個爬蟲程序,儘可能解析出房子相關信息作爲字段存儲。

  • 將數據存放在 ES(Elasticsearch)中便於查找

  • 使用 kibana 實現查詢和分析,因其作爲 ELK 經典組件,在查詢分析上的強大優勢不再多言

 

需開發的爬蟲可分爲如下模塊:

  • 控制模塊:作爲起始開關和任務管理

  • 抓取模塊:輸入一個網址,輸出網頁內容

  • 解析模塊:接收一段內容,輸出有價值的字段信息,以及下一頁等更多待解析的任務

  • 存儲模塊:簡單的做一個 map 進行運行時去重,然後將信息寫入 ES

 

整個架構和其他爬蟲基本一樣,但自如爲防止爬蟲,搜索結果最多顯示50頁,對應辦法就是遍歷重要的查詢參數,比如城市、地鐵站、房子類型等。於是解析模塊的順序大概是:

1. 城市列表解析器,用來解析不同城市(當然這里只需要北京)

2. 地鐵站解析器,用來解析出不同的地鐵站

3. 房屋列表解析器,用來解析每一頁的房屋列表和下一頁待解析的任務

4. 房屋詳情解析器,用來解析房屋的詳細信息,如朝向、面積、戶型、樓層、陽臺、室友等

 

這里需要注意幾點:

1. 爬蟲使用 golang,它本身沒有解析庫,可以用第三方的 css 樣式選擇器、xpath,也完全可以用正則搞定,這里主要用正則實現,部分地方試用了下 css 選擇器

 

2. 部分房間信息如地鐵站、地鐵線路、所屬 url、陽臺、裝修風格在房屋詳情中不容易提取,可以在上一級頁面如房屋列表中獲得。

 

 

 

3. 房租價格做了反爬蟲處理,不容易獲得,具體是價格爲不同圖片拼接,這些圖片根據一個靜態隨機頁面搭配 offset 進行判斷,然後通過 ocr 進行基本圖片識別就能得到。

 

在上一級的網頁源碼中可以發現對應的原始圖片和序號,這樣就很簡單了。

 

接下來是圖片識別,需要用到一個利器——tesseract(https://github.com/tesseract-ocr/tesseract/wiki)

 

 

儘管有這麼個神器,但解析成功率依然不能保證 100%,尤其是在沒有訓練的情況下,因此就需要像上面代碼中那樣,在短期內想提高效率就添加部分人工識別的代碼,並降低重複工作,也能基本滿足需求。

 

接下來是寫入存儲,這里爲快捷實現,我們用 docker 在本機運行 es 和kibana,如下:

 

需要注意:盡量使用高版本,5.6 以後的 es 鏡像版本中都默認安裝了 x-pack 並激活了基礎版本的 license(即免費使用基礎功能,在這里也夠了)golang 對接 ES 可以使用官方的 client.代碼如:

 

注意上面的 setSniff=false,如果不加會有如下報錯:

 

在docker中運行es時,默認啓動 sniffing 模式,es自動查找節點, 要確保Elasticsearch 返回可從容器外部訪問的 IP 地址。

 

解決方式爲關閉 sniffing 或者配置 es 返回的主機地址,參考https://github.com/olivere/elastic/wiki/Docker

1. 配置 elasticsearch

  • 將 network.publish_host 和 network.bind_host 配置爲可從容器外部訪問的地址

  • 配置network.host (不用再單獨配置network.bind_host 和 network.publish_host)

2. 禁用 sniffing

elastic.SetSniff(false)

 

最終,經過一番嘗試,登錄 kibana 開始新的探索:

比如,基於多條地鐵線進行房源查找,甚至可以排除部分職業的室友,舉個栗子,排除下自己。

 

然後在 kibana 的 Visualize 中進行更多的分析:

比如最貴的地鐵站周邊和地鐵線周邊,2號線因爲是內環地鐵線路,均價毫無爭議最高。地鐵站圓明園算是景區之外,中關村最貴也合情理。整租方面因爲雙井附近有一些豪宅而略高,其他地區基本在9500左右。

 

市場行情:

整租6-7k最多,合租費用上2-3k則是最高頻,其次是3-4k,而我也總算知道爲什麼之前的房源那麼搶手了,因爲它比當地均價低了500多;而1500以下的爲數不多的幾個都在遠郊。

 

房源的情況:

可以看到大部分自如客住的都在20平內,佔比約76%,如果細分的話可以看到10-15是最高比的,而10號地鐵線的房源最多

 

房源最多集中在頂樓,這些多數是沒電梯的老樓;而帶獨立陽臺的,則只有20%;而從朝向上看,雖然南的比例最高,但非南的加起來也遠超它,可見大多數人都和陽光處的不太好。

 

從租客信息可知,男女比例相差不多,但星座上天秤座卻比射手多好些。而從職業上看,IT行業(開發研發、測試、運維)佔比遠比其他要高,而他們又最多分佈在8號線和13號線(西二旗表示很淡定自如)

 

關於季節:

2月份是過去一年的高峯期,大量的人合同到期,也有大量的人重新簽約,這里涉及到無數個小家的遷入和遷出,無數個打包和解包,無數個的——重新開始!

 

經過一番折騰,新房也找好了,等着過陣子搬過去。總結之後,生活還是要繼續,也許還會在新家遇到老鼠,也一定會再隨着生活變遷而搬到其他地方,但在這次“折騰”里,我得以用另一個視角去看自己,看待我和羣體的關係,看待我們和這座城市的關係,以便更好的選擇我們的未來。

 

注意:

以上只是個人基於部分數據所得做的簡單分析,無法保證精確。

爬蟲應在不對目標服務器產生較大幹擾的情況下操作,可通過channel+time.Tick 進行主動限速。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章