爬取页面
分析
在爬取之前,着重观察点击分页符,地址栏的变化,在这个页面呢,可以发现每次点击一个,后面会有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
就是下图了