处理POST请求
前面我们分析urlopen方法时提到过,发送HTTP请求时,如果是以POST方式发送请求,urlopen方法必须设置data参数,data参数是以字典的形式存放数据。
当访问有道词典翻译网站进行词语翻译时,会发现不管输入什么内容,其URL一直都是“http://fanyi.youdao.com
”。通过使用Fiddler观察,发现该网站向服务器发送的是POST请求,如图1所示。
图1 有道词典翻译网站
从图1中可以看出,当使用有道词典翻译“Python”时,返回的结果是一个JSON字符串。 接下来,我们来尝试模拟这个POST请求,具体代码如下:
import urllib.request
import urllib.parse
# POST请求的目标URL
url = "http://fanyi.youdao.com/translate?
smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
headers = {"User-Agent": "Mozilla...."}
# 打开Fiddler请求窗口,点击WebForms选项查看数据体
formdata = {
"type":"AUTO",
"i":"i love python"
"doctype":"json",
"xmlVersion":"1.8",
"keyfrom":"fanyi.web",
"ue":"UTF-8",
"action":"FY_BY_ENTER",
"typoResult":"true"
}
data = bytes(urllib.parse.urlencode(formdata).encode('utf-8'))
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
执行上述代码,输出结果如下:
{
"type":"EN2ZH_CN",
"errorCode":0,
"elapsedTime":0,
"translateResult":[
[
{
"src":"i love python",
"tgt":"我喜欢python"
}
]
],
"smartResult":{
"type":1,
"entries":[
"",
"肆文",
"高德纳"
]
}
}