Node.js 爬取豆瓣电影 top250

4,209 阅读1分钟

初学Node.js,实现对豆瓣电影top250进行爬取,参照 Node.js实现简单爬虫,并做重要修改

  1. 原博文的爬取方式现在已经不适用了,因为豆瓣的域名由http改为https,以及豆瓣网页的评分dom已改。
  2. 原先的博文只能爬取第一页内容,在此我使用了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); 
    }
爬取结果

爬取的图片 爬取的图片 爬取的数据 爬取的数据

到此就结束了!