有道翻译爬虫 及 有道翻译POST请求的errorcode 50问题

有道具有反爬虫机制,在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转子编码。

猜你喜欢

转载自blog.csdn.net/qq_42018521/article/details/86775970