<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        NodeJS爬蟲實例之糗事百科_node.js

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:10:11
        文檔

        NodeJS爬蟲實例之糗事百科_node.js

        NodeJS爬蟲實例之糗事百科_node.js:本篇文章主要給大家講解了一下用NodeJS學(xué)習(xí)爬蟲,并通過爬糗事百科來講解用法和效果,有NodeJS源碼分析哦,對NodeJS感興趣的一起學(xué)習(xí)下吧。1.前言分析往常都是利用 Python/.NET 語言實現(xiàn)爬蟲,然現(xiàn)在作為一名前端開發(fā)人員,自然需要熟練 NodeJS。下面
        推薦度:
        導(dǎo)讀NodeJS爬蟲實例之糗事百科_node.js:本篇文章主要給大家講解了一下用NodeJS學(xué)習(xí)爬蟲,并通過爬糗事百科來講解用法和效果,有NodeJS源碼分析哦,對NodeJS感興趣的一起學(xué)習(xí)下吧。1.前言分析往常都是利用 Python/.NET 語言實現(xiàn)爬蟲,然現(xiàn)在作為一名前端開發(fā)人員,自然需要熟練 NodeJS。下面
        本篇文章主要給大家講解了一下用NodeJS學(xué)習(xí)爬蟲,并通過爬糗事百科來講解用法和效果,有NodeJS源碼分析哦,對NodeJS感興趣的一起學(xué)習(xí)下吧。

        1.前言分析

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

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

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

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

        2. request 庫

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

        安裝 request 模塊如下:

        npm install request

        在安裝好 request 后,即可進行使用,下面利用 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ù)時,request 方法默認是 get 請求。而我喜歡利用 request 對象的具體方法,使用如下:

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

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

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

        下面介紹在請求的時候如何添加網(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 屬性即可實現(xiàn)請求頭的設(shè)置;添加 encoding 屬性即可設(shè)置網(wǎng)頁的編碼。需要注意的是,若 encoding:null ,那么 get 請求所獲取的內(nèi)容則是一個 Buffer 對象,即 body 是一個 Buffer 對象。

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

        3. cheerio 庫

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

        首先安裝 cheerio 庫

        npm install cheerio

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

        首先對博客園首頁進行分析。如下圖:

        對 html 源代碼進行分析后,首先通過 .post_item 獲取所有標題,接著對每一個 .post_item 進行分析,使用 a.titlelnk 即可匹配每個標題的 a 標簽。下面通過代碼進行實現(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);
         });
         }
         });

        當然,cheerio 庫也支持鏈式調(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);

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

        使用 find() 方法獲取的節(jié)點集合 A,若再次以 A 集合中的元素為根節(jié)點定位它的子節(jié)點以及獲取子元素的內(nèi)容與屬性,需對 A 集合中的子元素進行 $(A[i]) 包裝,如上面的$(ele) 一樣。在上面代碼中使用 $(ele) ,其實還可以使用 $(this) 但是由于我使用的是 es6 的箭頭函數(shù),因此改變了 each 方法中回調(diào)函數(shù)的 this 指針,因此,我使用 $(ele); cheerio 庫也支持鏈式調(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é)點,而 find 搜索整個后代節(jié)點。

        4. 糗事百科爬蟲

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

        1、在項目目錄中,新建 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、在項目目錄中,新建一個 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('p');
         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)頁信息的時候,首先在瀏覽器中對源碼進行分析,定位到自己所需要標簽,然后提取標簽的文本或者屬性值,這樣就完成了網(wǎng)頁的解析。

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

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

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

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

        項目運行依賴 node v7.6.0 以上, 首先從 Github 上面克隆整個項目。

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

        克隆之后,進入項目目錄,運行下面命令即可。

        node app.js

        5. 總結(jié)

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

        相關(guān)推薦:

        NodeJS實現(xiàn)視頻轉(zhuǎn)碼的示例代碼

        NodeJs實現(xiàn)定時任務(wù)的示例代碼

        NodeJs之關(guān)于數(shù)據(jù)庫異常處理的解決方法

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        NodeJS爬蟲實例之糗事百科_node.js

        NodeJS爬蟲實例之糗事百科_node.js:本篇文章主要給大家講解了一下用NodeJS學(xué)習(xí)爬蟲,并通過爬糗事百科來講解用法和效果,有NodeJS源碼分析哦,對NodeJS感興趣的一起學(xué)習(xí)下吧。1.前言分析往常都是利用 Python/.NET 語言實現(xiàn)爬蟲,然現(xiàn)在作為一名前端開發(fā)人員,自然需要熟練 NodeJS。下面
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久久久国产精品免费免费不卡| 一级特黄录像免费播放中文版| 亚洲免费在线播放| 亚洲AV无码一区东京热久久| a毛片免费在线观看| 亚洲处破女AV日韩精品| 国产成人一区二区三区视频免费| 亚洲AV日韩AV天堂久久| 99在线观看视频免费| 亚洲人成日本在线观看| 性色av无码免费一区二区三区| 亚洲人成色4444在线观看| 国产成人免费网站在线观看| 日日摸夜夜添夜夜免费视频| 亚洲国产精品成人精品无码区 | 日韩免费a级毛片无码a∨| 亚洲综合无码无在线观看| 国产一级大片免费看| 久99久精品免费视频热77| 久久亚洲AV成人无码| 青青青国产在线观看免费| 亚洲AV电影天堂男人的天堂| 中文字幕专区在线亚洲| 日韩精品极品视频在线观看免费 | 67194国产精品免费观看| 亚洲黄页网在线观看| 日韩精品电影一区亚洲| 国产免费一区二区三区不卡| 亚洲国产综合在线| 四虎永久在线免费观看| 你是我的城池营垒免费观看完整版| 久久精品国产亚洲av高清漫画| 国产精品酒店视频免费看| 日本免费A级毛一片| 一本天堂ⅴ无码亚洲道久久| 亚洲欧洲中文日韩av乱码| 1000部拍拍拍18勿入免费视频下载 | 国产男女爽爽爽免费视频| 亚洲黄色中文字幕| 成人伊人亚洲人综合网站222| 毛片在线播放免费观看|