背景
春節過後回京,本想好好休息兩天結果家裏迎來了不速之客——老鼠。最後通過一系列的操作終於成功捕獲一家 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 進行主動限速。