初学Node.js,实现对豆瓣电影top250进行爬取,参照 Node.js实现简单爬虫,并做重要修改
- 原博文的爬取方式现在已经不适用了,因为豆瓣的域名由http改为https,以及豆瓣网页的评分dom已改。
- 原先的博文只能爬取第一页内容,在此我使用了js的生成器,然后使用循环爬取全部内容。
var http = require('http'),
https = require('https'),
fs = require('fs'),
path = require('path'),
cheerio = require('cheerio');
定义爬取的URL信息,如果是http站点,则使用这种方式.
var opt = {
hostname: 'movie.douban.com',
path: '/top250',
port: 80
};
创建https get请求
function spiderMovie(index) {
https.get('https://movie.douban.com/top250?start=' + index, function (res) {
var pageSize = 25;
var html = '';
var movies = [];
res.setEncoding('utf-8');
res.on('data', function (chunk) {
html += chunk;
});
res.on('end', function () {
var $ = cheerio.load(html);
$('.item').each(function () {
var picUrl = $('.pic img', this).attr('src');
var movie = {
title: $('.title', this).text(),
star: $('.info .star .rating_num', this).text(),
link: $('a', this).attr('href'),
picUrl: picUrl
};
if (movie) {
movies.push(movie);
}
downloadImg('../img/', movie.picUrl);
});
saveData('./data' + (index / pageSize) + '.json', movies);
});
}).on('error', function (err) {
console.log(err);
});
}
下载图片
* 下载图片 * * @param {string} imgDir 存放图片的文件夹 * @param {string} url 图片的URL地址 */
function downloadImg(imgDir, url) {
https.get(url, function (res) {
var data = '';
res.setEncoding('binary');
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
fs.writeFile(imgDir + path.basename(url), data, 'binary', function (err) {
if (err) {
return console.log(err);
}
console.log('Image downloaded: ', path.basename(url));
});
});
}).on('error', function (err) {
console.log(err);
});
}
保存数据到本地
* 保存数据到本地 * * @param {string} path 保存数据的文件夹 * @param {array} movies 电影信息数组 */
function saveData(path, movies) {
console.log(movies);
fs.writeFile(path, JSON.stringify(movies, null, ' '), function (err) {
if (err) {
return console.log(err);
}
console.log('Data saved');
});
}
创建爬取生成器
function *doSpider(x) {
var start = 0;
console.log(start + ' -------------------------------');
while (start < x) {
yield start;
spiderMovie(start);
start += 25;
}
}
执行爬取方法
for (var x of doSpider(250)) {
console.log(x);
}
爬取结果

到此就结束了!