如何在python中发送post请求?
我想送岗位要求的循环在python 这是我的代码如何在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,一个主机页面出现,我应该进入我的用户和通过,之后,我的连接是好的,我可以使用网络。) 我该怎么办?
我认为你对网站提出太多要求,在每次请求和检查后暂停一段时间。
您可以通过添加暂停: -
import time
time.sleep(5) #5 in seconds
看你的循环,你淹没服务器。这是非常多的请求发送。这不是你正在编写的算法,而是DOS攻击。大多数服务器都有保护措施,并且只是阻止你。如果它不是服务器,那么你的热点是罪魁祸首。
要回答你的问题:这个问题可能不是你的终点,你只是触发证券,因为你发送太多的请求
考虑您的代码是如何出现在服务器到您要留言...很多请求都是连续发送的,没有来自同一个发送者的延迟,并且具有相似的参数;服务器可能会认为这是滥用和扼杀或禁止请求应该不足为奇。即使服务器没有智能限制和速率限制,很可能反复发出这样的请求可能会耗尽服务器的可用资源(例如,因为您试图“保持活动”这些连接,服务器可能会运行没有可用的套接字)。
要解决这个问题,你需要做三件事情:
- 添加限速在你的代码。
- 在您的代码中添加错误处理。
- 添加指数回退。
限速
总之,采取请求之间的故意中断。例如:
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)
非常感谢你(在代码中添加错误处理)帮助了我 –
的'requests'模块普遍预计的'data'参数成为'dict'顺便说一句。您无需将其格式化为JSON。 – Kendas
@Kendas依赖于请求库的版本;同样,使用“数据”字典将导致它被编码;如果意图是将字典呈现为JSON,则应该使用“json”关键字参数。 –
@MichaelAaronSafyan很高兴知道。谢谢。 – Kendas