学科分类
目录
网络爬虫

处理POST请求

前面我们分析urlopen方法时提到过,发送HTTP请求时,如果是以POST方式发送请求,urlopen方法必须设置data参数,data参数是以字典的形式存放数据。

当访问有道词典翻译网站进行词语翻译时,会发现不管输入什么内容,其URL一直都是“http://fanyi.youdao.com”。通过使用Fiddler观察,发现该网站向服务器发送的是POST请求,如图1所示。

img

图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":[
       "",
       "肆文",
       "高德纳"
     ]
   }
 }
点击此处
隐藏目录