如何在python中发送post请求?

如何在python中发送post请求?,python,exception,post,request,timeout,Python,Exception,Post,Request,Timeout,我想用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/2010010

我想用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时,会显示一个hostpot页面,我应该输入我的用户并通过,之后,我的连接正常,我可以使用网络。)
我该怎么办?

我认为您对该网站的请求太多,每次请求后都要暂停一段时间,然后进行检查

您可以通过以下方式添加暂停:-

import time
time.sleep(5)        #5 in seconds

看看你的循环,你正在淹没服务器。要发送的请求太多了。这不是你在写的算法,这是拒绝服务攻击。大多数服务器都有针对这种情况的保护措施,它们只是在阻止您。如果不是服务器,你的热点就是罪魁祸首


回答您的问题:问题可能不在您这边,您只是触发了安全性,因为您发送了太多的请求

请考虑您的代码在您发布到的服务器上的显示方式。。。来自同一发送方且参数相似的大量请求连续发送,没有延迟;服务器可能会将此视为滥用并限制或禁止请求,这并不奇怪。即使在服务器上没有智能节流和速率限制,反复发出此类请求也很可能耗尽服务器的可用资源(例如,由于您试图“保持”这些连接,服务器可能会耗尽可用套接字)

要解决此问题,您需要做三件事:

  • 在代码中添加速率限制
  • 在代码中添加错误处理
  • 添加指数回退
  • 速率限制

    简言之,在请求之间有意识地中断。例如:

     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)
    
    sleep\u time\u seconds=3
    而应发送请求():
    如果尝试发送请求():
    睡眠时间秒=3
    elif睡眠时间秒<最大睡眠时间秒:
    睡眠时间秒*=2
    时间。睡眠(睡眠时间秒)
    
    requests模块通常希望
    data
    参数为
    dict
    btw。您不需要将其格式化为JSON。@Kendas,这取决于请求库的版本;此外,使用dict表示“数据”将导致对其进行形式编码;如果目的是将dict呈现为JSON,则应使用“JSON”关键字参数。@MichaelAaronSafyan很高兴知道。谢谢