Python使用requests开发爬虫设置代理时HTTPS代理失效问题咨询
问题解答
一、HTTPS代理失效的原因及代码问题
你的代码核心问题是对requests库的代理配置规则理解有误,具体问题如下:
- 代理字典的key匹配逻辑错误:requests的代理字典中,key代表你要访问的目标站点的协议,而非代理本身支持的协议。你测试的所有站点都是HTTPS协议,requests只会读取代理字典中key为
https对应的配置,你当前代码中如果代理的第一个协议是http,生成的代理字典只有httpkey,访问HTTPS站点时不会生效。 - 代理地址前缀配置错误:大多数支持HTTPS转发的代理是通过HTTP CONNECT隧道实现的,代理地址前缀写
http://即可,不需要写https://,如果强行写https://前缀,会要求和代理本身建立HTTPS连接,绝大多数免费代理不支持该逻辑,直接报错。 - 协议读取逻辑不全:你只读取了代理支持的第一个协议
proxy['protocols'][0],很多同时支持HTTP、HTTPS的代理只配置了单协议,无法适配HTTPS请求场景。
二、常见代理配置格式疑问解答
1. 为什么代理字典中https对应的地址前缀是http?
绝大多数支持HTTPS转发的代理都基于HTTP CONNECT隧道实现,你和代理之间本身走HTTP协议通信,代理只负责转发你加密后的HTTPS流量,不会接触到你的请求明文,所以代理地址前缀写http://完全可以正常代理HTTPS请求,不需要加https://前缀。
2. 可以仅传递单条代理吗?
可以,如果你只有特定协议的请求需要走代理,只配置对应key即可。比如你所有请求都是HTTP协议,只传{"http": "http://代理IP:端口"}就可以正常使用。
3. 可以在代理字典中传入10个不同的IP地址吗?
不行,requests原生不支持代理自动切换、负载均衡逻辑,一个协议key只能对应一个代理地址。如果你需要使用多个代理,需要自己在代码层面实现代理池逻辑,每次发请求前从可用代理列表中随机选取一个,构造对应的代理字典传入请求参数即可。
修正后的代理构造代码示例
final_proxy_list = [] for proxy in full_proxy_list: ip_ = proxy['ip'] port = proxy['port'] support_protocols = proxy['protocols'] proxy_dict = {} # 同时适配HTTP和HTTPS请求的代理配置 if 'http' in support_protocols or 'https' in support_protocols: proxy_dict['http'] = f'http://{ip_}:{port}' proxy_dict['https'] = f'http://{ip_}:{port}' elif 'socks4' in support_protocols: proxy_dict['http'] = f'socks4://{ip_}:{port}' proxy_dict['https'] = f'socks4://{ip_}:{port}' elif 'socks5' in support_protocols: proxy_dict['http'] = f'socks5://{ip_}:{port}' proxy_dict['https'] = f'socks5://{ip_}:{port}' if proxy_dict: final_proxy_list.append(proxy_dict)
内容的提问来源于stack exchange,提问作者taga
相关产品推荐
相关产品推荐

