我想在python中循环发送post请求 这是我的代码
import json
import requests
url = "http://club.raakdarou.com/users/main/GettingGift"
number=2237499999970255
headers={'Host': 'sample.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0',
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://sample.com/users/main',
'Content-Length': '53',
'Cookie': 'ASP.NET_SessionId=4sirmg5n05fkszmvbasr4vnt; __RequestVerificationToken=AsWNgNzLVjU8kCNvWvTjn_tJiBlEKE5NH_xO-o7eGkq3h3av7I1e0_qu6NO80SNKfiV-c5Ajm6nlrDE7pFcKFkdr6ZHVX9zXAWYZt79c_pw1',
'Connection': 'keep-alive'}
while(number>=2237400000000000):
number=number-1
data = {'gift': number , 'X-Requested-With' : 'XMLHttpRequest'}
r = requests.post(url, data=json.dumps(data), headers=headers)
print(number)
当我运行此代码时,一切正常,但一段时间后,程序停止(异常发生)并且此错误显示: TimeoutError:[WinError 10060]连接尝试失败,因为连接方未正确响应一段时间后,或建立的连接失败,因为连接的主机无法响应 ..........
(我使用wifi连接到网络,当我连接到我的wifi时,显示主机页面,我应该输入我的用户并通过,之后,我的连接正常,我可以使用网络。) 我该怎么办?
答案 0 :(得分:0)
我认为您向网站提出了太多请求,请在每次请求后暂停一段时间并检查。
您可以通过以下方式添加暂停: -
import time
time.sleep(5) #5 in seconds
答案 1 :(得分:0)
看着你的循环,你就会淹没服务器。这是一个非常多的请求发送。这不是你正在编写的算法,而是DOS攻击。大多数服务器都对此有所保护,并且只是阻止你。如果它不是服务器,那么您的热点就是罪魁祸首。
要回答您的问题:问题可能不在您的最后,您只是触发证券,因为您发送过多的请求
答案 2 :(得分:0)
考虑你的代码如何出现在你要发布的服务器上......很多请求都是连续发送的,没有来自同一个发送者和类似参数的延迟;服务器可能会认为这是滥用并限制或禁止请求也就不足为奇了。即使在服务器上没有智能限制和速率限制,很可能一次又一次地发出这样的请求可能会耗尽服务器的可用资源(例如,因为你试图" Keep-Alive&#34 ;这些连接,服务器可能会耗尽可用的套接字。)
要解决此问题,您需要做三件事:
<强>速率限制强>
简而言之,请求之间有意间隔。例如:
sleep_time_seconds = 3
while should_send_requests():
send_request()
time.sleep(sleep_time_seconds)
错误处理
请求可能会失败。您的代码应该正确处理它。
def try_send_request():
try:
send_request()
return True
except requests.RequestException as e:
# ...
return False
# ...
sleep_time_seconds = 3
while should_send_requests():
try_send_request()
time.sleep(sleep_time_seconds)
指数后退
发生错误时,您应该增加请求之间的时间:
sleep_time_seconds = 3
while should_send_requests():
if try_send_request():
sleep_time_seconds = 3
elif sleep_time_seconds < max_sleep_time_seconds:
sleep_time_seconds *= 2
time.sleep(sleep_time_seconds)