源碼地址:https://github.com/liguobao/58HouseSearch
在線地址:58公寓高德搜房(全國版):http://codelover.link:8080/
周末閑着無事刷知乎發現一個爬蟲教程(高德API+Python解決租房問題
),正中最近想要換地方住的痛點。然后大早上懶覺都沒睡就屁顛屁顛開始研究這個教程了。這樣教程在實驗樓網站里面有手把手步驟,有興趣自取(實驗樓:高德API+Python解決租房問題)。
整體項目主要分成兩步:
第一步:python爬取數據,生成數據文件;
第二部:導入數據文件,在地圖上顯示房源,設定上班地點后自動計算出行路線和路程時間。
研究了一下這個教程之后發現這貨做得實在有點粗糙,只能當教程用,完全沒有通用實際價值。
而且這里面還有個更大的問題:教程是基於北京的數據來做的,而我在上海…
雖然說改改python數據源,改改導航頁面JS完事。不過是在難用…
於是,開始自己動手了。先看原有的python代碼。
1 |
|
整個代碼基本思路就是,爬取http://bj.58.com/pinpaigongyu/pn/{page}/?minprice=2000_4000頁面數據,然后扔到創建的csv文件里面作為下一步的數據源。
通過研究http://bj.58.com/pinpaigongyu/pn/{page}/?minprice=2000_4000這個頁面的數據,我們可以很容易發現,在頁面中,每條數據都是一個li標簽。
如下圖:
li結構如下:
1 |
<li logr="" class=""> |
照着python的思路,是把所有的li標簽的數據提取出來的。
我自己研究的時候又看了下,其實數據都在一個屬性為tongji_label=”listclick”的a標簽里面。
一般來說,字符匹配用正則表達式完事,奈何正則水平實在不佳。我還是選擇直接上HtmlAgilityPack算了。
關於HtmlAgilityPack的介紹還是看官網算了。HtmlAgilityPack
HtmlAgilityPack是.NET一個比較強大的HTML處理類庫了,基本可以讓你像JS來操作HTML標簽。
安裝這貨很簡單,直接在Nuget PM包管理工具里面輸入下面命令就完事了。
1 |
Install-Package HtmlAgilityPack |
有需要使用教程可以看這個:Html Agility Pack基礎類介紹及運用
下面直接貼control源碼算了。
1 |
/// </summary> |
下面解釋一下核心代碼。
片段一:獲取總數。
在觀察58同城頁面的時候,無意發現其實第一個加載的頁面中有一個數據總條數,隱藏在頁面里面的。
1 |
<span class="listsum"><em>1813</em>條結果</span> |
這樣一來,總頁面就很清晰了。頁面=總數/每頁20條。然后我們根據已知的數據規則去循環請求頁面,也就能拿到所有的搜索數據了。
核心代碼,獲取總條數。
1 |
var countNodes = htmlDoc.DocumentNode. |
在HTMLDoc里面找到一個span的class包含list的節點,獲取它子節點(即em)的內容,強制轉換成數字,也就是我們要找的總條數了。總條數除以20就得到了頁數,下面就是開始循環請求頁面了。
在最上面我們分析過公寓數據分布,數據是li里面套a標簽,我們需要的地理位置、房間名稱、價格都在a標簽里面。
這樣一來,我們這要獲得到頁面所有帶有屬性為tongji_label=”listclick”的a標簽數據,也就得到了我們所有需要的數據。
看一下a標簽的數據組成:
1 |
|
我們要的房間信息在一個h2的標簽里面,公寓租金價錢在class=”money”的div標簽里面。
於是有了一下代碼:
1 |
|
后端來說,基本就這些內容了。
還有一些前端高德地圖接口調用下次再講吧,要陪女票玩游戲去了…
^-^