爬什么
把豆瓣的日剧爬取到本地,需要标题,电视剧类型,剧评这三个信息。
怎么做
- 获取url
- 发送请求,获取响应
- 提取数据
- 保存数据
获取url
观察可知,目标数据所在的url。
发送请求,获取响应
注意,这条请求必须把Referer参数带上,才能够正常获取响应数据。
提取数据
使用json.loads
方法读取数据,先提取包含电视剧信息的整块数据。通过遍历列表,提取每部剧的详细信息。
保存数据
使用json.dumps
方式写入数据,每个字段信息后面加上空格,每部剧的信息后面加上换行符,美化输出格式。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import requests import json from pprint import pprint
class doubannew: def __init__(self): self.url = "https://m.douban.com/rexxar/api/v2/subject_collection/tv_japanese/items?os=windows&for_mobile=1&start=0&count=18&loc_id=108288&_=0" self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36", "Referer": "https://m.douban.com/tv/japanese" }
def parse_url(self,url,headers): response = requests.get(url,headers=headers) return response.content.decode()
def get_content_list(self,html_str): json_str = json.loads(html_str) content_list = json_str["subject_collection_items"] return content_list
def save_content(self,content_list): with open("doubannew.txt","a",encoding="utf8") as f: for content in content_list: title = content["title"] info = content["info"] recommend_comment = content["recommend_comment"] f.write(title) f.write(" ") f.write(info) f.write(" ") f.write(recommend_comment) f.write("\n\n")
def run(self): html_str = self.parse_url(self.url,headers=self.headers) content_list = self.get_content_list(html_str) self.save_content(content_list)
if __name__ == '__main__': my_douban = doubannew() my_douban.run()
|
总结
这只是很初级的方法。并且只抓取了20部剧的信息。如果要抓取所有的电视剧,还要进一步学习,主要是剧的总数和url之间的数学关系,怎么使用代码表现出来。
先这样,下次有兴趣了继续。