2016-04-07 45 views
2

我试图做一个POST请求发送到以下页面进行POST请求:http://search.cpsa.ca/PhysicianSearchPython的使用Python 3的urllib

为了模拟点击“搜索”按钮,没有填写任何表格,这将数据添加到页面。通过在Chrome开发人员工具中查看网络选项卡时单击该按钮,我可以获得POST标题信息。我发布这个的原因,而不是从其他类似问题复制解决方案是我相信我可能没有得到正确的标题信息。格式正确吗?我是否抓取了正确的信息?我从未做过POST请求。

这是我已经成功地拼凑:

import urllib.parse 
import urllib.request 


data = urllib.parse.urlencode({'Host': 'search.cpsa.ca', 'Connection': 'keep-alive', 'Content-Length': 23796, 
            'Origin': 'http://search.cpsa.ca', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 
            'Cahce-Control': 'no-cache', 'X-Requested-With': 'XMLHttpRequest', 
            'X-MicrosoftAjax': 'Delta=true', 'Accept': '*/*', 
            'Referer': 'http://search.cpsa.ca/PhysicianSearch', 
            'Accept-Encoding': 'gzip, deflate', 
            'Accept-Language': 'en-GB,en-US;q=0.8,en;q=0.6', 
            'Cookie': 'ASP.NET_SessionId=kcwsgio3dchqjmyjtwue402c; _ga=GA1.2.412607756.1459536682; _gat=1'}) 


url = "http://www.musi-cal.com/cgi-bin/query?%s" 

data = data.encode('ascii') 
with urllib.request.urlopen("http://search.cpsa.ca/PhysicianSearch", data) as f: 
    print(f.read().decode('utf-8')) 

该解决方案输出页面的HTML,但不与任何我想从POST请求检索数据。

+0

POST数据应该对应于您提交表单的输入元素的名称属性和值。您可以通过检查表单的html来获取名称属性。您将请求标头用作POST数据 - 这是行不通的。另外,请考虑使用请求包(http://docs.python-requests.org/en/master/),它比urllib2更友好。 – snakecharmerb

+0

如何指定表单?或者我只需要指定数据的键值对? –

+0

在chrome中,查看网络选项卡中的POST请求,就像您之前所做的一样,并转至标题选项卡的底部 - 您将看到名称和值,无论它是POST请求还是具有查询参数的GET请求 – snakecharmerb

回答

22

这就是你如何做到的。

from urllib import request, parse 
data = parse.urlencode(<your data dict>).encode() 
req = request.Request(<your url>, data=data) # this will make the method "POST" 
resp = request.urlopen(req) 
0

谢谢C熊猫。你真的很容易让我学习这个模块。

我发布了我们传递的字典不会为我编码。我不得不做一个小的改变 -

from urllib import request, parse 
import json 

# Data dict 
data = { 'test1': 10, 'test2': 20 } 

# Dict to Json 
# Difference is { "test":10, "test2":20 } 
data = json.dumps(data) 

# Convert to String 
data = str(data) 

# Convert string to byte 
data = data.encode('utf-8') 

# Post Method is invoked if data != None 
req = request.Request(<your url>, data=data) 

# Response 
resp = request.urlopen(req)