除了ConnectionError或TimeoutError不起作用

时间:2017-09-08 12:57:12

标签: python exception-handling python-requests

如果出现连接错误,我希望Python等待并重试。这是相关的代码,其中“link”是一些链接:

import requests
import urllib.request
import urllib.parse

from random import randint

try:
    r=requests.get(link)

except ConnectionError or TimeoutError:
    print("Will retry again in a little bit")
    time.sleep(randint(2500,3000))
    r=requests.get(link)

除了我仍然定期收到连接错误。我从来没有看到文本“将再次重试”,所以我知道代码不会重新尝试。我究竟做错了什么?我正在粘贴下面的部分错误代码,以防我误读错误。 TIA!

TimeoutError:[WinError 10060]连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败

在处理上述异常期间,发生了另一个异常:

requests.packages.urllib3.exceptions.ProtocolError :('Connection aborted。',TimeoutError(10060,'连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机而建立连接失败没有回复',无,10060,无))

在处理上述异常期间,发生了另一个异常:

requests_exceptions.ConnectionError :('Connection aborted。',TimeoutError(10060,'连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应',无,10060,无))

3 个答案:

答案 0 :(得分:1)

对我来说,在请求中使用自定义用户代理可解决此问题。通过这种方法,您可以欺骗浏览器。

作品:

url = "https://www.nasdaq.com/market-activity/stocks/amd"
headers = {'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4'}
response = requests.get(url, headers=headers)

不起作用:

url = "https://www.nasdaq.com/market-activity/stocks/amd"
response = requests.get(url)

答案 1 :(得分:0)

我认为你应该使用

except (ConnectionError, TimeoutError) as e:
    print("Will retry again in a little bit")
    time.sleep(randint(2500,3000))
    r=requests.get(link)

请参阅this类似问题,或查看docs

答案 2 :(得分:0)

第二个请求不在try块内,因此不会捕获异常。此外,在try-except块中,您还没有发现可能发生的其他异常 您可以使用循环尝试连接两次,如果请求成功则中断。

for _ in range(2):
    try:
        r = requests.get(link)
        break
    except (ConnectionError, TimeoutError):
        print("Will retry again in a little bit")
    except Exception as e:
        print(e)
    time.sleep(randint(2500,3000))