nodejs 爬虫系列二(实现分页数据的爬取)

爬取页面

分析

在爬取之前,着重观察点击分页符,地址栏的变化,在这个页面呢,可以发现每次点击一个,后面会有start =num &filter=,这个num每次递增25

点击页码2:https://movie.douban.com/top250?start=25&filter=
点击页码3:https://movie.douban.com/top250?start=50&filter=
点击页码4:https://movie.douban.com/top250?start=75&filter=

于是我在地址栏输入了https://movie.douban.com/top250?start=0&filter=
发现可以访问,并且显示内容与https://movie.douban.com/top250一致

思路

地址栏这么有规律,因此可以使用递归的方法,封装一个函数,可以在superagent的方法里面传入动态url,将获取到的数据 push进数组后,判断它是不是https://movie.douban.com/top250?start=225&filter=(因为这个是最后一页了)
如果是的话,就结束了,否则,继续调用函数

注意

数据采用追加的方式,因为写入的话数据会被覆盖的
本次采用的依旧是superagent+cheerio

demo

var superagent = require('superagent');
var cheerio = require('cheerio');
var fs = require('fs');
var path = require('path')

var start = 0;
var url = 'https://movie.douban.com/top250?start=';
var end = '&filter='

function getMovies(url, start, end) {
    //superagent
    superagent.get(url + start + end)
        .end(function (err, res) {
            if (err) {
                return console.error(err);
            }

            var top250 = [];
        //cheerio
            let $ = cheerio.load(res.text);

            $('li>.item>.info').each((index, ele) => {
                var movie = {
                    picture: $(ele).prev().find('img').attr('src'),
                    title: $(ele).children('.hd').text().replace(/[\r\n]/g, "").replace(/\ +/g, ""),
                    details: $(ele).children('.bd').find('.star').prev().text().replace(/[\r\n]/g, "").replace(/\ +/g, ""),
                    score: $(ele).children('.bd').find('.star').find('.rating_num').text(),
                    nums: $(ele).children('.bd').find('.star').find('.rating_num').next().next().text().replace(/[\r\n]/g, "").replace(/\ +/g, ""),
                    quote: $(ele).children('.bd').find('.quote').text().replace(/[\r\n]/g, "").replace(/\ +/g, ""),

                }
            top250.push(movie);
        })

    fs.appendFile(path.resolve(__dirname, 'data.json'),
        JSON.stringify(top250)
        , () => {
            console.log("保存成功")
        })
    if (start < 225) {
        getMovies(url, (start + 25), end);
    }
    else {
        console.log("爬取成功!");
    }
});

}

//开始爬取页面数据
getMovies(url, start, end);

效果

注意:ctrl+A ctrl+K ctrl+F就是下图了

image.png

你可能感兴趣的:(nodejs 爬虫系列二(实现分页数据的爬取))