Node.js Request+Cheerio實現(xiàn)一個小爬蟲-基礎(chǔ)功能實現(xiàn)1:內(nèi)容抓取
Node.js Request+Cheerio實現(xiàn)一個小爬蟲-基礎(chǔ)功能實現(xiàn)2:文件寫入
Node.js Request+Cheerio實現(xiàn)一個小爬蟲-基礎(chǔ)功能實現(xiàn)3:流程控制及并發(fā)控制
Node.js Request+Cheerio實現(xiàn)一個小爬蟲-番外篇:代理設(shè)置
前段時間杠步,正好有一個做爬蟲的小任務(wù)贴唇。因為一直都是用js再加之Node.js的崛起容贝,就打算使用Node來完成這個任務(wù)谆膳。自然缸濒,在實現(xiàn)的過程中也遇到了許多問題此虑。所以就打算寫出來當作是回顧和整理阔拳。
既然是爬蟲纱烘,那么自然要和http的request, get, post 這一些方法相關(guān)了。至于這些知識哗脖,可以請教谷鴿或者度娘瀑踢。除了http相關(guān)的知識,對于抓取到的內(nèi)容才避,我們就需要進行提取橱夭,提取可以使用萬能的正則表達式當然也可以使用node豐富的包了。下面就是這一次小項目中用到的node的包了桑逝。
利用到的包
Request
Request 模塊是一個用起來十分方便的 http 模塊棘劣。具體的用法可以參照官方的GitHub主頁。
官方主頁Cheerio
Cheerio 是一個可以使用 jQuery語法來對獲取內(nèi)容進行提取的一個模塊楞遏。尤其是對于從網(wǎng)頁上抓取的的東西茬暇。因為采用和jQuery一樣的語法,所以特別適合前端來使用寡喝。
官方主頁
介紹了包和模塊之后糙俗,那么就可以動手試一試了。那么下面就上代碼吧预鬓!
const request = require('request');
const cheerio = require('cheerio');
var shopLists = [];
var option = {
url: url,
// 不加入headers的話很可能會被拒絕訪問
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
};
request(option, function(error, response, body) {
if (!error && response.statusCode == 200) {
// 使用Cheerio對抓取到的內(nèi)容進行解析
var $ = cheerio.load(body, {
ignoreWhitespace: true,
xmlMode: true
});
var shopInfo = {
pageNo: option.url.match(/g\d+p(\d+)/)[1],
pageURL: option.url,
info: []
};
var shopList = $('div#shop-all-list').find('a[data-hippo-type = "shop"]');
shopList.each(function(no, shop) {
let info = {};
info.no = no + 1;
info.name = $(shop).attr('title');
info.url = $(shop).attr('href');
shopInfo.info.push(info);
});
shopLists.push(shopInfo);
}
});
這樣以來就可以抓取到想要的網(wǎng)站內(nèi)容了巧骚。當然,問題自然是解決一個又來一個的格二。既然抓到了內(nèi)容网缝,就總想要保存到一個地方去。就以保存到本地為例蟋定,于是我們可以利用到Node自帶的fs模塊來進行文件的讀取。fs模塊的使用方法草添,就還請參照官方文檔或者向谷鴿度娘請教啦驶兜。
const fs = require('fs');
...
// 剛才的爬蟲代碼
...
fs.writeFile(FILE_PATH + FILE_NAME, shopLists, 'utf-8', function(err) {
if (err) {
console.error("文件生成時發(fā)生錯誤.");
throw err;
}
console.info('文件已經(jīng)成功生成.');
});
好了,看似是解決了一個問題远寸。那么到底行不行還是需要經(jīng)過實踐的抄淑。跑一下,問題果然出現(xiàn)了驰后。文件是0件肆资,那么是怎么回事呢?就在下一篇文章中解決吧灶芝。