首页 > 解决方案 > 请求重试:将使用相同的代理

问题描述

在使用 Requests 库时,我不断看到与此类似的示例来添加重试。但是,我不确定请求是否会choice(my_proxy_list)在每次重试时执行,从而获得一个新的代理,或者只是继续使用与初始请求相同的参数重试。

import my_proxy_list
from random import choice
import requests
from requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter

session = requests.Session()
retries = Retry(total=5, backoff_factor=0.4, status_forcelist=[400, 429, 500, 502, 503, 504])
session.mount("http://", HTTPAdapter(max_retries=retries))
response = session.get(
    url=url,
    proxies=choice(my_proxy_list),
    timeout=(10, 27),
)
session.close()

标签: pythonpython-requests

解决方案


函数参数被评估一次,无论该函数稍后会做什么(包括函数可能在内部使用的任何重试逻辑),因此random.choice在您的示例中只会被调用一次。

如果您每次都想要一个(有机会)不同的代理,最好的选择是执行您自己的random.choice每次调用的重试逻辑。为了保证每次都使用不同的代理,您可以在开始时打乱可能的代理列表,然后遍历它。

或者,可以传入一个类似字典的对象,proxies每次__getitem__都设计为返回一个随机代理,但不建议使用这种方法,因为它非常脆弱,并且会严重依赖session.get.


推荐阅读