前言
最近有小伙伴留言说之前分享的翻译软件用不了了,就是这篇文章里分享的:
利用Python制作一款简单的翻译软件
自己测试了一下 ,发现百度翻译和Google翻译都还可以用,只有有道翻译报错,于是随手踩点更新了一波代码 ,顺便在公众号重新分享一波。废话不多说,让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
requests模块;
pyqt5模块;
js2py模块;
以及一些Python自带的模块 。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
老规矩 ,先随便翻译几个单词然后抓包看看:
可以发现只要post请求以下这个链接:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
就可以返回翻译结果啦,返回的数据结构大概是这样的:
{"translateResult":[[{"tgt":"Pikachu","src":"皮卡丘"}]],"errorCode":0,"type":"zh-CHS2en","smartResult":{"entries":["","Pikachu\r\n"],"type":1}}
OK,现在需要解决的问题就是这个post请求需要携带的数据有哪些?如何构造这些数据?显然 ,在上面贴的抓包结果图已经表明了需要携带的数据有哪些了 ,即:
--i: 皮卡丘 --from: AUTO --to: AUTO --smartresult: dict --client: fanyideskweb --salt: 15626748912153 --sign: c6352b577fd346a45fb77efe1afa1e29 --ts: 1562674891215 --bv: 3a019e7d0dda4bcd253903675f2209a5 --doctype: json --version: 2.1 --keyfrom: fanyi.web --action: FY_BY_REALTlME
经反复测试,可以发现其中变量为:
i salt sign ts bv
其余均为不变量,直接复制粘贴就OK了。换句话说 ,我们只需要解决这五个变量如何构造的问题,就可以完成我们的有道翻译小爬虫了 。显然,变量i就是待翻译的词。那么其他四个呢?
简单观察一下 ,可以发现这些变量可能来自以下这个js文件:
打开搜索一下呗:
看来估计的没错。接着搜索这个js文件看看这些变量都是咋算出来的呗 。首先,我找到了这个:
也就是说,ts其实就是时间戳 ,salt其实就是时间戳加一个0到9之间的随机数。至于sign和bv,只能看出他们是一些字符经过md5加密得到的,打个断点看看这些字符都是啥?
先看appVersion:
再看后面的e:
一目了然。于是 ,我们轻松地搞清楚了所有需要的变量是怎么来的 。因此,现在可以开始愉快地写代码了 。具体而言,代码实现如下:
''' Function: 有道翻译类 ''' class youdao(): def __init__(self): self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 'Referer': 'http://fanyi.youdao.com/', 'Cookie': '[email protected];' } self.data = { 'i': None, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': None, 'sign': None, 'ts': None, 'bv': None, 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME' } self.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' def translate(self, word): ts = str(int(time.time()*10000)) salt = str(int(time.time()*10000)) + str(int(random.random()*10)) sign = 'fanyideskweb' + word + salt + '97_3(jkMYg@T[KZQmqjTK' sign = hashlib.md5(sign.encode('utf-8')).hexdigest() bv = '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' bv = hashlib.md5(bv.encode('utf-8')).hexdigest() self.data['i'] = word self.data['salt'] = salt self.data['sign'] = sign self.data['ts'] = ts self.data['bv'] = bv res = requests.post(self.url, headers=self.headers, data=self.data) return [res.json()['translateResult'][0][0].get('tgt')]
文章到这里就结束了 ,感谢你的观看 ,关注我每天分享Python模拟登录系列,下篇文章分享知乎粉丝爬虫。
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家 ,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门 、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
All done~完整源代码+干货详见个人简介或者私信获取相关文件 。。