用NodeJS實現一個網絡爬蟲小應用-爬取博客園首頁文章列表

前言

  網絡爬蟲(又稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更常常的稱爲網頁追逐者),是一種按照必定的規則,自動地抓取萬維網信息的程序或者腳本。另一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。html

  咱們可使用網絡爬蟲對數據信息進行自動採集,好比應用於搜索引擎中對站點進行爬取收錄,應用於數據分析與挖掘中對數據進行採集,應用於金融分析中對金融數據進行採集,除此以外,還能夠將網絡爬蟲應用於輿情監測與分析、目標客戶數據的收集等各個領域。前端

一、網絡爬蟲分類

  網絡爬蟲按照系統結構和實現技術,大體能夠分爲如下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。 實際的網絡爬蟲系統一般是幾種爬蟲技術相結合實現的,下面分別對這幾種爬蟲加以簡單的介紹。node

1.一、通用網絡爬蟲jquery

又稱全網爬蟲(Scalable Web Crawler),爬行對象從一些種子URL擴充到整個Web,主要爲門戶站點搜索引擎和大型Web服務提供商採集數據。

1.二、聚焦網絡爬蟲git

又稱主題網絡爬蟲(Topical Crawler),是指選擇性地爬行那些與預先定義好的主題相關頁面的網絡爬蟲。 和通用網絡爬蟲相比,聚焦爬蟲只須要爬行與主題相關的頁面,極大地節省了硬件和網絡資源,保存的頁面也因爲數量少而更新快,還能夠很好地知足一些特定人羣對特定領域信息的需求。

1.三、增量式網絡爬蟲github

指對已下載網頁採起增量式更新和只爬行新產生的或者已經發生變化網頁的爬蟲,它可以在必定程度上保證所爬行的頁面是儘量新的頁面。。

1.四、深層網絡爬蟲npm

Web 頁面按存在方式能夠分爲表層網頁(Surface Web)和深層網頁(Deep Web,也稱 Invisible Web Pages 或 Hidden Web)。表層網頁是指傳統搜索引擎能夠索引的頁面,以超連接能夠到達的靜態網頁爲主構成的Web 頁面。Deep Web是那些大部份內容不能經過靜態連接獲取的、隱藏在搜索表單後的,只有用戶提交一些關鍵詞才能得到的Web頁面。

二、建立一個簡單的爬蟲應用

  對以上幾種爬蟲進行簡單的瞭解後,下面來實現一個簡單的爬蟲小應用吧。json

2.一、實現目標數組

提到爬蟲,大機率會想到大數據,從而又聯想到Python,百度瞭如下,Python作爬蟲的確實比較多。因爲本身主要作前端開發這塊,相對來講,JavaScript更熟練簡單一點。實現一個小目標,那就用NodeJS來對博客園(本身經常使用的一個開發者網站)首頁文章列表進行爬取,而後寫入到本地JSON文件中服務器

2.二、環境搭建

  • NodeJS: 電腦要安裝NodeJS,未安裝的要去官網下載安裝。
  • npm: NodeJS包管理工具,隨NodeJS一塊兒安裝的。

NodeJS安裝完畢,打開命令行,可用node -v檢測NodeJS是否安裝成功,可用npm -v檢測NodeJS是否安裝成功,安裝成功應該會打印如下信息(因版本不一樣而異):

2.三、具體實現

2.3.一、安裝依賴包

在目錄下執行npm install superagent cheerio --save-dev安裝superagent,cheerio這兩個依賴包。建立一個crawler.js文件。

  • superagentSuperAgent是一個輕量級、靈活的、易讀的、低學習曲線的客戶端請求代理模塊,使用在NodeJS環境中。
  • cheerio: cheerio是專爲服務器設計的核心jQuery的快速,靈活和精益實現。它能夠像jquery同樣操做字符串。
// 導入依賴包
const http       = require("http");
const path       = require("path");
const url        = require("url");
const fs         = require("fs");
const superagent = require("superagent");
const cheerio    = require("cheerio");

2.3.二、爬取數據

接着get請求頁面,在獲取到頁面內容後,對返回的DOM根據本身想要的數據進行解析取值,最後把處理後的結果JSON轉譯成字符串保存到本地。

//爬取頁面地址
const pageUrl="https://www.cnblogs.com/";

// 解碼字符串
function unescapeString(str){
    if(!str){
        return ''
    }else{
        return unescape(str.replace(/&#x/g,'%u').replace(/;/g,''));
    }
}

// 抓取數據
function fetchData(){
    console.log('爬取數據時間節點:',new Date());
    superagent.get(pageUrl).end((error,response)=>{
        // 頁面文檔數據
        let content=response.text;
        if(content){
            console.log('獲取數據成功');
        }
        // 定義一個空數組來接收數據
        let result=[];
        let $=cheerio.load(content);
        let postList=$("#main #post_list .post_item");
        postList.each((index,value)=>{
            let titleLnk=$(value).find('a.titlelnk');
            let itemFoot=$(value).find('.post_item_foot');

            let title=titleLnk.html(); //標題
            let href=titleLnk.attr('href'); //連接
            let author=itemFoot.find('a.lightblue').html(); //做者
            let headLogo=$(value).find('.post_item_summary a img').attr('src'); //頭像
            let summary=$(value).find('.post_item_summary').text(); //簡介
            let postedTime=itemFoot.text().split('發佈於 ')[1].substr(0,16); //發佈時間
            let readNum=itemFoot.text().split('閱讀')[1]; //閱讀量
            readNum=readNum.substr(1,readNum.length-1);

            title=unescapeString(title);
            href=unescapeString(href);
            author=unescapeString(author);
            headLogo=unescapeString(headLogo);
            summary=unescapeString(summary);
            postedTime=unescapeString(postedTime);
            readNum=unescapeString(readNum);

            result.push({
                index,
                title,
                href,
                author,
                headLogo,
                summary,
                postedTime,
                readNum
            });
        });

        // 數組轉換爲字符串
        result=JSON.stringify(result);

        // 寫入本地cnblogs.json文件中
        fs.writeFile("cnblogs.json",result,"utf-8",(err)=>{
            // 監聽錯誤,如正常輸出,則打印null
            if(!err){
                console.log('寫入數據成功');
            }
        });
    });
}

fetchData();

三、執行優化

3.一、生成結果

在項目目錄下打開命令行輸入node crawler.js,

會發現目錄中會建立一個cnblogs.json文件,打開文件以下:

打開博客園首頁對比下:

發現成功爬到了首頁想要的文章列表

3.二、定時爬取

發現只有每執行一次才能獲取到數據,價格定時器,讓它每隔五分鐘自動爬取一次,代碼以下:

···
// 每隔5分鐘請求一次
setInterval(()=>{
    fetchData()
},5*60*1000);
···

四、總結

  網絡爬蟲的應用遠遠不止這些,以上只是對網絡爬蟲作了一個簡單的介紹,並實現了一個小demo,若有不足,歡迎指正。

參考資料:


https://baike.baidu.com/item/...
https://blog.csdn.net/zw0Pi8G...
https://www.jianshu.com/p/143...
https://www.jianshu.com/p/843...

相關文章
相關標籤/搜索