欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NodeJS爬蟲實(shí)例之糗事百科

 更新時(shí)間:2017年12月14日 16:34:47   投稿:laozhang  
本篇文章主要給大家講解了一下用NodeJS學(xué)習(xí)爬蟲,并通過爬糗事百科來講解用法和效果,一起學(xué)習(xí)下吧。

1.前言分析

往常都是利用 Python/.NET 語言實(shí)現(xiàn)爬蟲,然現(xiàn)在作為一名前端開發(fā)人員,自然需要熟練 NodeJS。下面利用 NodeJS 語言實(shí)現(xiàn)一個糗事百科的爬蟲。另外,本文使用的部分代碼是 es6 語法。

實(shí)現(xiàn)該爬蟲所需要的依賴庫如下。

request: 利用 get 或者 post 等方法獲取網(wǎng)頁的源碼。 cheerio: 對網(wǎng)頁源碼進(jìn)行解析,獲取所需數(shù)據(jù)。

本文首先對爬蟲所需依賴庫及其使用進(jìn)行介紹,然后利用這些依賴庫,實(shí)現(xiàn)一個針對糗事百科的網(wǎng)絡(luò)爬蟲。

2. request 庫

request 是一個輕量級的 http 庫,功能十分強(qiáng)大且使用簡單。可以使用它實(shí)現(xiàn) Http 的請求,并且支持 HTTP 認(rèn)證, 自定請求頭等。下面對 request 庫中一部分功能進(jìn)行介紹。

安裝 request 模塊如下:

npm install request

在安裝好 request 后,即可進(jìn)行使用,下面利用 request 請求一下百度的網(wǎng)頁。

const req = require('request');
req('http://www.baidu.com', (error, response, body) => {
 if (!error && response.statusCode == 200) {
 console.log(body)
 }
})

在沒有設(shè)置 options 參數(shù)時(shí),request 方法默認(rèn)是 get 請求。而我喜歡利用 request 對象的具體方法,使用如下:

req.get({
 url: 'http://www.baidu.com'
},(err, res, body) => {
 if (!err && res.statusCode == 200) {
 console.log(body)
 }
});

然而很多時(shí)候,直接去請求一個網(wǎng)址所獲取的 html 源碼,往往得不到我們需要的信息。一般情況下,需要考慮到請求頭和網(wǎng)頁編碼。

網(wǎng)頁的請求頭網(wǎng)頁的編碼

下面介紹在請求的時(shí)候如何添加網(wǎng)頁請求頭以及設(shè)置正確的編碼。

req.get({
 url : url,
 headers: {
  "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
  "Host" : "www.zhihu.com",
  "Upgrade-Insecure-Requests" : "1"
 },
 encoding : 'utf-8'
}, (err, res, body)=>{
 if(!err)
  console.log(body);
})

設(shè)置 options 參數(shù), 添加 headers 屬性即可實(shí)現(xiàn)請求頭的設(shè)置;添加 encoding 屬性即可設(shè)置網(wǎng)頁的編碼。需要注意的是,若 encoding:null ,那么 get 請求所獲取的內(nèi)容則是一個 Buffer 對象,即 body 是一個 Buffer 對象。

上面介紹的功能足矣滿足后面的所需了

3. cheerio 庫

cheerio 是一款服務(wù)器端的 Jquery,以輕、快、簡單易學(xué)等特點(diǎn)被開發(fā)者喜愛。有 Jquery 的基礎(chǔ)后再來學(xué)習(xí) cheerio 庫非常輕松。它能夠快速定位到網(wǎng)頁中的元素,其規(guī)則和 Jquery 定位元素的方法是一樣的;它也能以一種非常方便的形式修改 html 中的元素內(nèi)容,以及獲取它們的數(shù)據(jù)。下面主要針對 cheerio 快速定位網(wǎng)頁中的元素,以及獲取它們的內(nèi)容進(jìn)行介紹。

首先安裝 cheerio 庫

npm install cheerio

下面先給出一段代碼,再對代碼進(jìn)行解釋 cheerio 庫的用法。對博客園首頁進(jìn)行分析,然后提取每一頁中文章的標(biāo)題。

首先對博客園首頁進(jìn)行分析。如下圖:

對 html 源代碼進(jìn)行分析后,首先通過 .post_item 獲取所有標(biāo)題,接著對每一個 .post_item 進(jìn)行分析,使用 a.titlelnk 即可匹配每個標(biāo)題的 a 標(biāo)簽。下面通過代碼進(jìn)行實(shí)現(xiàn)。

const req = require('request');
const cheerio = require('cheerio');

