Python - 使用 Python 3 urllib 发出 POST 请求
我正在尝试向以下页面发出 POST 请求:http://search.cpsa.ca/PhysicianSearch
I am trying to make a POST request to the following page: http://search.cpsa.ca/PhysicianSearch
为了模拟点击搜索"按钮而不填写任何表单,从而向页面添加数据.我通过在 Chrome 开发者工具中查看网络选项卡时单击按钮获得了 POST 标头信息.我发布这个而不是仅仅从其他类似问题中复制解决方案的原因是我相信我可能没有得到正确的标题信息.
In order to simulate clicking the 'Search' button without filling out any of the form, which adds data to the page. I got the POST header information by clicking on the button while looking at the network tab in Chrome Developer Tools. The reason I'm posting this instead of just copying solutions from the other similar problems is that I believe I may have not gotten the correct header information.
它的格式是否正确,我是否获取了正确的信息?我以前从未发出过 POST 请求.
Is it properly formatted and did I grab the right information? I've never made a POST request before.
这是我设法拼凑起来的:
This is what I've managed to piece together:
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 请求中检索的任何数据.
This solution outputs the page's HTML, but not with any of the data I wanted to retrieve from the POST request.
这就是你的方法.
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)