養只爬蟲當寵物(Node.js 爬蟲爬取 58 同城租房資訊)

養只爬蟲當寵物(Node.js 爬蟲爬取 58 同城租房資訊)

一個爬蟲租房軟體。

先上一個原始碼吧。

https://github.com/answershuto/Rental

歡迎指導交流。

效果圖


搭建Node.js環境及啟動服務

安裝node以及npm,用express模組啟動服務,加入自己所需要的中介軟體即可,這個不是本文所要討論的重點,可以參考網上的一些教程搭建環境。


獲取導航頁URL以及資料

開啟58同城主頁,我主要針對杭州的二手房進行了爬取分析,所以進入杭州租房。

http://hz.58.com/chuzu/pn1/?key=%E6%9D%AD%E5%B7%9E%E7%A7%9F%E6%88%BF%E5%AD%90&cmcskey=%E7%A7%9F%E6%88%BF%E5%AD%90&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6

可以得到這一串URL,上下頁檢視後就不難發現,pn後面的數字就是頁面的頁碼,?後面的是一些get請求帶帶引數。用一個函式即可通過頁碼得到正確的URL。

function getUrl(page = 1){
return  'http://hz.58.com/chuzu/pn' page '/?key=%E6%9D%AD%E5%B7%9E%E7%A7%9F%E6%88%BF%E5%AD%90&cmcskey=%E7%A7%9F%E6%88%BF%E5%AD%90&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6';
}

根據上面的URL我們就可以訪問到每一頁的所有租房資訊


用cheerio模組解析dom

安裝cheerio模組,使用cheerio模組解析dom,然後就可以類似jquery一樣訪問dom了。

var cheerio = require('cheerio');
let $ = cheerio.load(html);


獲取每個租房資訊的URL

開啟開發者模式,osX(option command I),windows( F12 ),然後就可以在elements中看到文件結構了。(這裡以chrome為例)

可以看到對應的a標籤,我們只需要提取出該url即可,及對應的href,就是它點選跳轉的URL。

<a href="http://jump.jinpai.58.com/service?target=INKicKZPP1UEhIHuBQyP3HVk6MOpffA1WNsEqTYuc2Gxa8zCQdEBOnSPwy7LRseGN-7sgB3XvvZTQ9JsSXvXBXOVP5s7-iWzO-jZ_WBRroCl_ZiBHb5v6-MxytthrUmoPF7B-ffISZByBLAX8fznJUcUsuV6KVKc9zyglbYlX_Ws57NkdXRy7vg4euiIN6TsyENc8bJRhqs&amp;local=79&amp;pubid=4204776&amp;version=A&amp;psid=179352405193657452887456131&amp;entinfo=27800613387971_0&amp;apptype=0 " target="_blank" class="t" onclick="clickLog('from=fcpc_zflist_gzcount');">[單間]支援月付 文一路梧桐公寓 耀江文萃苑 中豪晴元</a>

該a標籤的class為t,用$(‘a.t’)即可得到所有的a標籤的物件,得到的是一個陣列,遍歷取出href屬性即可。

for(let i = 0; i < $('a.t').length; i  ){
rentalObj.add($('a.t')[i].attribs.href)
}

得到了這些URL,接下來就可以用這些URL訪問具體的租房資訊了,每個URL對應一個租房頁面。

根據租房資訊的URL訪問相應頁面,爬取資料

還是先進入頁面開啟開發者模式。

這次我們需要解析房屋所在地資訊,用來視覺化顯示。

$('td.house-xqxq-content a.ablue')

加上父標籤可以過濾出更有針對性的dom,此時過濾出的是小區名稱、本月均價、所在商圈等資訊的dom,我們現在只需要第一個dom裡面的資料,所以訪問陣列的[0]即可。

除此之外為還需要頁面裡面的一張展示房屋資訊的一張圖片,找到對應dom可以發現id為smainPic。

$('#smainPic')['0'].attribs.src

這樣訪問即可得到圖片的URL。

其他我們還可以用同樣的方法獲取很多相關資料,比如$(‘.house-price’).text()得到價格資料,$(‘span.tel-num.tel-font’).text()可以得到房東的聯絡方式。

通過百度地圖進行視覺化展示

這裡使用百度地圖api
http://lbsyun.baidu.com/index.php?title=jspopular

var map = new BMap.Map("container");          // 建立地圖例項  
map.centerAndZoom("杭州", 12);
var localSearch = new BMap.LocalSearch(map);
localSearch.setSearchCompleteCallback(function(searchResult){
var poi = searchResult.getPoi(0);/*地理位置資訊*/
})
ocalSearch.search(params[url].location);

獲取經緯度以後再掉用相應的api在地圖上顯示即可,顯示後再做什麼效果,可自行發揮想象了。

關於反爬蟲

在爬取過程中發現58同城的反爬蟲策略,快速訪問會讓你輸入驗證碼來驗證是人在操作而不是程式碼訪問。只要是人可以正常訪問並不影響使用者正常體驗的網站都有辦法繞過反爬蟲策略。

先採用較慢的方式傳送http請求訪問,此外每隔一段時間最好停一下,然後再繼續訪問。除此之外用User-Agent欄位偽裝成瀏覽器。最保險的方法就是購買代理,讓代理用不同的ip地址去訪問網站,即可繞過反爬蟲機制。

具體做法可以參照相關反爬蟲策略的文章。

關於

作者:染陌

Email:[email protected] or [email protected]

Github: https://github.com/answershuto

Blog:http://answershuto.github.io/

知乎專欄:https://zhuanlan.zhihu.com/ranmo

掘金: https://juejin.im/user/58f87ae844d9040069ca7507

osChina:https://my.oschina.net/u/3161824/blog

轉載請註明出處,謝謝。

歡迎關注我的公眾號