NodeJS實(shí)現(xiàn)一個(gè)簡(jiǎn)單的知乎日?qǐng)?bào)爬蟲

初衷

非常喜歡知乎日?qǐng)?bào)上面的內(nèi)容,另外又想用NodeJS來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬蟲練練手,so,對(duì)不住知乎了。(胡扯。。。。。。)

技術(shù)點(diǎn)

沒(méi)什么難的東西,非要說(shuō)一個(gè),那就是 cheerio,參考鏈接。如果對(duì)WEB前端開(kāi)發(fā)很熟的話,?你很快就能上手這個(gè)庫(kù),因?yàn)樗挠梅ê蚸Query極其相似。

旅程開(kāi)始

  1. 使用 NPM 建立??我們的爬蟲工程

    npm init ZHSpider
    

    填寫必要的信息后工程生成成功。

  2. 創(chuàng)建 data 目錄,用以存放爬蟲爬下來(lái)的的內(nèi)容。

  3. 創(chuàng)建工程入口文件 app.js,需要和創(chuàng)建工程時(shí)填寫的入口文件一致。

  4. 安裝依賴。

    npm install --save cheerio
    
  5. 寫爬蟲邏輯

    上代碼:

    var http =require('http');
    var cheerio = require('cheerio');
    var fs = require('fs');

    //需要爬的頁(yè)面
    var url = 'http://daily.zhihu.com';

    function fetchPage(url){
        startRequest(url);
    }


    //獲取故事標(biāo)題、內(nèi)容鏈接和圖片鏈接
    function startRequest(url){
        http.get(url, function(res){
            var html = "";
            var storys = [];

            res.setEncoding('utf-8');
            res.on('data', function(chunk){
                html += chunk;
            });

            //1. 現(xiàn)將列表爬下來(lái),列表包含每一個(gè)故事的標(biāo)題、詳細(xì)內(nèi)容的鏈接等
            res.on('end', function(){
                var $ = cheerio.load(html);
                $('.main-content-wrap .row .col-lg-4').each(function(index, item){
                    var wraps = $(item).children();
                    wraps.each(function(index, box){
                        var item_box = $(box).find('a');
                        var story = {};
                        story.title = item_box.text();
                        story.link = url + item_box.attr('href');
                        story.img = item_box.find('img').attr('src');
                        var length = storys.length;
                        story.index = length;
                        storys[length] = story;
                    });
                });

                //2. 遍歷列表,獲取詳細(xì)內(nèi)容
                storys.forEach(function(item) {
                    fetchStoryContent(item.link, function(content, author){
                        item.content = content;
                        item.author = author;

                        //3. 將內(nèi)容存儲(chǔ)到本地文件
                        fs.appendFile('./data/' + item.title, item.content, 'utf-8', function(error){
                            if (error) {
                                console.log(error);
                            }
                        });
                    });
                }, this);
            });

        });
    }

    //獲取故事內(nèi)容
    function fetchStoryContent(url, callbackFunc){
        var html = "";
        http.get(url, function(res){
            res.on('data', function(chunk){
                html += chunk;
            });

            res.on('end', function(){
                $ = cheerio.load(html);
                var title = $('title').text();
                var author = $('span.author').text();
                var contentDom = $('.answer .content');
                var content = "";
                contentDom.each(function(index, item){
                    var text = $(this).text();
                    content += text;
                });
                //console.log(author);
                callbackFunc(content, author);
            });
        });
    }


    //開(kāi)始請(qǐng)求
    fetchPage(url);

OK,到此,一個(gè)簡(jiǎn)單的額爬蟲就完成了。這是一個(gè)非常簡(jiǎn)單的版本,還有許多的東西等待優(yōu)化。運(yùn)行一下,看看效果怎么樣。

  1. 運(yùn)行

    node app.js
    

運(yùn)行結(jié)果:

運(yùn)行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,675評(píng)論 25 709
  • 標(biāo)題是摘自《好好學(xué)習(xí)》里的一句話。 這本書里面的金句俯拾皆是,讓我越看越激動(dòng),忍不住想摘錄下來(lái),說(shuō)幾句。 對(duì)大多數(shù)...
    依然如水閱讀 193評(píng)論 0 1
  • 偶然間聽(tīng)到的一句話,看到的一片風(fēng)景,讀到的一本書,也許就改變了你那時(shí)的困擾,乃至抉擇。
    常蠻蠻閱讀 151評(píng)論 0 0
  • 一生我們追求的是什么? 童年的是快樂(lè),處于年幼無(wú)知的童年,就像一張白紙,在往上面增圖各種色彩建立心中世界的同時(shí),也...
    素歌閱讀 366評(píng)論 0 0

友情鏈接更多精彩內(nèi)容