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

HaroldStain 8年前發布 | 18K 次閱讀 Node.js Node.js 開發

什么是nodeJs

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

開啟我們的第一個nodejs項目

首先可以去nodejs官網來下載nodejs并安裝 http://nodejs.cn/

安裝完成后,通過npm來安裝我們的express框架 npm install express --save 。

//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'); }); </code></pre>

運行 node app.js 并且訪問 http://localhost:3000/ 即可看到 hello world

爬蟲依賴

所謂 工欲善其事必先利其器,完成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 --save 。

抓取抽屜新熱榜數據

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

可以看到新熱榜數據都在 id為'content-list'的div中,于是我們展開content-list來繼續查看數據

發現有個class為'part2'的div里面有 share

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('$ // 剩下就都是 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'); }); </code></pre>

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

 

來自: https://segmentfault.com/a/1190000005343112

 

 本文由用戶 HaroldStain 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!