nodejs爬蟲實戰(一):抽屜新熱榜

什麼是nodeJs

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開源庫生態系統。css

開啓咱們的第一個nodejs項目

首先能夠去nodejs官網來下載nodejs並安裝http://nodejs.cn/
安裝完成後,經過npm來安裝咱們的express框架 npm install express --savehtml

//app.js
//引入 `express` 模塊
var express = require('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){
  res.send('hello world');
})

// 定義好咱們 app 的行爲以後,讓它監聽本地的 3000 端口。這裏的第二個函數是個回調函數,會在 listen 動做成功後執行,咱們這裏執行了一個命令行輸出操做,告訴咱們監聽動做已完成。
app.listen(3000, function () {
  console.log('app is listening at port 3000');
});

運行 node app.js 而且訪問http://localhost:3000/便可看到 hello worldnode

clipboard.png

爬蟲依賴

所謂 工欲善其事必先利其器,完成nodejs爬蟲還須要加兩個庫:
superagent(http://visionmedia.github.io/superagent/ ) 是個 http 方面的庫,能夠發起 get 或 post 請求。
cheerio(https://github.com/cheeriojs/cheerio ) 你們能夠理解成一個 Node.js 版的 jquery,用來從網頁中以 css selector 取數據,使用方式跟 jquery 同樣同樣的。
分別安裝npm install superagent --save npm install cheerio --savejquery

抓取抽屜新熱榜數據

先從簡單的開始,咱們來以抽屜新熱榜爲例子。訪問 http://dig.chouti.com/,經過瀏覽器的調試器來看抽屜的dom結構,能夠看到.part2的類上有用於分享的屬性,咱們就能夠直接經過jquery的語法來讀取標題,圖片和超連接這幾個屬性git

clipboard.png
能夠看到新熱榜數據都在 id爲'content-list'的div中,因而咱們展開content-list來繼續查看數據github

clipboard.png
發現有個class爲'part2'的div裏面有 shareexpress

app.js
//引入 `express` 模塊
var express = require('express');
//引入 `superagent` 庫
var superagent = require('superagent');
//引入 `cheerio` 庫
var cheerio = require('cheerio');
//調用 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 去抓取 http://dig.chouti.com/ 的內容
  superagent.get('http://dig.chouti.com/')
    .end(function (err, sres) {
      // 常規的錯誤處理
      if (err) {
        return next(err);
      }
      // sres.text 裏面存儲着網頁的 html 內容,將它傳給 cheerio.load 以後
      // 就能夠獲得一個實現了 jquery 接口的變量,咱們習慣性地將它命名爲 `$`
      // 剩下就都是 jquery 的內容了
      var $ = cheerio.load(sres.text);
      var items = [];
      $('#content-list .part2').each(function (idx, element) {
        var $element = $(element);
        items.push({
          title: $element.attr('share-title'),
          href: $element.attr('href'),
          img: $element.attr('share-pic')
        });
      });

      res.send(items);
    });
});

// 定義好咱們 app 的行爲以後,讓它監聽本地的 3000 端口。這裏的第二個函數是個回調函數,會在 listen 動做成功後執行,咱們這裏執行了一個命令行輸出操做,告訴咱們監聽動做已完成。
app.listen(3000, function () {
  console.log('app is listening at port 3000');
});

運行 node app.js 訪問: http://localhost:3000/,能夠看到抓取的數據直接以json格式顯示出來了。npm

clipboard.png

相關文章
相關標籤/搜索