背景

这是我在使用Python爬取网页信息的时候出现的异常。

由于很多要爬取的网站会把“IP限制”作为反爬虫手段,所以我偶尔会使用“代理IP服务器”去处理相关需求,因为我觉得每次都 time.sleep(10) 太漫长,对频繁且大量的请求十分不友好。

推荐代理服务器:

  • 太阳HTTP - 全国优质代理IP服务商
  • 四叶天 - 一站式HTTP代理服务提供商

正文

针对这个问题,我查阅了许多前辈的博客,并且亲自编写的了大量代码测试,总结出了下面的几种场景。

一. 异常描述

下面在控制台打印的异常信息,为了隐藏公司真实场景,我把请求地址换成了“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

针对具备【身份辨别】功能的反爬虫页面,在请求的时候,需要伪装Headers才能进行访问,否则请求会被拒绝。所以我们再每次请求的时候,随机一个 'user-agent'。

解释下user-agent,中文名为用户代理,它存在的目的就是:让服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等信息。如果没有,就说明请求不是来自有浏览器,那就可能是接口请求。

部分反爬虫技术,就是通过user-agent去鉴别浏览器身份,识别浏览器的请求是否合法。

# 常见的 user-agent 列表
headers_list = [{'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (iPad; CPU OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/87.0.4280.77 Mobile/15E148 Safari/604.1'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.109 Safari/537.36 CrKey/1.54.248666'}, {'user-agent': 'Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.188 Safari/537.36 CrKey/1.54.250320'}, {'user-agent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+'}, {'user-agent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+'}, {'user-agent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}, {'user-agent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}, {'user-agent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true'}, {'user-agent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)'}, {'user-agent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.158 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 11; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36'}, {'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1'}, {'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}, {'user-agent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'}
]headers = random.choice(headers_list)

以“豆瓣电影一周排行榜”为例,伪装了headers之后,我们能正常爬取出电影的排名信息(data仅用于展示效果,还未做数据清洗):

url = 'https://movie.douban.com/chart'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
ret = Request(url, headers=headers)
res = urlopen(ret)
data = res.read().decode('utf-8')
print(data)

尝试一下去掉代码中的“headers”伪装直接打开url,看看能不能爬到信息?答案是:打不开,会出现“urllib.error.HTTPError: HTTP Error 418”异常。

url = 'https://movie.douban.com/chart'
res = urlopen(url)
data = res.read().decode('utf-8')
print(data)

方法二:伪装IP

         正常的ip不可能在1秒之内请求同一个网页100次,哪怕10次也不可能,反爬技术正是针对这一场景进行IP的封锁,所以我们能做的,就是降低同一个IP的使用频率。

  • 如果非要用同一IP,那就:循环抓错,重复请求,逐步延长等待时间
def get_url(url, headers):try:# 超时设置为10秒response = requests.get(url, headers=headers, timeout=10)  except:# 循环去请求网站for i in range(4):# 延长等待时间,超时设置为20秒response = requests.get(url, headers=headers, timeout=20)if response.status_code == 200:breakhtml_str = response.textreturn html_str
  • 如果不要求同一IP,那当然是:换一个新的IP

        如果在使用代理IP的时候出现拒绝访问的字样,那就说明服务器已经抓取到你真实的IP地址,在这种情况下,只有再一次更换IP地址才能继续访问。

或者,就是使用的代理IP已经被很多人使用过了,所以才会被浏览器封掉,一般这种情况多出现在免费代理IP上。

# 多申请几个ip,依此循环使用,或者每次随机一个使用
ips_list = [ip1, ip2, ip3, ip4, ip5]
ip = random.choice(ips_list)

Python代理IP异常:requests.exceptions.ProxyError: HTTPSConnectionPool(host=‘xxxx‘, port=443)相关推荐

  1. 解决python爬虫requests.exceptions.SSLError: HTTPSConnectionPool(host=‘XXXXXXX‘, port=443)问题

    报错如下 Traceback (most recent call last):File "C:/Users/17653/Desktop/测试.py", line 23, in &l ...

  2. 解决requests.exceptions.SSLError: HTTPSConnectionPool(host=xxxxx‘, port=443): Max retries exceeded

    问题描述 使用scrapy框架时报错SSL,于是另起一个文件,使用requests,报错requests.exceptions.SSLError: HTTPSConnectionPool(host=' ...

  3. 关于requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题

    在运行一下代码的时候,会进行报错 requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443) 解决方法如下: 1.先 ...

  4. requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题

    具体报错是这样的: requests.exceptions.SSLError: HTTPSConnectionPool(host='某某某网站', port=443):Max retries exce ...

  5. requests.exceptions.SSLError: HTTPSConnectionPool(host=‘XXX‘, port=443)

    运行代码 import requestsresponse = requests.get("https://www.baidu.com") print(response.status ...

  6. 解决Python3 urllib3 urllib3.exceptions.maxretryerror: httpsconnectionpool(host=‘xxxxx‘, port=443)

    报错原因 ​ 在使用代理进行请求时,代理只通过HTTP请求,此时请求进行HTTPS验证时验证失败. 两种解决方案 在1.25版本之前,请求时不会进行HTTPS验证.故可降低urllib3版本. pip ...

  7. requests.exceptions.ConnectionError:HTTPSConnectionPool(host

    requests.exceptions.ConnectionError: HTTPSConnectionPool(host= 应用场景(爬虫一) 使用requests.get()请求链接报错,具体不知 ...

  8. 已解决(Python爬虫requests报错)requests.exceptions.ProxyError: HTTPSConnectionPool

    成功解决(Python爬虫requests报错):requests.exceptions.ProxyError: HTTPSConnectionPool 文章目录 报错信息 报错翻译 报错原因 解决方 ...

  9. Python requests ip代理爬虫报错 HTTPSConnectionPool(host=‘xxxxx‘, port=443) Max retries exceed

    本人系统:macOS10.15.6 Catalina 场景:使用Python requests 包+ip代理池爬取网站数据 出现报错:HTTPSConnectionPool(host='xxxxx', ...

最新文章

  1. python中国大学排名爬虫写明详细步骤-【Python爬虫】从html里爬取中国大学排名...
  2. 计算机基础教育德育教学,【家庭教育论文】计算机基础教学的德育教育(共2650字)...
  3. Spring事务管理器分类
  4. 设置TextView文字
  5. sql over函数_SQL 高级函数
  6. SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】...
  7. HTML+CSS制作炫彩的数字时钟
  8. java二维数组详解
  9. 【网络】PFC背景和原理 、文档(DCB=PFC + ETS,DCBX=DCB扩展)
  10. 几何公差学习笔记(二)-- 公差带的定义、标注和解释
  11. 夕阳美,美到骨子里了
  12. 开发神技能 | Python Mock 的入门
  13. l2行情接口选哪个比较好?
  14. python——数据分析(一)
  15. 同义词、近义词、反义词词典
  16. php怎么不能右键,win10电脑右键没反应怎么办
  17. java map.put map_Java Map put()用法及代码示例
  18. C语言程序设计-多项式乘法系统模拟系统01
  19. 群集服务器作用,使用集群服务器的必要性是什么?其优缺点是什么?
  20. php 判断键值重复合并,php数组实现根据某个键值将相同键值合并生成新二维数组的方法...

热门文章

  1. ../和./和~/的含义
  2. 爬虫之js加密参数破解练习-百度指数爬虫(附完整源码)
  3. JSbridge原理
  4. 通信教程 | SPI接口说明及原理
  5. H.264 NAL层解析(0x00000001,编码,打包,NALU)
  6. 拉勾教育大数据高薪训练营学习心得与笔记(开启属于自己的The Way To God)
  7. uni-app图片、视频上传
  8. struts.* 基础(by cju)
  9. Android10 开机向导流程
  10. 我靠加班把老员工弄走了,昨天老板又给我画饼,一天天浑浑噩噩,Android开发究竟还有前途吗?