如何在python中发送帖子请求?

时间:2017-06-15 07:05:35

标签: 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/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时,显示主机页面,我应该输入我的用户并通过,之后,我的连接正常,我可以使用网络。) 我该怎么办?

3 个答案:

答案 0 :(得分:0)

我认为您向网站提出了太多请求,请在每次请求后暂停一段时间并检查。

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

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

答案 1 :(得分:0)

看着你的循环,你就会淹没服务器。这是一个非常多的请求发送。这不是你正在编写的算法,而是DOS攻击。大多数服务器都对此有所保护,并且只是阻止你。如果它不是服务器,那么您的热点就是罪魁祸首。

要回答您的问题:问题可能不在您的最后,您只是触发证券,因为您发送过多的请求

答案 2 :(得分:0)

考虑你的代码如何出现在你要发布的服务器上......很多请求都是连续发送的,没有来自同一个发送者和类似参数的延迟;服务器可能会认为这是滥用并限制或禁止请求也就不足为奇了。即使在服务器上没有智能限制和速率限制,很可能一次又一次地发出这样的请求可能会耗尽服务器的可用资源(例如,因为你试图" Keep-Alive&#34 ;这些连接,服务器可能会耗尽可用的套接字。)

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

  1. 在代码中添加速率限制。
  2. 在代码中添加错误处理。
  3. 添加指数退避。
  4. <强>速率限制

    简而言之,请求之间有意间隔。例如:

     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)