《使用 superagent 與 cheerio 完成簡單爬蟲》
目標
建立一個 lesson3 項目辣垒,在其中編寫代碼错负。
當在瀏覽器中訪問 http://localhost:3000/
時玩敏,輸出 CNode(https://cnodejs.org/ ) 社區(qū)首頁的所有帖子標題和鏈接师抄,以 json 的形式二拐。
輸出示例:
[
{
"title": "【公告】發(fā)招聘帖的同學留意一下這里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12"
},
{
"title": "發(fā)布一款 Sublime Text 下的 JavaScript 語法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f"
}
]
挑戰(zhàn)
訪問 http://localhost:3000/
時驰吓,輸出包括主題的作者,
示例:
[
{
"title": "【公告】發(fā)招聘帖的同學留意一下這里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
"author": "alsotang"
},
{
"title": "發(fā)布一款 Sublime Text 下的 JavaScript 語法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
"author": "otheruser"
}
]
知識點
- 學習使用 superagent 抓取網(wǎng)頁
- 學習使用 cheerio 分析網(wǎng)頁
課程內容
Node.js 總是吹牛逼說自己異步特性多么多么厲害履腋,但是對于初學者來說珊燎,要找一個能好好利用異步的場景不容易。我想來想去遵湖,爬蟲的場景就比較適合悔政,沒事就異步并發(fā)地爬幾個網(wǎng)站玩玩。
本來想教大家怎么爬 github 的 api 的延旧,但是 github 有 rate limit 的限制谋国,所以只好犧牲一下 CNode 社區(qū)(國內最專業(yè)的 Node.js 開源技術社區(qū)),教大家怎么去爬它了迁沫。
我們這回需要用到三個依賴芦瘾,分別是 express,superagent 和 cheerio集畅。
先介紹一下近弟,
superagent(http://visionmedia.github.io/superagent/ ) 是個 http 方面的庫,可以發(fā)起 get 或 post 請求挺智。
cheerio(https://github.com/cheeriojs/cheerio ) 大家可以理解成一個 Node.js 版的 jquery祷愉,用來從網(wǎng)頁中以 css selector 取數(shù)據(jù),使用方式跟 jquery 一樣一樣的赦颇。
還記得我們怎么新建一個項目嗎二鳄?
- 新建一個文件夾,進去之后
npm init
- 安裝依賴
npm install --save PACKAGE_NAME
- 寫應用邏輯
我們應用的核心邏輯長這樣
app.get('/', function (req, res, next) {
// 用 superagent 去抓取 https://cnodejs.org/ 的內容
superagent.get('https://cnodejs.org/')
.end(function (err, sres) {
// 常規(guī)的錯誤處理
if (err) {
return next(err);
}
// sres.text 里面存儲著網(wǎng)頁的 html 內容媒怯,將它傳給 cheerio.load 之后
// 就可以得到一個實現(xiàn)了 jquery 接口的變量订讼,我們習慣性地將它命名為 `$`
// 剩下就都是 jquery 的內容了
var $ = cheerio.load(sres.text);
var items = [];
$('#topic_list .topic_title').each(function (idx, element) {
var $element = $(element);
items.push({
title: $element.attr('title'),
href: $element.attr('href')
});
});
res.send(items);
});
});
OK,一個簡單的爬蟲就是這么簡單沪摄。這里我們還沒有利用到 Node.js 的異步并發(fā)特性躯嫉。不過下兩章內容都是關于異步控制的纱烘。
記得好好看看 superagent 的 API,它把鏈式調用的風格玩到了極致祈餐。