NodeJS實現(xiàn)一個簡單的知乎日報爬蟲

初衷

非常喜歡知乎日報上面的內(nèi)容,另外又想用NodeJS來實現(xiàn)一個簡單的爬蟲練練手,so,對不住知乎了。(胡扯。。。。。。)

技術(shù)點

沒什么難的東西,非要說一個,那就是 cheerio,參考鏈接。如果對WEB前端開發(fā)很熟的話,?你很快就能上手這個庫,因為它的用法和jQuery極其相似。

旅程開始

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

    npm init ZHSpider
    

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

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

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

  4. 安裝依賴。

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

    上代碼:

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

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

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


    //獲取故事標題、內(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)將列表爬下來,列表包含每一個故事的標題、詳細內(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. 遍歷列表,獲取詳細內(nèi)容
                storys.forEach(function(item) {
                    fetchStoryContent(item.link, function(content, author){
                        item.content = content;
                        item.author = author;

                        //3. 將內(nèi)容存儲到本地文件
                        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);
            });
        });
    }


    //開始請求
    fetchPage(url);

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

  1. 運行

    node app.js
    

運行結(jié)果:

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評論 25 708
  • 標題是摘自《好好學習》里的一句話。 這本書里面的金句俯拾皆是,讓我越看越激動,忍不住想摘錄下來,說幾句。 對大多數(shù)...
    依然如水閱讀 193評論 0 1
  • 偶然間聽到的一句話,看到的一片風景,讀到的一本書,也許就改變了你那時的困擾,乃至抉擇。
    常蠻蠻閱讀 152評論 0 0
  • 一生我們追求的是什么? 童年的是快樂,處于年幼無知的童年,就像一張白紙,在往上面增圖各種色彩建立心中世界的同時,也...
    素歌閱讀 383評論 0 0

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