2017-06-15 217 views
-2

我想送崗位要求的循環在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,一個主機頁面出現,我應該進入我的用戶和通過,之後,我的連接是好的,我可以使用網絡。) 我該怎麼辦?

+0

的'requests'模塊普遍預計的'data'參數成爲'dict'順便說一句。您無需將其格式化爲JSON。 – Kendas

+2

@Kendas依賴於請求庫的版本;同樣,使用「數據」字典將導致它被編碼;如果意圖是將字典呈現爲JSON,則應該使用「json」關鍵字參數。 –

+0

@MichaelAaronSafyan很高興知道。謝謝。 – Kendas

回答

0

我認爲你對網站提出太多要求,在每次請求和檢查後暫停一段時間。

您可以通過添加暫停: -

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

看你的循環,你淹沒服務器。這是非常多的請求發送。這不是你正在編寫的算法,而是DOS攻擊。大多數服務器都有保護措施,並且只是阻止你。如果它不是服務器,那麼你的熱點是罪魁禍首。

要回答你的問題:這個問題可能不是你的終點,你只是觸發證券,因爲你發送太多的請求

0

考慮您的代碼是如何出現在服務器到您要留言...很多請求都是連續發送的,沒有來自同一個發送者的延遲,並且具有相似的參數;服務器可能會認爲這是濫用和扼殺或禁止請求應該不足爲奇。即使服務器沒有智能限制和速率限制,很可能反覆發出這樣的請求可能會耗盡服務器的可用資源(例如,因爲您試圖「保持活動」這些連接,服務器可能會運行沒有可用的套接字)。

要解決這個問題,你需要做三件事情:

  1. 添加限速在你的代碼。
  2. 在您的代碼中添加錯誤處理。
  3. 添加指數回退。

限速

總之,採取請求之間的故意中斷。例如:

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) 
+0

非常感謝你(在代碼中添加錯誤處理)幫助了我 –