前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫爬取豆瓣电影top250

爬虫爬取豆瓣电影top250

作者头像
一粒小麦
发布2019-07-18 18:56:01
1.1K0
发布2019-07-18 18:56:01
举报
文章被收录于专栏:一Li小麦一Li小麦

我想,爬虫对很多人来说是一个很有魅力的话题,它意味着不用什么努力就拿到了别人辛苦付出的的劳动成果。

其原理就是:服务端请求数据,然后爬取页面内容。常用的请求库是request,常用的爬虫工具是cheerio——它可以像jq一样爬取你想要的dom内容。

npm i cheerio request iconv-lite -S

很多大网站都会反爬虫。但是豆瓣top250的页面还不错。任你上下其手,看完这些电影,应该就不是250了。

下面就将实现这个功能。

访问https://movie.douban.com/top250?start=0,研究页面结构。可得到一下信息:

  • 页面的编码是utf-8.
  • 点击分页器,可知连接请求随着start字段变化。start为0时,请求的是top1-25的电影。start为1时,请求到的是top26-50的电影,以此类推。
  • 电影内容是所有class=title(每页25个)。cheerio拿到的类选择器可以直接做循环。

在业务方面,当我收集了全部数据后,可存放到本地的data.json中。

// spider.js
const fs = require('fs');
const path = require('path')
const originRequest = require("request");
const cheerio = require("cheerio");
const iconv = require("iconv-lite");

// 封装request
function request(url, callback) {
    const options = {
        url: url,
        encoding: null
    };
    originRequest(url, options, callback);
}

//data作为参数加入到迭代中。
const getData = function (i, data) {
    data = data ? data : [];
    const url = `https://movie.douban.com/top250?start=${i * 25}`;
    request(url, function (err, res, body) {
        const html = iconv.decode(body, "utf-8");
        const $ = cheerio.load(body);
        let dataItem = []
        for (let j = 0; j < $('.item .title:first-of-type').length; j++) {
            dataItem.push({
                title: $('.item .title:first-of-type')[j].children[0].data,
                rank: i * 25 + j + 1
            })
        }
        // 衔接数组
        data.push(...dataItem);
        if (i < 11) {
            return getData(i + 1, data)
        } else {
            console.log('获取数据完成')
            fs.writeFile('data.json', JSON.stringify(data), (err) => {
                if (!err) {
                    console.log('写入成功')
                } else {
                    console.log('写入失败')
                }
            })
        }
    });
}

getData(0)

这里必须用到到异步循环,所以使用递归来实现,每次递归都把累计请求到的数据迭代到下一次递归中。

执行完毕后,内容就存放到data,json中了。

格式化之后成功拿到标准的json数据:

懦怯囚禁人的灵魂,希望可以让你自由。 ——肖申克的救赎

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档