鍍金池/ 教程/ HTML/ 使用 superagent 與 cheerio 完成簡(jiǎn)單爬蟲
瀏覽器端測(cè)試:mocha,chai,phantomjs
搭建 Node.js 開發(fā)環(huán)境
測(cè)試用例:mocha,should,istanbul
線上部署:heroku
Mongodb 與 Mongoose 的使用
使用 superagent 與 cheerio 完成簡(jiǎn)單爬蟲
js 中的那些最佳實(shí)踐
使用 eventproxy 控制并發(fā)
使用 promise 替代回調(diào)函數(shù)
作用域與閉包:this,var,(function () {})
持續(xù)集成平臺(tái):travis
測(cè)試用例:supertest
benchmark 怎么寫
使用 async 控制并發(fā)
學(xué)習(xí)使用外部模塊
一個(gè)最簡(jiǎn)單的 express 應(yīng)用
正則表達(dá)式
cookie 和 session

使用 superagent 與 cheerio 完成簡(jiǎn)單爬蟲

目標(biāo)

建立一個(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"
  }
]

挑戰(zhàn)

訪問 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"
  }
]

知識(shí)點(diǎn)

  1. 學(xué)習(xí)使用 superagent 抓取網(wǎng)頁
  2. 學(xué)習(xí)使用 cheerio 分析網(wǎng)頁

課程內(nèi)容

Node.js 總是吹牛逼說自己異步特性多么多么厲害,但是對(duì)于初學(xué)者來說,要找一個(gè)能好好利用異步的場(chǎng)景不容易。我想來想去,爬蟲的場(chǎng)景就比較適合,沒事就異步并發(fā)地爬幾個(gè)網(wǎng)站玩玩。

本來想教大家怎么爬 github 的 api 的,但是 github 有 rate limit 的限制,所以只好犧牲一下 CNode 社區(qū)(國內(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)目嗎?

  1. 新建一個(gè)文件夾,進(jìn)去之后 npm init
  2. 安裝依賴 npm install --save PACKAGE_NAME
  3. 寫應(yīng)用邏輯

我們應(yī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)格玩到了極致。