[Python]开着代理出现SSLError

前言

有个论坛一直在签到做任务,之前苦于对业务并不熟悉,一直没有去做签到脚本。这几天发现每日任务的领取和完成都是通过访问一个url来完成,不存在发送什么信息。虽然对爬虫只是一知半解,但是还是知道用request,对url get就行了,当然headers要加上cookis,user-agent。

问题

以上流程事实证明没有问题,但在过程上一直出现
Caused by SSLError(SSLError("bad handshake: SysCallError(-1, 'Unexpected EOF')",),)

完整错误信息没有保存下来,但这篇文章的评论说的很清楚

其实这个错误不完全是开了代理的原因,但确实关了代理就可以了。urllib 新版本的原因。如果出现这个问题,直接退回 urllib 版本:pip3 install urllib3==1.23。

由于现在已经解决这个问题,在尝试复现错误的过程中出现另一种错误
(Caused by ProxyError('Cannot connect to proxy.', OSError(0, 'Error')))
我认为两个问题都是本质相同的,且可以通过以上方法解决

由于我上的论坛需要一些辅助;又很恰巧的,虽然以前也有挂着辅助爬虫,但这次使用的虚拟环境和以前不一样,从而安装了最新的request库,同时或许安装了最新的urllib3

总结

关闭代理和urllib3降级选一个

### 解决 Python 请求时出现的代理错误 当在 Python 中使用代理 IP 进行网络请求时,可能会遇到各种类型的错误。为了有效地解决问题并确保稳定的数据抓取过程,可以从以下几个方面入手: #### 1. 验证代理有效性 确保所使用的代理 IP 是有效的,并且能够正常工作。可以通过测试代理连接到已知站点的方式验证其可用性[^1]。 ```python import requests def test_proxy(proxy): try: response = requests.get('http://httpbin.org/ip', proxies={'http': proxy, 'https': proxy}, timeout=5) print(f'Using {proxy} with result: {response.json()}') return True except Exception as e: print(f'{proxy} failed: {e}') return False ``` #### 2. 控制请求频率 频繁地发送请求可能导致目标服务器认为行为异常而拒绝服务。适当降低请求速率有助于减少被封禁的风险。 ```python from time import sleep for i in range(number_of_requests): make_request() sleep(random.uniform(0.5, 1.5)) # Random delay between each request ``` #### 3. 处理 SSL 错误 某些情况下,代理服务器可能不支持标准的 SSL/TLS 协议握手流程,从而引发 `SSLError` 异常。可以选择忽略这些警告或将自定义 CA 文件用于认证目的[^4]。 ```python import warnings from urllib3.exceptions import InsecureRequestWarning warnings.simplefilter('ignore', InsecureRequestWarning) session = requests.Session() session.verify = False # Disable SSL verification globally for this session response = session.get(url, proxies=proxies_dict) ``` #### 4. 使用多个代理源轮询 为了避免单个代理失效影响整个程序运行,建议准备一组备用代理地址池,并实现自动切换机制。这样即使某个特定节点出现问题也不会中断整体操作。 ```python import random available_proxies = ['http://p1.example.com:port', 'http://p2.example.com:port'] random.shuffle(available_proxies) # Shuffle the list to get a new order every run current_proxy_index = 0 while current_proxy_index < len(available_proxies): selected_proxy = available_proxies[current_proxy_index] try: resp = requests.get(target_url, proxies={"http":selected_proxy,"https":selected_proxy}) break except Exception as ex: print(f"Failed using proxy {selected_proxy}: ", str(ex)) current_proxy_index += 1 if current_proxy_index >= len(available_proxies): raise RuntimeError("All proxies have been tried and failed.") ``` 通过上述措施可以显著提高基于 Python 的 Web 抓取项目的成功率和稳定性。当然,在实际发过程中还需要根据具体情况进行调整优化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值