如何使用 python 请求通过另一个代理重试连接?

Posted

技术标签:

【中文标题】如何使用 python 请求通过另一个代理重试连接?【英文标题】:How to make retry connecting through another proxy using python requests? 【发布时间】:2017-08-24 08:17:34 【问题描述】:

我正在使用 requests.post 和这样的随机代理:

url = "http://localhost"
socks = " "http": "random_socks()" "
payload =  "status" : "1" 
headers =  "user-agent" : "useragent"

post = requests.post(url, payload=json.dumps(payload), headers=headers, proxies=socks)

print post.text

如果有一些代理相关的错误,我需要使用带有随机袜子的帖子并重试,直到完成。

据我了解:需要用 post 循环事件,检查是否有超时或其他代理错误,然后重试 post 直到它完成。 我该怎么做?

【问题讨论】:

我需要在不使用 socks 变量中的多个代理的情况下这样做 【参考方案1】:

没有任何检查:

retries = 5
post = None
for i in range(retries):
    try:
        post = requests.post(url, payload=json.dumps(payload), 
                             headers=headers, proxies=socks)
        print(post.text)
        break
    except:
        pass
    time.sleep(xxx)
else:
    print('no fetch')

应该这样做,但我不确定 socks = " "http": "random_socks()" " 应该是什么意思我猜random_socks() 是一个函数,所以调用应该不同

post = requests.post(url, payload=json.dumps(payload), 
                     headers=headers, proxies="http": random_socks()) 

random_socks() 应该返回 1 个 http 代理而不是列表。应该在循环中调用它,这样代理就会一直被重新获取..

如果我想知道实际发生的情况,我会列出这些 socks 代理的列表,然后循环遍历它们,我可以记录我正在使用哪一个

for each_proxy in list_of_proxies:
    try:
        post = requests.post(url, payload=json.dumps(payload), 
                             headers=headers, proxies='http':each_proxy  )
        print(post.print)
        break
    except:
        time.sleep(1)
else:
    print('no data')

【讨论】:

【参考方案2】:

你理解的没错,检查requests.post 中的错误,如果出现代理错误,则使用另一个代理重试。例如使用递归:

from requests.exceptions import ProxyError

def post_proxy(url, payload, headers):
    try:
        post = requests.post(url, payload=json.dumps(payload), headers=headers, 
                             proxies="http": random_socks())
        return post.text
    except ProxyError:
        return post_proxy(url, payload, headers)

url = "http://localhost"
payload = "status": "1"
headers = "user-agent": "useragent"
print post_proxy(url, payload, headers)

【讨论】:

以上是关于如何使用 python 请求通过另一个代理重试连接?的主要内容,如果未能解决你的问题,请参考以下文章

Python请求库遇到重试限制时如何访问服务器响应

Scala - 使用超时重试HTTP请求

Python Scrapy 不会重试超时连接

如何配置 NSURLSession 请求在连接断开时的重试尝试?

Spring Cloud Feign 重试机制-如何实现请求重试

Python之如何优雅的重试