请求重试:将使用相同的代理

时间:2019-01-04 22:25:31

标签: python python-requests

在使用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()

1 个答案:

答案 0 :(得分:1)

函数参数仅计算一次,而不管该函数以后要做什么(包括该函数可能在内部使用的任何重试逻辑),因此random.choice在您的示例中将仅被调用一次。

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

或者,可以将proxies传递给__getitem__的类似字典的对象,该对象旨在每次返回一个随机代理,但是不建议这样做,因为非常脆弱,将严重依赖session.get的实现细节。