2017-09-26 86 views
0

我想在Python中查詢網站。我需要使用POST方法(根據當我使用開發人員工具監視它時瀏覽器中發生的情況)。在Python中的POST方法:errno 104

如果我查詢與捲曲的網站,它工作得很好:

curl -i --data "param1=var1&param2=var2" http://www.test.com 

我得到這樣的標題:

HTTP/1.1 200 OK 
Date: Tue, 26 Sep 2017 08:46:18 GMT 
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.26.1a mod_fastcgi/2.4.2 PHP/4.3.11 
Transfer-Encoding: chunked 
Content-Type: text/html 

但是,當我在Python 3做,我得到一個錯誤104。

這是我到目前爲止所嘗試的。首先,urllib(從this thread獲得靈感來管理使用POST方法而不是GET):

import re 
from urllib import request as ur 

# URL to handle request                      
url = "http://www.test.com" 
data = "param1=var1&param2=var2" 

# Build a request dictionary 
preq = [re.findall("[^=]+", i) for i in re.findall("[^\&]+", data)] 
dreq = {i[0]: i[1] if len(i) == 2 else "" for i in preq} 

# Initiate request & add method 
ureq = ur.Request(url)                      
ureq.get_method = lambda: "POST"                   
# Send request                        
req = ur.urlopen(ureq, data=str(dreq).encode())                

我也基本相同與requests

import re 
import requests 

# URL to handle request                      
url = "http://www.test.com" 
data = "param1=var1&param2=var2" 

# Build a request dictionary 
preq = [re.findall("[^=]+", i) for i in re.findall("[^\&]+", data)] 
dreq = {i[0]: i[1] if len(i) == 2 else "" for i in preq} 

# Initiate request & add method 
req = requests.post(url, data=dreq)                

在這兩種情況下,我得到一個HTTP 104錯誤:

ConnectionResetError: [Errno 104] Connection reset by peer 

我不明白,因爲相同的請求正在使用cURL。我想我誤解了Python的請求,但到目前爲止我被卡住了。任何提示將不勝感激!

回答

0

我剛剛發現我沒有以正確的格式傳遞數據。我認爲它需要存儲在dict;事實並非如此,因此我之前嘗試過的方法要簡單得多。

隨着urllib

req = ur.urlopen(ureq, data=str(data).encode()) 

隨着requests

req = requests.post(url, data=data)