Python - 是否可以在"超过url请求的Max重试后自动重试

时间:2018-06-01 22:19:03

标签: python python-requests

所以基本上我有一个用于检查网站更改等的监视器 - https://helloworld.com/password - 检查每隔xx分钟以查看网址是否已更改。

过了一段时间它结束了:

HTTPSConnectionPool: Max retries ex
urllib3.connection.VerifiedHTTPSConnection object at 0x00000001A46BC8
60] A connection attempt failed because the connected party did not p
onnection failed because connected host has failed to respond',))

基本上我的代码看起来非常简单:

def checker(url):
     while True:
            keep_checking = requests.get('https://{}.com'.format(url))
            if ('password' in keep_checking.url):
                randomtime = random.randint(6, 60)
                log(Fore.WHITE + 'Password still up on %s, retrying in %d secs' % (url, randomtime))
                time.sleep(randomtime)

            else:
                log(Fore.GREEN + '%s\'s Password page is gone!!' % url)
                break

所以基本上我怎样才能重试脚本以在Max重试失败后继续检查?我想也许解决方案是再次运行该方法?

2 个答案:

答案 0 :(得分:1)

正如J. Owens建议的那样,您可以使用try / except块从异常中恢复,这样如果发生异常,except块将使程序继续while循环的开头。

为了实现这一目标,请替换:

keep_checking = requests.get('https://{}.com'.format(url))

使用:

keep_checking = None
try:
    keep_checking = requests.get('https://{}.com'.format(url))
except requests.ConnectionError:
    print("Received ConnectionError. Retrying...")
    continue

请注意,通过此代码更改,while循环将永远循环,因此您可能希望将循环限制为特定次数的尝试。

答案 1 :(得分:0)

您似乎正在根据错误消息汇总不存在的网址。

代码中的以下行不会在初始url中产生“password”,除非正确组装的url会将您重定向到优雅,这是值得怀疑的。

keep_checking = requests.get('https://{}.com'.format(url))

根据您的参数网址,您可能需要提供完整的网址,而不是预定义的 https .com

很难说您是否尝试按原样运行此代码(作为更大文件的一部分),或者在此处修改它以进行粘贴。但总的来说,打开一个已知的url来查看url更改是否显得异常,并且实际上只能在优雅地重定向您的页面上工作。在这种情况下,您可以“只”检查正确的300块或404响应代码300 Response codes

假设您正在尝试查看是否重定向到另一个页面(这要求您正在点击的网址会正确执行此操作而不会抛出例如404)

你应该例如将其更改为以下

keep_checking = requests.get(url)

并提供完整的网址,例如“https://www.hello-world.com/password” 现在,如果此页面不存在,您可能会被重定向,那么可能最终会出现在不包含密码的页面上。

可能会发生大量错误,重定向,超时,404s aso。鉴于您可能不想将其用于静态网页,您应该尝试捕捉一些常见问题,而不仅仅是您现在看到的错误。