NodeJS实现一个简单的知乎日报爬虫

初衷

非常喜欢知乎日报上面的内容,另外又想用NodeJS来实现一个简单的爬虫练练手,so,对不住知乎了。(胡扯。。。。。。)

技术点

没什么难的东西,非要说一个,那就是 cheerio,参考链接。如果对WEB前端开发很熟的话,�你很快就能上手这个库,因为它的用法和jQuery极其相似。

旅程开始

  1. 使用 NPM 建立��我们的爬虫工程

    npm init ZHSpider
    

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

  2. 创建 data 目录,用以存放爬虫爬下来的的内容。

  3. 创建工程入口文件 app.js,需要和创建工程时填写的入口文件一致。

  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);
    }


    //获取故事标题、内容链接和图片链接
    function startRequest(url){
        http.get(url, function(res){
            var html = "";
            var storys = [];

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

            //1. 现将列表爬下来,列表包含每一个故事的标题、详细内容的链接等
            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. 遍历列表,获取详细内容
                storys.forEach(function(item) {
                    fetchStoryContent(item.link, function(content, author){
                        item.content = content;
                        item.author = author;

                        //3. 将内容存储到本地文件
                        fs.appendFile('./data/' + item.title, item.content, 'utf-8', function(error){
                            if (error) {
                                console.log(error);
                            }
                        });
                    });
                }, this);
            });

        });
    }

    //获取故事内容
    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,到此,一个简单的额爬虫就完成了。这是一个非常简单的版本,还有许多的东西等待优化。运行一下,看看效果怎么样。

  1. 运行

    node app.js
    

运行结果:

NodeJS实现一个简单的知乎日报爬虫_第1张图片
运行结果

你可能感兴趣的:(NodeJS实现一个简单的知乎日报爬虫)