建立一個(gè) lesson3 項(xiàng)目,在其中編寫代碼。
當(dāng)在瀏覽器中訪問 http://localhost:3000/
時(shí),輸出 CNode(https://cnodejs.org/ ) 社區(qū)首頁的所有帖子標(biāo)題和鏈接,以 json 的形式。
輸出示例:
[
{
"title": "【公告】發(fā)招聘帖的同學(xué)留意一下這里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12"
},
{
"title": "發(fā)布一款 Sublime Text 下的 JavaScript 語法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f"
}
]
訪問 http://localhost:3000/
時(shí),輸出包括主題的作者,
示例:
[
{
"title": "【公告】發(fā)招聘帖的同學(xué)留意一下這里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
"author": "alsotang"
},
{
"title": "發(fā)布一款 Sublime Text 下的 JavaScript 語法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
"author": "otheruser"
}
]
Node.js 總是吹牛逼說自己異步特性多么多么厲害,但是對(duì)于初學(xué)者來說,要找一個(gè)能好好利用異步的場(chǎng)景不容易。我想來想去,爬蟲的場(chǎng)景就比較適合,沒事就異步并發(fā)地爬幾個(gè)網(wǎng)站玩玩。
本來想教大家怎么爬 github 的 api 的,但是 github 有 rate limit 的限制,所以只好犧牲一下 CNode 社區(qū)(國(guó)內(nèi)最專業(yè)的 Node.js 開源技術(shù)社區(qū)),教大家怎么去爬它了。
我們這回需要用到三個(gè)依賴,分別是 express,superagent 和 cheerio。
先介紹一下,
superagent(http://visionmedia.github.io/superagent/ ) 是個(gè) http 方面的庫,可以發(fā)起 get 或 post 請(qǐng)求。
cheerio(https://github.com/cheeriojs/cheerio ) 大家可以理解成一個(gè) Node.js 版的 jquery,用來從網(wǎng)頁中以 css selector 取數(shù)據(jù),使用方式跟 jquery 一樣一樣的。
還記得我們?cè)趺葱陆ㄒ粋€(gè)項(xiàng)目嗎?
npm init
npm install --save PACKAGE_NAME
我們應(yīng)用的核心邏輯長(zhǎng)這樣
app.get('/', function (req, res, next) {
// 用 superagent 去抓取 https://cnodejs.org/ 的內(nèi)容
superagent.get('https://cnodejs.org/')
.end(function (err, sres) {
// 常規(guī)的錯(cuò)誤處理
if (err) {
return next(err);
}
// sres.text 里面存儲(chǔ)著網(wǎng)頁的 html 內(nèi)容,將它傳給 cheerio.load 之后
// 就可以得到一個(gè)實(shí)現(xiàn)了 jquery 接口的變量,我們習(xí)慣性地將它命名為 `$`
// 剩下就都是 jquery 的內(nèi)容了
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,一個(gè)簡(jiǎn)單的爬蟲就是這么簡(jiǎn)單。這里我們還沒有利用到 Node.js 的異步并發(fā)特性。不過下兩章內(nèi)容都是關(guān)于異步控制的。
記得好好看看 superagent 的 API,它把鏈?zhǔn)秸{(diào)用的風(fēng)格玩到了極致。
更多建議: