Python requests“Max retries exceeded with url” error

本文介绍了解决Python网络请求超时问题的方法,包括增加重试次数、关闭多余连接等,并提供了使用代理访问受限网站的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

error1:

NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x00000000038F2B00>: Failed to establish a new connection:[WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。',))

解决办法:

session.keep_alive=False

error2:

python hostname doesn't match either of  facebookXXXXX

解决办法:

importssl

ssl.match_hostname =lambdacert, hostname:True

多方查阅后发现了解决问题的原因:http连接太多没有关闭导致的。

解决办法:

1、增加重试连接次数

  requests.adapters.DEFAULT_RETRIES = 5

2、关闭多余的连接

requests使用了urllib3库,默认的http connection是keep-alive的,requests设置False关闭。

s = requests.session()

s.keep_alive =False

3、只用session进行操作。即只创建一个连接,并设置最大连接数或者重试次数。

import requests 

from requests.adapters import HTTPAdapter

from requests.packages.urllib3.util.retry import Retry

session = requests.Session()

retry = Retry(connect=3, backoff_factor=0.5)

adapter = HTTPAdapter(max_retries=retry)

session.mount('http://', adapter)

session.mount('https://', adapter)

session.get(url)

import  requests  

from  requests.adapters  import  HTTPAdapter

from  requests.packages.urllib3.util.retry  import  Retry 

 s = requests.Session() 

 retry = Retry(connect =5, backoff_factor =1) 

 adapter = HTTPAdapter(max_retries = retry) 

 s.mount('http://', adapter) 

 s.keep_alive =False

res = s.post(self.conn.host +'/sign-in', data = json.dumps({'name':"XXX",'pwd':"XXX"})) 

 response = res.json()

但是在starkoverflow上有人给出了这样的解释。

4.安装 py

pip install -U pyopenssl

5、设定固定的睡眠时间在发送请求之间

https://github.com/requests/requests/issues/4246#event

https://stackoverflow.com/questions/23013220/max-retries-exceeded-with-url


在爬取boss直聘时出现这种错误,总结如下: 

1.http连接太多没有关闭导致的,解决方法:

import requests

requests.adapters.DEFAULT_RETRIES =5    # 增加重连次数

s = requests.session()

s.keep_alive = False   # 关闭多余连接

s.get(url)# 你需要的网址

2.访问次数频繁,被禁止访问,解决方法:使用代理

import requests

s = requests.session()

url ="https://mail.163.com/"

s.proxies= {"https":"47.100.104.247:8080","http":"36.248.10.47:8080", }

s.headers= header

s.get(url)

查找代理的网址:http://ip.zdaye.com/shanghai_ip.html#Free 

使用代理时需注意:1.代理分为http和https两种,不能用混,如果把http的代理用作https也是会报上面的错误;2.上面的代理以字典格式传入,例如上面的例子,可以是“47.100.104.247:8080”这种格式,也可以是“https://47.100.104.247:8080”这种格式;3.如果代理不可用一样会报上面的错误。以下方法判断代理是否可用:

import requests

s = requests.session()

url ="https://mail.163.com/"

s.keep_alive = False

s.proxies= {"https":"47.100.104.247:8080","http":"36.248.10.47:8080", }

s.headers= header

r = s.get(url)

print(r.status_code)    # 如果代理可用则正常访问,不可用报以上错误


升级

pip install  --upgrade  requests


如果同一ip访问次数过多也会封ip,这里就要用代理了proxies,python很简单,直接在请求中带上proxies参数就行,

r = requests.get(url, headers=headers, cookies=cookies,proxies = proxies)

代理ip的话,给大家推荐个网站

http://www.data5u.com/

最下方会有20个免费的,一般小爬虫够用了,使用代理就会出现代理连接是否通之类的问题,需要在程序中添加下面的代码,设置连接时间

requests.adapters.DEFAULT_RETRIES =5

s = requests.session()

s.keep_alive = False

from bs4 import BeautifulSoup

import json,requests,sys

reload(sys)

sys.setdefaultencoding('utf-8')

list =[22711693,24759450,69761921,69761921,22743334,66125712,22743270,57496584,75153221,57641884,66061653,70669333,57279088,24740739,66126129,75100027,92667587,92452007,72345827,90004047,90485109,90546031,83527455,91070982,83527745,94273474,80246564,83497073,69027373,96191554,96683472,90500524,92454863,92272204,70443082,96076068,91656438,75633029,96571687,97659144,69253863,98279207,90435377,70669359,96403354,83618952,81265224,77365611,74592526,90479676,56540304,37924067,27496773,56540319,32571869,43611843,58612870,22743340,67293664,67292945, 57641749,75157068,58934198,75156610,59081304,75156647,75156702,67293838,]

returnList = []

proxies = {

    # "https": "http://14.215.177.73:80",    "http": "http://202.108.2.42:80",

}

headers = {

    'Host': 'www.dianping.com',

    'Referer': 'http://www.dianping.com/shop/22711693',

    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/535.19',

    'Accept-Encoding': 'gzip'}

cookies = {

    '_lxsdk_cuid': '16146a366a7c8-08cd0a57dad51b-32637402-fa000-16146a366a7c8',

    'lxsdk': '16146a366a7c8-08cd0a57dad51b-32637402-fa000-16146a366a7c8',

    '_hc.v': 'ec20d90c-0104-0677-bf24-391bdf00e2d4.1517308569',

    's_ViewType': '10',

    'cy': '16',

    'cye': 'wuhan',

    '_lx_utm': 'utm_source%3DBaidu%26utm_medium%3Dorganic',

    '_lxsdk_s': '1614abc132e-f84-b9c-2bc%7C%7C34'}

requests.adapters.DEFAULT_RETRIES = 5

s = requests.session()

s.keep_alive = False

for i in list:

    url = "https://www.dianping.com/shop/%s/review_all" % i

    r = requests.get(url, headers=headers, cookies=cookies,proxies = proxies)

    # print r.text    soup = BeautifulSoup(r.text, 'lxml')

    lenth = soup.find_all(class_='PageLink').__len__() + 1    

    #print lenth    for j in xrange(lenth):

        urlIn = "http://www.dianping.com/shop/%s/review_all/p%s" % (i, j)

        re = requests.get(urlIn, headers=headers, cookies=cookies,proxies =proxies)

        soupIn = BeautifulSoup(re.text, 'lxml')

        title = soupIn.title.string[0:15]

        #print title        coment = []

        coment = soupIn.select('.reviews-items li')

        for one in coment:

            try:

                if one['class'][0]=='item':

                    continue

            except(KeyError),e:

                pass

            name = one.select_one('.main-review .dper-info .name')

            #print name.get_text().strip()            name = name.get_text().strip()

            star = one.select_one('.main-review .review-rank span')

            #print star['class'][1][7:8]            star = star['class'][1][7:8]

            pl = one.select_one('.main-review .review-words')

            pl['class'] = {'review-words'}

            words = pl.get_text().strip()

            returnList.append([title,name,star,words])file = open("/Users/huojian/Desktop/store_shop.sql","w")for one in returnList:

    file.write("\n")

    file.write(unicode(one[0]))

    file.write("\n")

    file.write(unicode(one[1]))

    file.write("\n")

    file.write(unicode(one[2]))

    file.write("\n")

    file.write(unicode(one[3]))

    file.write("\n")

### 出现 `Max retries exceeded` 错误的原因 当使用 Python 的 `requests` 库发起 HTTP 请求时,如果目标服务器无法正常响应或者网络连接存在问题,则可能会触发 `MaxRetriesExceededError` 异常。这种错误通常表明客户端尝试多次重新连接到指定的 URL 都失败了。 常见的原因包括但不限于以下几点[^2]: - **错误的 URL**: 如果输入的目标地址不正确或不可访问。 - **SSL 证书验证问题**: 当请求需要 SSL/TLS 加密通信而未提供有效的认证文件时会引发此问题。 - **网络波动或中断**: 不稳定的互联网环境可能导致数据包丢失从而造成超时现象。 - **过多并发请求或服务端负载过高**: 过度频繁地向同一资源发出大量查询可能使对方拒绝进一步的服务请求。 针对上述情况有多种方法可以缓解该类异常的发生: --- ### 解决方案概述 #### 方法一:确认并修正URL路径准确性 确保所提供的链接绝对无误,并且能够被成功解析指向实际存在的网页位置。 #### 方法二:禁用SSL验证 (需谨慎操作) 对于某些特殊场景下不需要严格遵循安全协议的情况,可以通过设置参数来跳过HTTPS握手过程中的身份校验环节。然而这样做存在潜在风险,请仅限于测试环境中应用此项调整: ```python response = requests.get('https://example.com', verify=False) ``` > 注意: 关闭ssl验证虽然能暂时规避部分因加密机制引起的麻烦,但从长远来看并不推荐作为常规手段. #### 方法三:优化网络状况下的鲁棒性设计 通过引入重试策略增强程序抵抗瞬态故障的能力。下面展示了一个利用urllib3内置功能实现自定义最大尝试次数的例子[^3]: ```python from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() retry_strategy = Retry( total=5, status_forcelist=[429, 500, 502, 503, 504], method_whitelist=["HEAD", "GET", "OPTIONS"], backoff_factor=1 ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("http://", adapter) session.mount("https://", adapter) try: response = session.get('https://example.com') except Exception as e: print(f"An error occurred while making the request:{e}") finally: session.close() ``` 在此配置里设置了总共允许最多五次额外努力机会;列举出了哪些HTTP状态码应该促使再次发送同样的指令而非立即放弃;规定适用的动作类型列表以及每次等待间隔时间的增长系数(backoff factor). #### 方法四:合理控制请求频率避免压垮远程主机 适当延长两次连续调用之间的时间差有助于减轻目标站点的压力水平,进而减少遭遇封锁的可能性. 可考虑加入随机延时逻辑: ```python import time import random time.sleep(random.uniform(1, 3)) # 让每一次循环间歇期介于一秒至三秒范围内浮动变化 ``` 另外还可以借助代理池技术分散流量来源方向达到相同效果的同时提高抓取效率。 --- ### 总结说明 综上所述,面对`Max retries exceeded with url`这类难题可以从多个角度切入寻找突破口——无论是核实基础信息还是改良现有架构都值得深入探讨实践一番。最终目的是构建更加稳固可靠的自动化流程体系,在保障性能指标达标前提下兼顾用户体验满意度提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值