nodejs爬虫爬取豆瓣评分

nodejs爬虫爬取豆瓣评分

月光魔力鸭

2018-09-16 09:19 阅读 1029 喜欢 1 nodejs爬虫 豆瓣评分

之前玩千里码的时候,有这么一个题目,如下:Google,Baidu的两大技术:爬虫和搜索。爬虫负责抓取整个互联网的内容,搜索负责生成索引供用户检索。所以爬虫算是这两个公司的看家本领了。 但是Google和Baidu的爬虫技术是不公开的,算是商业机密了。所以360搜索刚起步的时候第一件事就是挖百度的核心搜索爬虫组的程序员,基本是3倍工资起挖(跪求360公司来辟谣)。 虽然没办法知道这两家公司的爬虫技术,但是我们可以通过开源项目来学习。比如Scrapy就是一个非常优秀开源的爬虫框架,如果对爬虫有兴趣的话可以深入学习该框架。

简单地讲,爬虫分为两个步奏:

这里通过一个非常简单的任务来让大家感受一下爬虫: 豆瓣电影Top250收录了至今为止,大家最喜欢的250部电影。 该列表呈现了每部电影的评分,年份等基本信息。 这题的答案很简单,就是这个榜单的前166部电影的评分总和。 举例: 目前排第一的《肖申克的救赎》是9.6分,第二的《这个杀手不太冷》是9.4分,第三的《阿甘正传》是9.4分。 那么前3部电影的总分为9.6+9.4+9.4=28.4。

以下为具体实现代码:

var url = 'https://movie.douban.com/top250?start=';

//需要统计166部,每页25条
var superagent = require('superagent');
var cheerio = require('cheerio');
var numArr = [];
var getNext = function(path,start){
    var tempPath = path+start;
    superagent.get(tempPath).set({
        'cookie':'bid=xEbtZyJpLBs; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1474114942%2C%22http%3A%2F%2Fwww.qlcoder.com%2Ftask%2F7560%22%5D; _pk_id.100001.4cf6=ebdb1fdadde80a53.1474114942.1.1474115010.1474114942.; _pk_ses.100001.4cf6=*; __utma=30149280.834196820.1474114942.1474114942.1474114942.1; __utmb=30149280.0.10.1474114942; __utmc=30149280; __utmz=30149280.1474114942.1.1.utmcsr=qlcoder.com|utmccn=(referral)|utmcmd=referral|utmcct=/task/7560; __utma=223695111.500893696.1474114942.1474114942.1474114942.1; __utmb=223695111.0.10.1474114942; __utmc=223695111; __utmz=223695111.1474114942.1.1.utmcsr=qlcoder.com|utmccn=(referral)|utmcmd=referral|utmcct=/task/7560'
    }).end(function(err,res){
        var text = res.text;
        var $ = cheerio.load(text);
        var flag = false;
        $('.rating_num').each(function(index,ele){
            var num = $(ele).html();
            num = parseFloat(num);
            if(numArr.length == 166){
                flag = true;
                countNum ();
            }
            if(!flag){
                numArr.push(num);
            }
        });
        if(!flag){
            getNext(path,start+25);
        }
    });
};

var countNum = function(){
    var total = 0 ;
    for(var i=0,max=numArr.length;i<max;i++){
        total += numArr[i];
    }
    console.log('answer : '+ total);
};

getNext(url,0);

实现思路:

  1. 首先通过 superagent模块爬取页面
  2. 然后将内容通过cheerio进行解析为DOM节点
  3. 根据页面DOM,通过选择器获得需要的数据
  4. 将一个页面的评分数据获得,并push到[]中
  5. 循环爬取其他页面,如果量不大,可以一个一个来,但是如果数据很多、量很大的话,这样效率就很低了,此时可以考虑通过async 来进行并发获取
  6. 最后通过计算,获得结果;

这里附上千里码的题目链接:http://www.qlcoder.com/task/7560

转载请注明出处: https://chrunlee.cn/article/nodejs-spider-douban-score.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
在开发项目过程中,经常需要将开发的项目部署到服务器上,但是每个环境都有每个环境的配置等等,如果每次打包的时候都要去调整(可能删除、替换等),那就很烦人了,这里分享下自己实现的几个简单的小工具(当然这个工具可能只对我自己有用),希望能够帮到你。
当我们想实现一个自己的库或模块后,发布的话,需要发布到npm上才能下载。以下是具体步骤
互联网应用经常需要存储用户上传的图片,比如facebook相册。 facebook目前存储了2600亿张照片,总大小为20PB,每张照片约为80KB。用户每周新增照片数量为10亿。(总大小60TB),平均每秒新增3500张照片(3500次写请求),读操作峰值可以达到每秒百万次
最近在折腾的时候又想写less了,但是换框架了,成了thinkjs,考虑到开发阶段一直编译编译less的情况..最终根据middleware的特点实现了一个超级简单的less中间件。
碰到个小需求,本来实现挺简单的,用的electron,开发模式下各种顺畅...半个小时就搞定了,结果倒在了electron打包上..这个坑我应该跳进来了好多次了..
使用nodejs连接ftp,进行ftp的操作,包括列表、上传、下载以及速率等。
前段时间学习到了nodejs的net模块这部分,正好想实现一个局域网内的文件下载小demo,噔噔噔噔... 兴趣推动 ,马上搞一搞。
从豆瓣转到网易云后,发现了不少好听的歌曲,然鹅..当我想把这些歌拿下来扔车上听的时候发现竟然不允许下载..能听不能下?这不科学,作为一名程序猿,必然要迎难而上啊.