運用node實現簡單爬蟲

林暉發表於2018-02-03

node.js的強大就無需再去重複了,越來越多的公司在使用node.js,還有一點不得不提的優勢就是node用的是javascript的語言,對於前端開發工程師來說,沒有理由不去get這一強大的技能。現在本人也是在學習階段,結合自己做的一些demo進行總結。今天給大家分享一下用node.js實現一個簡易的爬蟲,希望能和大家一起交流探討。

目標:

當在瀏覽器中訪問'http://localhost:3000'的時候,可以以json的形式輸出慕課網首頁的 部分熱門課程(本人偶爾會去慕課網上看一些學習的視訊)

步驟

1.新建一個資料夾,進去之後'npm init'(這個命令的作用就是幫我們互動式地生成一份 最簡單的 package.json 檔案,initinitialize 的意思,初始化。 )當一路回車並且填寫資訊完畢後會出現一個package.json檔案(首先需要在電腦上安裝node.js)。

2.安裝相應的依賴,在此例子中,需要用到的有cheerio,express,superagent。其中 express 是 Node.js 應用最廣泛的 web 框架,建議大家有時間可以多去官網看看其API,所以現在開始安裝依賴,通過命令cnpm i cheerio express superagent -S完成依賴的安裝。安裝完成後效果如下圖:

運用node實現簡單爬蟲
此時就完成了依賴的安裝,在package.json中的dependencies目錄下會有剛剛安裝的三個依賴

3.現在在資料夾裡建一個js檔案,比如取名為index.js,接下來就是在裡面寫程式碼,話不多說,直接上程式碼,在程式碼中也做了較為詳細的註釋。

//引入模組
var express = require('express');
var cheerio = require('cheerio');
var superagent = require('superagent');
// 呼叫 express 例項,它是一個函式,不帶引數呼叫時,會返回一個 express 例項,將這個變數賦予 app 變數。
var app = express();
// app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在這裡我們呼叫其中的 get 方法,為我們的 `/` 路徑指定一個 handler 函式。
// 這個 handler 函式會接收 req 和 res 兩個物件,他們分別是請求的 request 和 response。
// request 中包含了瀏覽器傳來的各種資訊,比如 query 啊,body 啊,headers 啊之類的,都可以通過 req 物件訪問到。
// res 物件,我們一般不從裡面取資訊,而是通過它來定製我們向瀏覽器輸出的資訊,比如 header 資訊,比如想要向瀏覽器輸出的內容。
//這裡我們呼叫了它的 #send 方法,向瀏覽器輸出一個字串。
app.get('/', function (req, res, next) {
  superagent.get('https://www.imooc.com/')
    .end(function (err, sres) {
      if (err) {
        return next(err);
      }
      // sres.text 裡面儲存著網頁的 html 內容,將它傳給 cheerio.load 之後
      // 就可以得到一個實現了 jquery 介面的變數,我們習慣性地將它命名為 `$`
      // 剩下就都是 jquery 的內容了
      var $ = cheerio.load(sres.text);
      var items = [];
      $('.banner-course-card .clearfix').each(function (idx, element) {
        var $element = $(element);
        items.push({
          title: $element.attr('title'),
          href: $element.attr('href')
        });
      });

      res.send(items);
      // 定義好我們 app 的行為之後,讓它監聽本地的 3000 埠。這裡的第二個函式是個回撥函式,
      //會在 listen 動作成功後執行,我們這裡執行了一個命令列輸出操作,告訴我們監聽動作已完成。
    });
});


app.listen(3000, function () {
  console.log('app is listening at port 3000');
});
複製程式碼

程式碼解釋:

通過請求得到網頁的html內容並儲存於sres.text中,再傳給cheerio.load,得到一個實現jquery介面的變數,然後就類似於jquery選擇器的方法對頁面的元素的查詢,拿到自己想要的資料即可。在定義好行為之後,讓它監聽本地的 3000 埠。這裡的第二個函式是個回撥函式,會在 listen 動作成功後執行,我們這裡執行了一個命令列輸出操作,告訴我們監聽動作已完成。

執行:

輸入命令 ' node index.js ' , 會看到列印出'app is listening at port 3000 ',如圖所示:

運用node實現簡單爬蟲

開啟瀏覽器,訪問'http://localhost:3000/',就可以看到我們爬蟲得來的資料哦,如下圖所示:

運用node實現簡單爬蟲

只是用了最基本的node實現了一個簡易的爬蟲效果,當然在這個例子中並沒有利用到node.js的非同步併發特性,待深入研究再做分享,希望和大家多多交流探討。

相關文章