前言
本文給大家介紹的爬蟲將從網站爬取排名前幾的網站,具體前幾名可以具體設置,并分別爬取他們的主頁,檢查是否引用特定庫。下面話不多說了,來一起看看詳細的介紹:
所用到的node主要模塊
express 不用多說 request http模塊 cheerio 運行在服務器端的jQuery node-inspector node調試模塊 node-dev 修改文件后自動重啟app關于調試Node
在任意一個文件夾,執行node-inspector,通過打開特定頁面,在頁面上進行調試,然后運行app,使用node-dev app.js來自動重啟應用。
所碰到的問題
1. request請求多個頁面
由于請求是異步執行的,和分別返回3個頁面的數據,這里只爬取了50個網站,一個頁面有20個,所以有3頁,通過循環里套request請求,來實現。
通過添加請求頭可以實現基本的反爬蟲
處理數據的方法都寫在analyData()里面,造成后面的數據重復存儲了,想了很久,才想到一個解決方法,后面會寫到是怎么解決的。
for (var i = 1; i < len+1; i++) { (function(i){ var options = { url: 'http://www.alexa.cn/siterank/' + i, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' } }; request(options, function (err, response, body) { analyData(body,rank); }) })(i) }2. 多層回調
仔細觀察代碼,你會發現,處理數據的方法使用了如下的多層回調,也可以不使用回調,寫在一個函數內部;因為,每層都要使用上一層的數據,造成了這樣的寫法。
function f1(data1){ f2(data1);}function f2(data2){ f3(data2);}function f3(data3){ f4(data4);}3. 正則獲取JS庫
由于獲取頁面庫,首先需要獲取到script的src屬性,然后通過正則來實現字符串匹配。
<script src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/js/lib/jquery-1.10.2_d88366fd.js"></script>
獲取到的script可能是上面這樣的,由于庫名的命名真是各種各樣,后來想了一下,因為文件名是用.js結尾的,所以就以點號為結尾,然后把點號之前的字符截取下來,這樣獲得了庫名,代碼如下。
var reg = /[^////]+$/g;var libName = jsLink.match(reg).join('');var libFilter = libName.slice(0,libName.indexOf('.'));4.cheerio模塊獲取JS引用鏈接
這部分也花了一點時間,才搞定,cheerio獲取DOM的方法和jQuery是一樣的,需要對返回的DOM對象進行查看,就可以看到對象里隱藏好深的href屬性,方法大同小異,你也可以使用其他選擇器,選擇到script標簽
var $ = cheerio.load(body);var scriptFile = $('script').toArray();scriptFile.forEach(function(item,index){ if (item.attribs.src != null) { obtainLibName(item.attribs.src,index);}
新聞熱點
疑難解答
圖片精選