|
12 | 12 | URL_MAP_FILE = 'url_map.json' |
13 | 13 | logger = logging.getLogger('spider.util') |
14 | 14 |
|
| 15 | +# 全局代理配置,由 spider.py 初始化 |
| 16 | +_proxies = None |
| 17 | + |
| 18 | + |
| 19 | +def set_proxies(proxy_url): |
| 20 | + """设置全局代理""" |
| 21 | + global _proxies |
| 22 | + if proxy_url: |
| 23 | + _proxies = {'http': proxy_url, 'https': proxy_url} |
| 24 | + logger.info(u'已启用代理: %s', proxy_url) |
| 25 | + |
| 26 | + |
| 27 | +def get_proxies(): |
| 28 | + return _proxies |
| 29 | + |
15 | 30 |
|
16 | 31 | def hash_url(url): |
17 | 32 | return hashlib.sha224(url.encode('utf8')).hexdigest() |
18 | 33 |
|
19 | 34 |
|
| 35 | +DEFAULT_UA = ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ' |
| 36 | + 'AppleWebKit/537.36 (KHTML, like Gecko) ' |
| 37 | + 'Chrome/133.0.0.0 Safari/537.36') |
| 38 | + |
| 39 | + |
20 | 40 | def handle_html(cookie, url): |
21 | 41 | """处理html""" |
22 | | - try: |
23 | | - user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36' |
24 | | - headers = {'User_Agent': user_agent, 'Cookie': cookie} |
25 | | - resp = requests.get(url, headers=headers) |
26 | | - |
27 | | - if GENERATE_TEST_DATA: |
28 | | - import io |
29 | | - import os |
30 | | - |
31 | | - resp_file = os.path.join(TEST_DATA_DIR, '%s.html' % hash_url(url)) |
32 | | - with io.open(resp_file, 'w', encoding='utf-8') as f: |
33 | | - f.write(resp.text) |
34 | | - |
35 | | - with io.open(os.path.join(TEST_DATA_DIR, URL_MAP_FILE), 'r+') as f: |
36 | | - url_map = json.loads(f.read()) |
37 | | - url_map[url] = resp_file |
38 | | - f.seek(0) |
39 | | - f.write(json.dumps(url_map, indent=4, ensure_ascii=False)) |
40 | | - f.truncate() |
41 | | - |
42 | | - selector = etree.HTML(resp.content) |
43 | | - return selector |
44 | | - except Exception as e: |
45 | | - logger.exception(e) |
| 42 | + from time import sleep |
| 43 | + headers = {'User-Agent': DEFAULT_UA, 'Cookie': cookie} |
| 44 | + for attempt in range(5): |
| 45 | + try: |
| 46 | + resp = requests.get(url, headers=headers, timeout=10, |
| 47 | + proxies=_proxies) |
| 48 | + if resp.status_code == 200 and len(resp.content) > 0: |
| 49 | + selector = etree.HTML(resp.content) |
| 50 | + return selector |
| 51 | + elif resp.status_code == 403: |
| 52 | + wait = 300 * (attempt + 1) |
| 53 | + logger.warning(u'403 IP被限制,等待%d秒后重试(第%d次)', |
| 54 | + wait, attempt + 1) |
| 55 | + sleep(wait) |
| 56 | + elif resp.status_code == 432: |
| 57 | + logger.error(u'432 User-Agent被拒绝,请更新UA') |
| 58 | + return None |
| 59 | + else: |
| 60 | + wait = 60 * (attempt + 1) |
| 61 | + logger.warning(u'请求返回状态码%d,等待%d秒后重试(第%d次)', |
| 62 | + resp.status_code, wait, attempt + 1) |
| 63 | + sleep(wait) |
| 64 | + except Exception as e: |
| 65 | + wait = 60 * (attempt + 1) |
| 66 | + logger.warning(u'请求异常,等待%d秒后重试(第%d次): %s', |
| 67 | + wait, attempt + 1, str(e)) |
| 68 | + sleep(wait) |
| 69 | + logger.error(u'请求%s失败,已重试5次', url) |
| 70 | + return None |
46 | 71 |
|
47 | 72 |
|
48 | 73 | def handle_garbled(info): |
@@ -95,9 +120,9 @@ def to_video_download_url(cookie, video_page_url): |
95 | 120 | video_object_url = video_page_url.replace('m.weibo.cn/s/video/show', |
96 | 121 | 'm.weibo.cn/s/video/object') |
97 | 122 | try: |
98 | | - user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36' |
99 | | - headers = {'User_Agent': user_agent, 'Cookie': cookie} |
100 | | - wb_info = requests.get(video_object_url, headers=headers).json() |
| 123 | + headers = {'User-Agent': DEFAULT_UA, 'Cookie': cookie} |
| 124 | + wb_info = requests.get(video_object_url, headers=headers, |
| 125 | + proxies=_proxies).json() |
101 | 126 | video_url = wb_info['data']['object']['stream'].get('hd_url') |
102 | 127 | if not video_url: |
103 | 128 | video_url = wb_info['data']['object']['stream']['url'] |
|
0 commit comments