请求时超出最大重试次数

310 投票
19 回答
1178769 浏览
提问于 2025-04-18 02:21

我正在尝试获取 App Store > 商业 的内容:

import requests
from lxml import html

page = requests.get("https://itunes.apple.com/in/genre/ios-business/id6000?mt=8")
tree = html.fromstring(page.text)

flist = []
plist = []
for i in range(0, 100):
    app = tree.xpath("//div[@class='column first']/ul/li/a/@href")
    ap = app[0]
    page1 = requests.get(ap)

当我使用 range 设置为 (0,2) 时,它可以正常工作,但当我把 range 设置为 100 时,就出现了这个错误:

Traceback (most recent call last):
  File "/home/preetham/Desktop/eg.py", line 17, in <module>
    page1 = requests.get(ap)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='itunes.apple.com', port=443): Max retries exceeded with url: /in/app/adobe-reader/id469337564?mt=8 (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)

19 个回答

42

我用 pip install pyopenssl 这个命令解决了我的问题。

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

47

我遇到了类似的问题,不过下面的代码对我有效。

url = <some REST url>    
page = requests.get(url, verify=False)

这里的"verify=False"是用来关闭SSL验证的。你可以像往常一样添加try和catch来处理错误。

49

只需这样做,

把下面的代码替换掉 page = requests.get(url)

import time

page = ''
while page == '':
    try:
        page = requests.get(url)
        break
    except:
        print("Connection refused by the server..")
        print("Let me sleep for 5 seconds")
        print("ZZzzzz...")
        time.sleep(5)
        print("Was a nice sleep, now let me continue...")
        continue

不客气 :)

214

这里发生的事情是itunes服务器拒绝了你的连接(因为你在短时间内从同一个IP地址发送了太多请求)

最大重试次数已超过,网址是:/in/app/adobe-reader/id469337564?mt=8

错误信息有点误导,应该是类似“无法建立连接,因为目标机器主动拒绝了它”的提示。

在Github上有一个关于python.requests库的问题,可以在这里查看。

要解决这个问题(其实不算是问题,主要是错误信息让人困惑),你应该捕获与连接相关的异常,像这样:

try:
    page1 = requests.get(ap)
except requests.exceptions.ConnectionError:
    r.status_code = "Connection refused"

另外一个解决这个问题的方法是,在发送请求到服务器时,给请求之间留足够的时间间隔,可以通过在python中使用sleep(timeinsec)函数来实现(别忘了导入sleep)

from time import sleep

总的来说,requests是一个很棒的python库,希望这能解决你的问题。

300

只需使用 requests 的功能就可以了:

import requests
from requests.adapters import HTTPAdapter
from 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)

这段代码会去访问一个网址,如果遇到 requests.exceptions.ConnectionError 的错误,它会尝试重新连接3次。backoff_factor 的作用是帮助在每次尝试之间加一些延迟,这样可以避免在请求频繁的情况下再次失败。

你可以看看 urllib3.util.retry.Retry,它提供了很多选项,可以让重试变得更简单。

撰写回答