SG_WGL的博客

算法练习,算法分享,java,nodejs

NodeJs 爬取豆瓣电影top250

最近在上数据挖掘这门课,也想爬一爬数据玩一下,看看很多人都是用python爬数据,可惜不会,现在再去新学一门语言太耗费精力了,而且贪多嚼不烂,想想还是用nodejs。

写在前面

这里主要是用了一个小型的并发控制包eventproxy,配合nodejs的异步特性,爬取多个页面还是挺舒服的。先看这个,就是爬取豆瓣top250的250部电影信息,其实这种简单的爬虫就在于数据的提取,这就看jquery和正则用的熟不熟练了,提取的信息是电影名,导演,主演,年份,播放链接,简述,评分等。如果想保存到本地文件,可以在引入node的fs(文件操作)包,可以对图片进行存取。不多说,开始操作吧:

准备环境

当然是node环境了,最好是node6.5以上吧,node这一年更新的有点快…好像其他的没什么需要弄的,最不济有记事本加dos也行啊…

引入包

express这个想导入就导入吧,不导入就用http发起吧,没啥关系…

cheerio

用来做页面的解析

npm install cheerio --save

superagent

一款轻量级的ajax api,用起来非常方便,可以发送get、post、delete等等请求

npm install superagent

eventproxy

可以做小型的并发控制

npm install eventproxy --save

运行结果

node app.js

然后打开浏览器,地址栏输入127.0.0.1:3000(如果看得不顺眼可以下一个jsonview)
如果想把数据存到本地,可以调用node的fs包,具体的用法在上次的例子中有展示。
这里写图片描述

密密麻麻的是不是看不清楚?
这里写图片描述

这是在jsonview下看的结果:
这里写图片描述

考虑到某些因素,具体的数据分析过程就不上传了。

完整代码

const express = require('express');
const eventproxy = require('eventproxy');
const cheerio = require('cheerio');
const superagent = require('superagent');

const app = express();
const ep = eventproxy();

let resultArr = []; //用来存储筛选后的对象
let desUrlList = [];  //存放目标页面的url列表

for(let i = 1; i <= 10; i++){
    let pageIndex = 25*(i-1);
    desUrlList.push(`https://movie.douban.com/top250?start=${pageIndex}&filter=`);
}

app.listen(3000,()=>{
    console.log("app is listening at port 3000...");
});

app.get('/',(req,res)=>{
    for(let desUrl of desUrlList) {
        superagent.get(desUrl).end(function(err,sres){

            if(err) {
                console.error(err);
            }

            const $ = cheerio.load(sres.text,{decodeEntities:false});  //解析response内容;decodeEntities设置为false防止出现乱码

            $('.item').each(function(index,element) {

                const Title =  $(element).find('.hd').find('span').first().html();
                const Director = $(element).find('.bd').find('p').html().split('\n')[1].split(":")[1].split("主演")[0].trim();
                const Staring = $(element).find('.bd').find('p').html().split('\n')[1].trim().split("<br>")[0].split(":")[2];
                const Time = $(element).find('.bd').find('p').html().replace(/[^0-9]/ig,"");
                const Country = $(element).find('.bd').find('p').html().split("<br>")[1].split('/')[1].trim();
                const Type = $(element).find('.bd').find('p').html().split("<br>")[1].split('/')[2].trim();
                const Quote = $(element).find('.inq').html();
                const Score = $(element).find('.rating_num').html();
                const Href = $(element).find('.hd').find('a').attr('href');

                const movie = {Title, Director, Staring, Time, Country, Type, Quote, Score, Href};
                resultArr.push(movie);
                ep.emit('allMovies',movie);
            })
        });
    }
    ep.after('allMovies',desUrlList.length,function(){
        res.send(resultArr);
        console.log(resultArr);
    });
});
阅读更多
文章标签: nodejs 爬虫
个人分类: nodejs
上一篇2018年第九届蓝桥杯B组JAVA题解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