有道具有反爬虫机制,在from data里通过改变salt和sign进行反爬。
笔者用浏览器url进行爬取会返回errorcode,将_o删除后得以解决。
如果想通过获取salt的构造方式解决可以看:https://blog.csdn.net/nunchakushuang/article/details/75294947
import urllib.request
import urllib.parse
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
tra = input("请输入要翻译的内容:")
data = {
'i':tra,
'from':'AUTO',
'to':'AUTO',
'smartresult':'dict',
'client':'fanyideskweb',
'salt':'15496171372804',
'sign':'b53bcf93a7982b8057077b3f1967e2db',
'ts':'1549617137280',
'bv':'bbb3ed55971873051bc2ff740579bb49',
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_CLICKBUTTION',
'typoResult':'false',
}
data = urllib.parse.urlencode(data).encode('utf-8')#将编码编成'utf-8'的形式
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')#将文件编码解码成'utf-8'形式
html = json.loads(html) #得到的json格式编码 用json内置函数进行解码
print(html['translateResult'][0][0]['tgt'])#通过解码内容来写输出
urlopen()的data参数如果不赋值默认为get()请求,此处用的是post请求,并且data有固定格式可通过urllib中的urlencode函数去转,在网页审查元素中可以得到该网页编码格式为‘utf-8’格式,而python默认为unicode所以要把data的格式硬编码为utf-8形式。
unicode是 utf-8,gbk,utf-16这些的父编码,这些子编码都能转换成unicode编码,然后转化成子编码,例如utf8可以转成unicode,再转gbk,但不能直接从utf8转gbk。python中就有两个方法用来解码(decode)与编码(encode),解码是子编码转unicode,编码就是unicode转子编码。