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

时间:2017-08-24 08:17:34

标签: python python-requests socks

我使用的request.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循环事件,检查是否存在超时或其他代理错误,然后重试帖子直到完成。 我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您理解正确,检查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)

答案 1 :(得分:0)

没有任何检查:

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代理而不是列表。它应该在循环中调用,因此代理将一直被重新获取..

如果我想知道实际上正在发生我会有一个这些袜子代理的列表,我会循环它们我可以记录我使用的

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')