爬取豆瓣网电视剧数据(共1500条)

在这里插入图片描述
我们现在爬取电视剧中的美剧、国产剧、港剧三个分类的所有数据,共1500条

1、打开开发者工具,找到第一页对应的json数据。(寻找时忽略所有的js,css,ico文件)
在这里插入图片描述
2、在第一页的包含电视剧数据的包中找到请求的url
在这里插入图片描述
3、为了观察将url得更清晰,我们接着点击“加载更多”打开下一页,进行抓包
在这里插入图片描述
展示一下请求json的结构
在这里插入图片描述
下面对比一下两个页面的url

第一页:https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start=0
第二页:https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start=20

可以看到有page_limit,page_start两个参数值得研究
page_limit指的是煤业展示的电视剧数量
page_start表示的是每页展示的电视剧起始编号
研究到这里,我们就可以开始构造不断请求的url了,每当我们爬取下一页数据时,让page_start += 20即可

构造url:

先写一个模板url:https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start={}
在不断爬取的过程中用format函数将page_start参数填进去即可

下面给出爬取美剧、国产剧、港剧三个分类数据的代码

import requests
import json


class DoubanSpider:
    def __init__(self):
        self.url_temp_list = [
            {
                "url_temp": "https://movie.douban.com/j/search_subjects?type=tv&tag=%E5%9B%BD%E4%BA%A7%E5%89%A7&sort=recommend&page_limit=20&page_start={}",
                "country": "CN"
             },
            {
                "url_temp": "https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}",
                "country": "US"
            },
            {
                "url_temp": "https://movie.douban.com/j/search_subjects?type=tv&tag=%E6%B8%AF%E5%89%A7&sort=recommend&page_limit=20&page_start={}",
                "country": "HONGKONG"
             }
        ]
        self.headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36"}

    def get_json_str(self, url):
        res = requests.get(url, headers=self.headers)
        return res.content.decode()

    # 此函数将json字符串转换为python数据类型dict
    def get_content_list(self, json_str):
        dict_data = json.loads(json_str)  # 转换完成后,dict_data是字典
        print("type(dict_data):", type(dict_data))
        content_list = dict_data["subjects"]  # 还是字典
        return content_list  # 返回的是一个字典,键是0,1,2,,,,19

    def save_content_list(self, content_list, country):
        with open("doubanMultiArea.txt", "a", encoding="utf-8") as fp:
            for content in content_list:
                content["country"] = country  # 由于爬取的数据没有分类,手动加上
                fp.write(json.dumps(content, ensure_ascii=False))
                fp.write("\n")
        print("保存成功")

    def run(self):
    	# 一次for循环爬取一个类别所有数据
        for url_temp in self.url_temp_list:
            page_start = 0
            while True:
                url = url_temp["url_temp"].format(page_start)  # 构造下一页的url
                json_str = self.get_json_str(url)
                content_list = self.get_content_list(json_str)
                self.save_content_list(content_list, url_temp["country"])
                if len(content_list) < 20:
                    break
                page_start += 20


def main():
    spider = DoubanSpider()
    spider.run()


if __name__ == '__main__':
    main()

效果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值