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

一個爬蟲租房軟件。javascript

先上一個源代碼吧。php

https://github.com/answershuto/Rentalhtml

歡迎指導交流。java

效果圖

img

img

img

img


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

安裝node以及npm,用express模塊啓動服務,加入本身所須要的中間件便可,這個不是本文所要討論的重點,能夠參考網上的一些教程搭建環境。node


獲取導航頁URL以及數據

打開58同城主頁,我主要針對杭州的二手房進行了爬取分析,因此進入杭州租房。jquery

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=6git

能夠獲得這一串URL,上下頁查看後就不難發現,pn後面的數字就是頁面的頁碼,?後面的是一些get請求帶帶參數。用一個函數便可經過頁碼獲得正確的URL。github

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咱們就能夠訪問到每一頁的全部租房信息chrome

img


用cheerio模塊解析dom

安裝cheerio模塊,使用cheerio模塊解析dom,而後就能夠相似jquery同樣訪問dom了。express

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

獲取每一個租房信息的URL

打開開發者模式,osX(option + command + I),windows( F12 ),而後就能夠在elements中看到文檔結構了。(這裏以chrome爲例)

img

能夠看到對應的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訪問相應頁面,爬取數據

仍是先進入頁面打開開發者模式。

此次咱們須要解析房屋所在地信息,用來可視化顯示。

img

$('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:answershuto@gmail.com or answershuto@126.com

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

轉載請註明出處,謝謝。

歡迎關注個人公衆號

相關文章
相關標籤/搜索