req.get({
 url: 'https://www.cnblogs.com/'
 }, (err, res, body) => {
 if (!err && res.statusCode == 200) {
  let cnblogHtmlStr = body;
  let $ = cheerio.load(cnblogHtmlStr);
  $('.post_item').each((index, ele) => {
  let title = $(ele).find('a.titlelnk');
  let titleText = title.text();
  let titletUrl = title.attr('href');
  console.log(titleText, titletUrl);
  });
 }
 });

當(dāng)然,cheerio 庫也支持鏈?zhǔn)秸{(diào)用,上面的代碼也可改寫成:

let cnblogHtmlStr = body;
let $ = cheerio.load(cnblogHtmlStr);
let titles = $('.post_item').find('a.titlelnk');
titles.each((index, ele) => {
 let titleText = $(ele).text();
 let titletUrl = $(ele).attr('href');
 console.log(titleText, titletUrl);

上面的代碼非常簡單,就不再用文字進(jìn)行贅述了。下面總結(jié)一點(diǎn)自己認(rèn)為比較重要的幾點(diǎn)。

使用 find() 方法獲取的節(jié)點(diǎn)集合 A,若再次以 A 集合中的元素為根節(jié)點(diǎn)定位它的子節(jié)點(diǎn)以及獲取子元素的內(nèi)容與屬性,需對 A 集合中的子元素進(jìn)行 $(A[i]) 包裝,如上面的$(ele) 一樣。在上面代碼中使用 $(ele) ,其實(shí)還可以使用 $(this) 但是由于我使用的是 es6 的箭頭函數(shù),因此改變了 each 方法中回調(diào)函數(shù)的 this 指針,因此,我使用 $(ele); cheerio 庫也支持鏈?zhǔn)秸{(diào)用,如上面的 $('.post_item').find('a.titlelnk') ,需要注意的是,cheerio 對象 A 調(diào)用方法 find(),如果 A 是一個集合,那么 A 集合中的每一個子元素都調(diào)用 find() 方法,并放回一個結(jié)果結(jié)合。如果 A 調(diào)用 text() ,那么 A 集合中的每一個子元素都調(diào)用 text() 并返回一個字符串,該字符串是所有子元素內(nèi)容的合并(直接合并,沒有分隔符)。

最后在總結(jié)一些我比較常用的方法。

first() last() children([selector]): 該方法和 find 類似,只不過該方法只搜索子節(jié)點(diǎn),而 find 搜索整個后代節(jié)點(diǎn)。

4. 糗事百科爬蟲

通過上面對 requestcheerio 類庫的介紹,下面利用這兩個類庫對糗事百科的頁面進(jìn)行爬取。

1、在項(xiàng)目目錄中,新建 httpHelper.js 文件,通過 url 獲取糗事百科的網(wǎng)頁源碼,代碼如下:

//爬蟲
const req = require('request');

function getHtml(url){
 return new Promise((resolve, reject) => {
  req.get({
   url : url,
   headers: {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
    "Referer" : "https://www.qiushibaike.com/"
   },
   encoding : 'utf-8'
  }, (err, res, body)=>{
   if(err) reject(err);
   else resolve(body);
  })
 });
}
exports.getHtml = getHtml;

2、在項(xiàng)目目錄中,新建一個 Splider.js 文件,分析糗事百科的網(wǎng)頁代碼,提取自己需要的信息,并且建立一個邏輯通過更改 url 的 id 來爬取不同頁面的數(shù)據(jù)。

const cheerio = require('cheerio');
const httpHelper = require('./httpHelper');
function getQBJok(htmlStr){
 let $ = cheerio.load(htmlStr);
 let jokList = $('#content-left').children('div');
 let rst = [];
 jokList.each((i, item)=>{
  let node = $(item);
  let titleNode = node.find('h2');
  let title = titleNode ? titleNode.text().trim() : '匿名用戶';
  let content = node.find('.content span').text().trim();
  let likeNumber = node.find('i[class=number]').text().trim();
  rst.push({
   title : title,
   content : content,
   likeNumber : likeNumber
  });
 });
 return rst;
}
async function splider(index = 1){
 let url = `https://www.qiushibaike.com/8hr/page/${index}/`;
 let htmlStr = await httpHelper.getHtml(url);
 let rst = getQBJok(htmlStr);
 return rst;
}
splider(1);

在獲取糗事百科網(wǎng)頁信息的時(shí)候,首先在瀏覽器中對源碼進(jìn)行分析,定位到自己所需要標(biāo)簽,然后提取標(biāo)簽的文本或者屬性值,這樣就完成了網(wǎng)頁的解析。

Splider.js 文件入口是 splider 方法,首先根據(jù)傳入該方法的 index 索引,構(gòu)造糗事百科的 url,接著獲取該 url 的網(wǎng)頁源碼,最后將獲取的源碼傳入 getQBJok 方法,進(jìn)行解析,本文只解析每條文本笑話的作者、內(nèi)容以及喜歡個數(shù)。

直接運(yùn)行 Splider.js 文件,即可爬取第一頁的笑話信息。然后可以更改 splider 方法的參數(shù),實(shí)現(xiàn)抓取不同頁面的信息。

在上面已有代碼的基礎(chǔ)上,使用 koavue2.0 搭建一個瀏覽文本的頁面,效果如下:

源碼已上傳到 github 上。下載地址:https://github.com/StartAction/SpliderQB ;

項(xiàng)目運(yùn)行依賴 node v7.6.0 以上, 首先從 Github 上面克隆整個項(xiàng)目。

git clone https://github.com/StartAction/SpliderQB.git

克隆之后,進(jìn)入項(xiàng)目目錄,運(yùn)行下面命令即可。

node app.js

5. 總結(jié)

通過實(shí)現(xiàn)一個完整的爬蟲功能,加深自己對 Node 的理解,且實(shí)現(xiàn)的部分語言都是使用 es6 的語法,讓自己加快對 es6 語法的學(xué)習(xí)進(jìn)度。另外,在這次實(shí)現(xiàn)中,遇到了 Node 的異步控制的知識,本文是采用的是 asyncawait 關(guān)鍵字,也是我最喜歡的一種,然而在 Node 中,實(shí)現(xiàn)異步控制有好幾種方式。關(guān)于具體的方式以及原理,有時(shí)間再進(jìn)行總結(jié)。

相關(guān)文章

  • node.js中的fs.stat方法使用說明

    node.js中的fs.stat方法使用說明

    這篇文章主要介紹了node.js中的fs.stat方法使用說明,本文介紹了fs.stat的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的全過程

    安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的全過程

    有時(shí)候使用nvm管理node會發(fā)現(xiàn)無法使用node或npm,主要原因是環(huán)境變量沒有配置成功,下面這篇文章主要給大家介紹了關(guān)于安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 利用npm 安裝刪除模塊的方法

    利用npm 安裝刪除模塊的方法

    今天小編就為大家分享一篇利用npm 安裝刪除模塊的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • sharp.js安裝過程中遇到的問題總結(jié)

    sharp.js安裝過程中遇到的問題總結(jié)

    本文給大家講述的是Node.js服務(wù)端圖片處理利器sharp.js安裝過程中遇到的問題的匯總,非常不錯,有需要的小伙伴可以參考下
    2020-04-04
  • 基于nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能

    基于nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能

    通過一段時(shí)間的查閱資料發(fā)現(xiàn)實(shí)現(xiàn)上傳的方式有:1.express中間件multer模塊2.connect-multiparty模塊(但現(xiàn)在 官方不推薦 )3.使用multiparty模塊實(shí)現(xiàn)4.使用formidable插件實(shí)現(xiàn),本文給大家介紹nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能,需要的朋友參考下
    2015-11-11
  • Node.js開發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證功能

    Node.js開發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證功能

    這篇文章主要介紹了Node.js開發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • Node.js實(shí)現(xiàn)讀取Excel數(shù)據(jù)并插入MySQL

    Node.js實(shí)現(xiàn)讀取Excel數(shù)據(jù)并插入MySQL

    這篇文章主要為大家詳細(xì)介紹了Node.js如何實(shí)現(xiàn)讀取Excel數(shù)據(jù)并插入到MySQL數(shù)據(jù)庫中,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Node.js中Koa2在控制臺輸出請求日志的方法示例

    Node.js中Koa2在控制臺輸出請求日志的方法示例

    這篇文章主要給大家介紹了關(guān)于Node.js中Koa2在控制臺輸出請求日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • npm、pnpm、yarn之間的區(qū)別小結(jié)

    npm、pnpm、yarn之間的區(qū)別小結(jié)

    平時(shí)在項(xiàng)目開發(fā)中,經(jīng)常用到npm、pnpm、yarn這些來安裝包,本文主要介紹了npm、pnpm、yarn之間的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 詳解如何用typescript開發(fā)koa2的二三事

    詳解如何用typescript開發(fā)koa2的二三事

    這篇文章主要介紹了詳解如何用typescript開發(fā)koa2的二三事,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11

最新評論