美文网首页Node.js
NodeJS实现一个简单的知乎日报爬虫

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

作者: mvictor | 来源:发表于2017-06-20 14:49 被阅读110次

    初衷

    非常喜欢知乎日报上面的内容,另外又想用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
      

    运行结果:

    运行结果

    相关文章

      网友评论

      • MamBain:这个只是单页爬取 多页爬取有没有考虑过
        mvictor:@MamBain 这个没有,这篇文章就是一个简单实现,没有考虑太多。

      本文标题:NodeJS实现一个简单的知乎日报爬虫

      本文链接:https://www.haomeiwen.com/subject/fkooqxtx.html