node.js抓取并分析網(wǎng)頁(yè)內(nèi)容有無(wú)特殊內(nèi)容的js文件
nodejs獲取網(wǎng)頁(yè)內(nèi)容綁定data事件,獲取到的數(shù)據(jù)會(huì)分幾次相應(yīng),如果想全局內(nèi)容匹配,需要等待請(qǐng)求結(jié)束,在end結(jié)束事件里把累積起來(lái)的全局?jǐn)?shù)據(jù)進(jìn)行操作!
舉個(gè)例子,比如要在頁(yè)面中找有沒有www.baidu.com,不多說了,直接放代碼:
//引入模塊 var http = require("http"), fs = require('fs'), url = require('url'); //寫入文件,把結(jié)果寫入不同的文件 var writeRes = function(p, r) { fs.appendFile(p , r, function(err) { if(err) console.log(err); else console.log(r); }); }, //發(fā)請(qǐng)求,并驗(yàn)證內(nèi)容,把結(jié)果寫入文件 postHttp = function(arr, num) { console.log('第'+num+"條!") var a = arr[num].split(" - "); if(!a[0] || !a[1]) { return; } var address = url.parse(a[1]), options = { host : address.host, path: address.path, hostname : address.hostname, method: 'GET', headers: { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36' } } var req = http.request(options, function(res) { if (res.statusCode == 200) { res.setEncoding('UTF-8'); var data = ''; res.on('data', function (rd) { data += rd; }); res.on('end', function(q) { if(!~data.indexOf("www.baidu.com")) { return writeRes('./no2.txt', a[0] + '--' + a[1] + '\n'); } else { return writeRes('./has2.txt', a[0] + '--' + a[1] + "\n"); } }) } else { writeRes('./error2.txt', a[0] + '--' + a[1] + '--' + res.statusCode + '\n'); } }); req.on('error', function(e) { writeRes('./error2.txt', a[0] + '--' + a[1] + '--' + e + '\n'); }) req.end(); }, //讀取文件,獲取需要抓取的頁(yè)面 openFile = function(path, coding) { fs.readFile(path, coding, function(err, data) { var res = data.split("\n"); for (var i = 0, rl = res.length; i < rl; i++) { if(!res[i]) continue; postHttp(res, i); }; }) }; openFile('./sites.log', 'utf-8');
上面代碼大家可以看的懂吧,有哪里不清楚的朋友歡迎給我留言,具體的還要靠大家發(fā)揮應(yīng)用到實(shí)踐當(dāng)中。
下面給大家介紹Nodejs對(duì)于網(wǎng)頁(yè)抓取的能力
首先PHP。先說優(yōu)勢(shì):網(wǎng)上抓取和解析html的框架一抓一大把,各種工具直接拿來(lái)用就行了,比較省心。缺點(diǎn):首先速度/效率很成問題,有一次下載電影海報(bào)的時(shí)候,由于是crontab定期執(zhí)行,也沒做優(yōu)化,開的php進(jìn)程太多,直接把內(nèi)存撐爆了。然后語(yǔ)法方面也很拖沓,各種關(guān)鍵字 符號(hào) 太多,不夠簡(jiǎn)潔,給人一種沒有認(rèn)真設(shè)計(jì)過的感覺,寫起來(lái)很麻煩。
Node.js。優(yōu)點(diǎn)是效率、效率還是效率,由于網(wǎng)絡(luò)是異步的,所以基本如同幾百個(gè)進(jìn)程并發(fā)一樣強(qiáng)大,內(nèi)存和CPU占用非常小,如果沒有對(duì)抓取來(lái)的數(shù)據(jù)進(jìn)行復(fù)雜的運(yùn)算加工,那么系統(tǒng)的瓶頸基本就在帶寬和寫入MySQL等數(shù)據(jù)庫(kù)的I/O速度。當(dāng)然,優(yōu)點(diǎn)的反面也是缺點(diǎn),異步網(wǎng)絡(luò)代表你需要callback,這時(shí)候如果業(yè)務(wù)需求是線性了,比如必須等待上一個(gè)頁(yè)面抓取完成后,拿到數(shù)據(jù),才能進(jìn)行下一個(gè)頁(yè)面的抓取,甚至多層的依賴關(guān)系,那就會(huì)出現(xiàn)可怕的多層callback!基本這時(shí)候,代碼結(jié)構(gòu)和邏輯就會(huì)一團(tuán)亂麻。當(dāng)然可以用Step等流程控制工具解決這些問題。
最后說Python。如果你對(duì)效率沒有極端的要求,那么推薦用Python!首先,Python的語(yǔ)法很簡(jiǎn)潔,同樣的語(yǔ)句,可以少敲很多次鍵盤。然后,Python非常適合做數(shù)據(jù)的處理,比如函數(shù)參數(shù)的打包解包,列表解析,矩陣處理,非常方便。
相關(guān)文章
Node.js實(shí)現(xiàn)鏈?zhǔn)交卣{(diào)
這篇文章介紹了Node.js實(shí)現(xiàn)鏈?zhǔn)交卣{(diào)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(5):事件處理程序,本系列文章將一步一步創(chuàng)建一個(gè)完整的nodejs服務(wù)器,需要的朋友可以參考下2014-12-12從零學(xué)習(xí)node.js之詳解異步控制工具async(八)
sync是一個(gè)流程控制工具包,提供了直接而強(qiáng)大的異步功能?;贘avaScript為Node.js設(shè)計(jì),同時(shí)也可以直接在瀏覽器中使用。下面這篇文章主要介紹了node.js之異步控制工具async的相關(guān)資料,需要的朋友可以參考下。2017-02-02node.js中的fs.createWriteStream方法使用說明
這篇文章主要介紹了node.js中的fs.createWriteStream方法使用說明,本文介紹了fs.createWriteStream方法說明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12node.js使用express-fileupload中間件實(shí)現(xiàn)文件上傳
本文使用express作為服務(wù)端,使用express-fileupload庫(kù)提供的中間件函數(shù)來(lái)接受從客戶端傳來(lái)的圖片,并將圖片作為文件存儲(chǔ)在服務(wù)端,感興趣的可以了解一下2021-07-07