如何使用 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 请求通过另一个代理重试连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 NSURLSession 请求在连接断开时的重试尝试?