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


我们现在爬取电视剧中的美剧、国产剧、港剧三个分类的所有数据,共1500条1、打开开发者工具,找到第一页对应的json数据。(寻找时忽略所有的js,css,ico文件)

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


2、在第一页的包含电视剧数据的包中找到请求的url

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


3、为了观察将url得更清晰,我们接着点击“加载更多”打开下一页,进行抓包

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


展示一下请求json的结构

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


下面对比一下两个页面的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()

效果图:

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