1 # coding=utf-8
2 """
3 用类封装爬虫任务,
4 目的,获取豆瓣某地区安热度排列的全部电影
5 思路:
6 chorme分析目标url,
7 构建url
8 发请求获取数据
9 保存数据
10 循环上三步直到最后一页
11 注意:目前代码中的url地址已经失效
12 """
13 import requests
14 import json
15
16 class DoubanSpider:
17 def __init__(self):
18 self.url_temp_list = [
19 {
20 "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?start={}&count=18&loc_id=108288",
21 "country": "US"
22 },
23 {
24 "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_english_hot/items?start={}&count=18&loc_id=108288",
25 "country": "UK"
26 },
27 {
28 "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_domestic_hot/items?start={}&count=18&loc_id=108288",
29 "country": "CN"
30 }
31 ]
32 self.headers = {
33 "User-Agent": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36",
34 "Referer": "https://m.douban.com/movie/"
35 }
36
37 def parse_url(self, url): # 发送请求,获取响应
38 print(url)
39 response = requests.get(url, headers=self.headers)
40 return response.content.decode()
41
42 def get_content_list(self, json_str): # 提取数据
43 dict_ret = json.loads(json_str)
44 content_list = dict_ret["subject_collection_items"]
45 total = dict_ret["total"] # 代表总数量 不一定正确
46 return content_list, total
47
48 def save_content_list(self, content_list,country): # 保存
49 with open("douban.txt", "a", encoding="utf-8") as f:
50 for content in content_list:
51 content["country"] = country
52 f.write(json.dumps(content, ensure_ascii=False))
53 f.write("\n") # 写入换行符,进行换行
54 print("保存成功")
55
56 def run(self): # 实现主要逻辑
57 for url_temp in self.url_temp_list:
58 num = 0 # num是url中的start参数,表示起始页
59 total = 100 # 假设有第一页
60 while num < total + 18: # 不能等于,因为等于意味着上一次已经把最后一页取完了
61 # 1.start_url
62 url = url_temp["url_temp"].format(num)
63 # 2.发送请求,获取响应
64 json_str = self.parse_url(url)
65 # 3.提取是数据
66 content_list, total = self.get_content_list(json_str)
67
68 # 4.每一页都保存一下,而不是全部获取后再保存,防止中间出问题了,前面获取的都白费了。
69 self.save_content_list(content_list,url_temp["country"])
70 # if len(content_list)<18: # 这种方式判断是否取到尾也可以
71 # break
72 # 5.构造下一页的url地址,进入循环
73 num += 18
74
75
76 if __name__ == '__main__':
77 douban_spider = DoubanSpider()
78 douban_spider.run()