背景
这是我在使用Python爬取网页信息的时候出现的异常。
由于很多要爬取的网站会把“IP限制”作为反爬虫手段,所以我偶尔会使用“代理IP服务器”去处理相关需求,因为我觉得每次都 time.sleep(10) 太漫长,对频繁且大量的请求十分不友好。
推荐代理服务器:
正文
针对这个问题,我查阅了许多前辈的博客,并且亲自编写的了大量代码测试,总结出了下面的几种场景。
一. 异常描述
下面在控制台打印的异常信息,为了隐藏公司真实场景,我把请求地址换成了“www.baidu.com”:
requests.exceptions.ProxyError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001E1F80374E0>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。')))
大概意思就是:请求地址的HTTP连接池(host =‘www.baidu.com’,port = 443):URL超过了最大重试次数。由代理错误(‘无法连接到代理服务器。’,NewConnectionError(‘:无法建立新的连接:[WinError 10061]无法连接’。))
二. 原因分析
1. 代理demo编写不规范
任何情况下都不能排除人为因素,因为人为的编写不规范从而导致连接不上,好好检查代码,按照代理商给的例子书写。
2. ip被封
首先想到的原因就是IP被封掉了,这个无可厚非,既然我们使用伪装的IP进行爬虫作业,不可避免的会被浏览器识别出来并加入黑名单。
2. 连接超限
根据异常描述里提到的 HTTP 连接池的问题,很可能是连接数超过最大限制。这是因为我们发起的请求默认情况下连接是Keep-alive(保活)的,所以这就导致了服务器保持了太多连接而不能再新建连接。
三. 解决办法
办法千千万,原理就一个:想办法让浏览器认为你的操作并不是同一个IP频繁发起的网页攻击,防止IP被封。
下面的方法并不是非你即我的,可以任选其一,也可以全部都用上。引申一点,常见的反爬虫的破解思路也大如此,值得好好学习一下。
方法一:伪装Headers
针对具备【身份