在Python中的POST方法:errno 104

在Python中的POST方法:errno 104

问题描述:

我想在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的请求,但到目前为止我被卡住了。任何提示将不胜感激!

我刚刚发现我没有以正确的格式传递数据。我认为它需要存储在dict;事实并非如此,因此我之前尝试过的方法要简单得多。

随着urllib

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

随着requests

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