post请求
- 目标网站:有道词典在线翻译,网址:http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule
- 网站在处理实际用户请求中有一些数据不方便或者不安全放在get请求中,这时用到post请求,post请求在查看页面信息中fromdata(表单数据)
- 打开目标网站,按F12,单击network,在翻译栏中输入要翻译的词。在网页中会弹出一些网页数据,找到对应网页,单击headers,formdata信息就在其中。
- 构思爬取步骤
- 前期工作,url网址,headers请求头信息,formdata信息,以及要翻译的词key。
- 由于翻译的词中有汉字,因此涉及到parse方法进行编码,同时在请求中把headers和formdata传入。
- 返回的信息response,同样可以在网页中查到,单击response可以找到{"translateResult":[[{"tgt":"China","src":"这里是要翻译的词"}]]这种结构的数据,这种数据处理方式叫做ajax,获取的数据通过正则表达式提取出翻译结果。
完整代码(用的火狐浏览器的请求头):
#post请求:网站在处理实际用户请求中有一些数据不方便或者不安全放在get请求中,这时
#用到post请求,post请求在查看页面信息中fromdata(表单数据)中,这里用到有道在线翻译网站
#来查看页面的工作,可以看到在实际翻译过程中,页面并没有全部刷新,而是仅仅刷新了翻译的部分
#这种数据处理方式叫做ajax
#实战:有道词典在线翻译
import urllib
from urllib import request
import re
url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
header={"User-Agent":"Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0"}
key="我爱中国"
fromdata={
'i':key,
'from':'AUTO',
'to':'AUT',
'smartresult':'dict',
'client':'fanyideskweb',
'salt':'15524360928531',
'sign':'d5bbbea7de1d79812b0008c79a8167b5',
'ts':'1552436092853',
'bv':'9d3e032fa834571aa62a09c1b4b8044f',
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_REALTlME',
'typoResult':'false'
}
data=urllib.parse.urlencode(fromdata).encode()
req=request.Request(url,data=data,headers=header)
res=request.urlopen(req).read().decode()
#{"translateResult":[[{"tgt":"China","src":"中国"}]]
print(res)
#构造正则表达式
pattern='"tgt":"(.*?)"}]]'
result=re.findall(pattern,str(res))
print(result[0])
返回结果
I love China