簡單的Node爬蟲

寫在開頭

經(jīng)過一個漫長的寒假墩邀,終于也是趕上復工的潮流穆桂。祝賀全國人民抗"疫"取得階段性的勝利宫盔。
在平常的Node使用過程中,我主要就是爬取點東西享完。今天分享一個簡單的Node爬蟲程序灼芭。抓取某培訓站點的評論內(nèi)容。

1.引入依賴文件

const https = require('https'),  //發(fā)送請求
fs = require('fs'),      // fs文件操作
cheerio = require('cheerio'); // 類似于jQuery

2.定義類

class crawlData {
    constructor(page) {
        this.currentPage = 1;
        this.page = page;
        this.baseUrl = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // 因為涉及侵權(quán),就不掛鏈接了般又。
        this.init();
    }
}

3.定義Init()函數(shù)

/*
 * 我們定義計時器來分開請求彼绷。因為了解到他的分頁請求費GET請求直接在URL后面拼接分頁參數(shù)即可。
 */
init() {
    let _self = this;
    let time = setInterval(function () {
        if (_self.currentPage > _self.page) {
            clearInterval(time);
        } else {
            _self.getDataPackage(_self.baseUrl + `?page=${_self.currentPage}`, _self.currentPage);
            _self.currentPage++;
        }
    }, 1000 * 1);

}

4.發(fā)送請求

getDataPackage(url, curPage) {
    console.log(url);
    let _self = this;
    https.get(url, function (response) {
        var chunks = [];
        var size = 0;
        response.on('data', function (chunk) {
            chunks.push(chunk);
            size += chunk.length;
        });
        response.on('end', function () {
            // 將請求到的內(nèi)容轉(zhuǎn)為jQuery可操作的DOM結(jié)構(gòu)
            let data = Buffer.concat(chunks, size);
            let html = data.toString();
            let $ = cheerio.load(html);  
            
            // 獲取內(nèi)容茴迁,在頁面上自行通過F12開發(fā)者找到對應(yīng)的標簽內(nèi)容寄悯。
            let result = [];
            $('.cmt-list').find('.inner').each(i => {
                let map = {};
                map.user = $('.inner').eq(i).find('.hd').find('.name').text();
                map.img = "http:" + $('.inner').eq(i).find('.hd').find('a').find('img').attr('src');
                map.starts = $('.inner').eq(i).find('.hd').find('.stars').find('span').text();
                map.content = $('.inner').eq(i).find('.cmt-txt').text();
                result.push(map);
                map = {};
            })

            // 處理JSON格式
            let dataStr = JSON.stringify(result).trim().replace(/^\[/, curPage == 1 ? '[' : '').replace(/\]$/, curPage == _self.page ? ']' : ',');

            // 通過fs寫入
            fs.writeFile('./pinglun.json', dataStr, {
                    'flag': 'a'
            }, function (err) {
                if (err) throw err;
                console.log('寫入成功');
            });
        });
    });
}

5.調(diào)用

new crawlData(10);

6.過程圖

運行時

7.結(jié)果

結(jié)果

8.完整代碼

const
    https = require('https'),
    fs = require('fs'),
    cheerio = require('cheerio');

class crawlData {
    constructor(page) {
        this.currentPage = 1;
        this.page = page;
        this.baseUrl = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
        this.init();
    }
    init() {
        let _self = this;
        let time = setInterval(function () {
            if (_self.currentPage > _self.page) {
                clearInterval(time);
            } else {
                _self.getDataPackage(_self.baseUrl + `?page=${_self.currentPage}`, _self.currentPage);
                _self.currentPage++;
            }
        }, 1000 * 1);

    }
    getDataPackage(url, curPage) {
        console.log(url);
        let _self = this;
        https.get(url, function (response) {
            var chunks = [];
            var size = 0;
            response.on('data', function (chunk) {
                chunks.push(chunk);
                size += chunk.length;
            });
            response.on('end', function () {
                let data = Buffer.concat(chunks, size);
                let html = data.toString();
                let $ = cheerio.load(html);
                let result = [];
                $('.cmt-list').find('.inner').each(i => {
                    let map = {};
                    map.user = $('.inner').eq(i).find('.hd').find('.name').text();
                    map.img = "http:" + $('.inner').eq(i).find('.hd').find('a').find('img').attr('src');
                    map.starts = $('.inner').eq(i).find('.hd').find('.stars').find('span').text();
                    map.content = $('.inner').eq(i).find('.cmt-txt').text();
                    result.push(map);
                    map = {};
                })

                let dataStr = JSON.stringify(result).trim().replace(/^\[/, curPage == 1 ? '[' : '').replace(/\]$/, curPage == _self.page ? ']' : ',');
                fs.writeFile('./pinglun.json', dataStr, {
                    'flag': 'a'
                }, function (err) {
                    if (err) throw err;
                    console.log('寫入成功');
                });
            });
        });
    }
}

new crawlData(10);

完結(jié)撒花??????

  • 本人博客地址:https://reinness.com 站點名稱:平凡的你我。 歡迎大家的到來堕义!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猜旬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倦卖,更是在濱河造成了極大的恐慌洒擦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕膛,死亡現(xiàn)場離奇詭異熟嫩,居然都是意外死亡,警方通過查閱死者的電腦和手機褐捻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門邦危,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋侨,“玉大人舍扰,你說我怎么就攤上這事倦蚪。” “怎么了边苹?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵陵且,是天一觀的道長。 經(jīng)常有香客問我个束,道長慕购,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任茬底,我火速辦了婚禮沪悲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阱表。我一直安慰自己殿如,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布最爬。 她就那樣靜靜地躺著涉馁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爱致。 梳的紋絲不亂的頭發(fā)上烤送,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音糠悯,去河邊找鬼帮坚。 笑死,一個胖子當著我的面吹牛互艾,可吹牛的內(nèi)容都是我干的试和。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼忘朝,長吁一口氣:“原來是場噩夢啊……” “哼灰署!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起局嘁,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤溉箕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悦昵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肴茄,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年但指,在試婚紗的時候發(fā)現(xiàn)自己被綠了寡痰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抗楔。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拦坠,靈堂內(nèi)的尸體忽然破棺而出连躏,到底是詐尸還是另有隱情,我是刑警寧澤贞滨,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布入热,位于F島的核電站,受9級特大地震影響晓铆,放射性物質(zhì)發(fā)生泄漏勺良。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一骄噪、第九天 我趴在偏房一處隱蔽的房頂上張望尚困。 院中可真熱鬧,春花似錦链蕊、人聲如沸事甜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讳侨。三九已至,卻和暖如春奏属,著一層夾襖步出監(jiān)牢的瞬間跨跨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工囱皿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勇婴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓嘱腥,卻偏偏與公主長得像耕渴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子齿兔,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容