我正在尝试用Python查询网站。我需要使用POST方法(根据我使用开发人员工具监视浏览器时发生的情况)。
如果我用cURL查询网站,它运作良好:
curl -i --data "param1=var1¶m2=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¶m2=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¶m2=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 :(得分:0)
我刚才发现我没有以正确的格式传递数据。我认为它需要存储在dict
;事实并非如此,因此我之前尝试过的事情要简单得多。
使用urllib
:
req = ur.urlopen(ureq, data=str(data).encode())
使用requests
:
req = requests.post(url, data=data)