生活随笔
收集整理的這篇文章主要介紹了
nodejs爬虫实战(一):抽屉新热榜
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
什么是nodeJs
Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開源庫生態(tài)系統(tǒng)。
開啟我們的第一個(gè)nodejs項(xiàng)目
首先可以去nodejs官網(wǎng)來下載nodejs并安裝http://nodejs.cn/。
安裝完成后,通過npm來安裝我們的express框架 npm install express --save。
//app.js
//引入 `express` 模塊
var express = require('express');//調(diào)用 express 實(shí)例并將這個(gè)變量賦予 app 變量。
var app = express();// app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在這里我們調(diào)用其中的 get 方法,為我們的 `/` 路徑指定一個(gè) handler 函數(shù)。
// 這個(gè) handler 函數(shù)會(huì)接收 req 和 res 兩個(gè)對(duì)象,他們分別是請(qǐng)求的 request 和 response。
// request 中包含了瀏覽器傳來的各種信息,比如 query 啊,body 啊,headers 啊之類的,都可以通過 req 對(duì)象訪問到。
// res 對(duì)象,我們一般不從里面取信息,而是通過它來定制我們向?yàn)g覽器輸出的信息,比如 header 信息,比如想要向?yàn)g覽器輸出的內(nèi)容。這里我們調(diào)用了它的 #send 方法,向?yàn)g覽器輸出一個(gè)字符串。
app.get('/',function(req,res){res.send('hello world');
})// 定義好我們 app 的行為之后,讓它監(jiān)聽本地的 3000 端口。這里的第二個(gè)函數(shù)是個(gè)回調(diào)函數(shù),會(huì)在 listen 動(dòng)作成功后執(zhí)行,我們這里執(zhí)行了一個(gè)命令行輸出操作,告訴我們監(jiān)聽動(dòng)作已完成。
app.listen(3000, function () {console.log('app is listening at port 3000');
});
運(yùn)行 node app.js 并且訪問http://localhost:3000/即可看到 hello world
爬蟲依賴
所謂 工欲善其事必先利其器,完成nodejs爬蟲還需要加兩個(gè)庫:
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 一樣一樣的。
分別安裝npm install superagent --save npm install cheerio --save。
抓取抽屜新熱榜數(shù)據(jù)
先從簡單的開始,我們來以抽屜新熱榜為例子。訪問 http://dig.chouti.com/,通過瀏覽器的調(diào)試器來看抽屜的dom結(jié)構(gòu),可以看到.part2的類上有用于分享的屬性,我們就可以直接通過jquery的語法來讀取標(biāo)題,圖片和超鏈接這幾個(gè)屬性
可以看到新熱榜數(shù)據(jù)都在 id為'content-list'的div中,于是我們展開content-list來繼續(xù)查看數(shù)據(jù)
發(fā)現(xiàn)有個(gè)class為'part2'的div里面有 share
app.js
//引入 `express` 模塊
var express = require('express');
//引入 `superagent` 庫
var superagent = require('superagent');
//引入 `cheerio` 庫
var cheerio = require('cheerio');
//調(diào)用 express 實(shí)例并將這個(gè)變量賦予 app 變量。
var app = express();// app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在這里我們調(diào)用其中的 get 方法,為我們的 `/` 路徑指定一個(gè) handler 函數(shù)。
// 這個(gè) handler 函數(shù)會(huì)接收 req 和 res 兩個(gè)對(duì)象,他們分別是請(qǐng)求的 request 和 response。
// request 中包含了瀏覽器傳來的各種信息,比如 query 啊,body 啊,headers 啊之類的,都可以通過 req 對(duì)象訪問到。
// res 對(duì)象,我們一般不從里面取信息,而是通過它來定制我們向?yàn)g覽器輸出的信息,比如 header 信息,比如想要向?yàn)g覽器輸出的內(nèi)容。這里我們調(diào)用了它的 #send 方法,向?yàn)g覽器輸出一個(gè)字符串。
app.get('/', function (req, res, next) {// 用 superagent 去抓取 http://dig.chouti.com/ 的內(nèi)容superagent.get('http://dig.chouti.com/').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 = [];$('#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 的行為之后,讓它監(jiān)聽本地的 3000 端口。這里的第二個(gè)函數(shù)是個(gè)回調(diào)函數(shù),會(huì)在 listen 動(dòng)作成功后執(zhí)行,我們這里執(zhí)行了一個(gè)命令行輸出操作,告訴我們監(jiān)聽動(dòng)作已完成。
app.listen(3000, function () {console.log('app is listening at port 3000');
});
運(yùn)行 node app.js 訪問: http://localhost:3000/,可以看到抓取的數(shù)據(jù)直接以json格式顯示出來了。
總結(jié)
以上是生活随笔為你收集整理的nodejs爬虫实战(一):抽屉新热榜的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。