在爬取网易云音乐的网页的时候,没爬完所有的数据,中途就遇到了问题如下:
MaxRetryError: HTTPSConnectionPool(host='music.163.com', port=443): Max retries exceeded with url: /playlist?id=8308295708 (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000017E79007A08>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
有可能第一次获取某url的时候会失败,就需要失败重试(retry),这就跟max_retries有关。
(当然你也不知道会在哪一个url就会卡壳,然后报这个错。)
requests自带了一个传输适配器HTTPAdapter,导入语句如下:
from requests.adapters import HTTPAdapter
这个适配器使用了强大的urllib3,为requests提供了默认的HTTP和HTTPS交互。每当Session被初始化,就会有适配器附着在Session上,其中一个供HTTP使用,另一个供HTTPS使用。
这里截取部分代码如下:
// 反爬虫——设置代理IP
// python3.7+版本需要这个格式,否则报错(Not supported proxy scheme None)
proxy = {'https':'https://ip:port','http':'http://ip:port'}
for i in df['url']:
// 为每一个url请求创建一个session
ses = requests.session()
// 利用HTTPAdapter设置失败尝试次数max_retries
ses.mount('http://',HTTPAdapter(max_retries=3))
ses.mount('https://',HTTPAdapter(max_retries=3))
time.sleep(1)
url = 'https://music.163.com' + i
response = ses.get(url=url, headers=headers, proxies=proxy)
还需要在headers中设置连接“关闭”:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Connection': 'close'
}