node爬蟲實(shí)踐總結(jié)
網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬維網(wǎng)信息的程序或者腳本。
隨著web2.0時(shí)代的到來,數(shù)據(jù)的價(jià)值愈發(fā)體現(xiàn)出來。無論是在目前火熱的人工智能方向,還是在產(chǎn)品側(cè)的用戶需求分析,都需要獲取到大量的數(shù)據(jù),而網(wǎng)絡(luò)爬蟲作為一種技術(shù)手段,在不違反主體網(wǎng)站基本要求的情況下是獲取數(shù)據(jù)成本最低的手段。與此同時(shí),爬蟲技術(shù)也飛速發(fā)展。
了解爬蟲,首先要了解一個(gè)君子協(xié)議。

robot.txt協(xié)議
該協(xié)議是搜索引擎從業(yè)者和網(wǎng)站站長(zhǎng)通過郵件討論定下的,有幾個(gè)重要的特點(diǎn):
robot.txt協(xié)議是蜘蛛訪問網(wǎng)站的開關(guān),決定蜘蛛可以抓取哪些內(nèi)容,不可以抓取哪些內(nèi)容。
robot.txt是指網(wǎng)站與搜索引擎之間的協(xié)議
存放在網(wǎng)站根目錄網(wǎng)站服務(wù)器的根目錄下
nodejs爬蟲
一提到爬蟲,我們可能很容易聯(lián)想到python,python由于其語法容易上手,操作數(shù)據(jù)簡(jiǎn)潔方便成為爬蟲界的龍頭,scrapy框架更是只用簡(jiǎn)單配置,按照其語法規(guī)范就能夠輕松獲取到網(wǎng)站內(nèi)容。但是作為前端開發(fā),獲取數(shù)據(jù)就不可能了嗎?當(dāng)然不是,隨著nodejs的出現(xiàn),npm社區(qū)的火熱,nodejs所提供的功能日漸強(qiáng)大,由于nodejs單線程支持高并發(fā)的特性,我們不必要將注意力過多放在線程之間的同步與通信,在加上JavaScript本身與html之間的緊密聯(lián)系,使用nodejs進(jìn)行網(wǎng)絡(luò)爬蟲也是很好的實(shí)踐。
node爬蟲工具
俗話說工欲善其事必先利其器,爬蟲從根上說就是四個(gè)模塊,網(wǎng)頁下載器、網(wǎng)頁解析器、URL調(diào)度器、內(nèi)容輸出器。
npm社區(qū)中為我們提供了很多有用的模塊,接下來分別介紹下網(wǎng)絡(luò)請(qǐng)求模塊、解析模塊以及流程處理模塊。
網(wǎng)絡(luò)請(qǐng)求模塊
SuperAgent
SuperAgent 是一個(gè)輕量級(jí)、靈活的、易讀的、低學(xué)習(xí)曲線的客戶端請(qǐng)求代理模塊,其使用極其簡(jiǎn)單,支持鏈?zhǔn)秸{(diào)用,可以很容易就封裝成Promise或者async函數(shù)。
async function getOuterUrls(url) {
return new Promise((resolve, reject) => {
superagent.get(url)
.end((err, docs) => {
if(err) {
return reject(err);
}
// 成功解析
resolve(items);
})
})
}
request
request的使用也非常簡(jiǎn)單,request的設(shè)計(jì)是讓http請(qǐng)求變得容易。
const request = require('request');
request('您的請(qǐng)求url', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // 請(qǐng)求成功的處理邏輯
}
});
那么兩者有什么區(qū)別呢,從npm社區(qū)中的統(tǒng)計(jì)量可以看出,request的周下載量有千萬級(jí),而superagent也有百萬。superagent特別適合剛學(xué)爬蟲的新手操作,請(qǐng)求中需要發(fā)送的參數(shù)以及請(qǐng)求頭通過set直接設(shè)置。作者認(rèn)為Request最強(qiáng)大的功能在于其CookieJar的功能,它能夠保存每一次請(qǐng)求的cookie,讓我們的請(qǐng)求和在瀏覽器中點(diǎn)擊一樣,我們甚至不用去設(shè)置每一次的cookie,他會(huì)根據(jù)請(qǐng)求的主機(jī)域從jar中自動(dòng)匹配與實(shí)時(shí)更新。
const cookieColl = Request.jar();
const request = Request.defaults({jar: cookieColl});
資源解析模塊
cheerio
我們都知道大名鼎鼎的jQuery,它提供了便捷輕量的dom操作語法。而cheerio是nodejs中的jQuery,上手方便,相比于xml解析的xpath簡(jiǎn)直好用一萬倍。如果你熟悉jQuery,那么cheerio就能很容易玩轉(zhuǎn)。
let $ = cheerio.load(docs.text);
let items = [];
$('#topic_list .topic_title').each((index, ele) => {
let element = $(ele);
items.push(Url.resolve(baseUrl, element.attr('href')))
})
jsdom
JSDOM的目標(biāo)是提供與瀏覽器一樣的DOM環(huán)境

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`Hello world
`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"
jsdom相比于cheerio解析速度會(huì)稍慢,但是從npm社區(qū)的下載量來說,jsdom是cheerio的兩倍,jsdom提供了其他豐富的功能,后續(xù)有待繼續(xù)挖掘。
本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請(qǐng)?jiān)谖闹凶⒚鱽碓醇白髡呙帧?/p>
免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)及時(shí)與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com





