Python系列爬虫之有道翻译小爬虫【更新】

# 前言python

最近有小伙伴留言说以前分享的翻译软件用不了了,就是这篇文章里分享的:web

利用Python制做一款简单的翻译软件编程

本身测试了一下,发现百度翻译和Google翻译都还能够用,只有有道翻译报错,因而随手踩点更新了一波代码,顺便在公众号从新分享一波。废话很少说,让咱们愉快地开始吧~json

开发工具

Python版本:3.6.4
相关模块:

requests模块;数据结构

pyqt5模块;app

js2py模块;dom

以及一些Python自带的模块。ide

环境搭建

安装Python并添加到环境变量,pip安装须要的相关模块便可。工具

原理简介

老规矩,先随便翻译几个单词而后抓包看看:post

图片

能够发现只要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': 'OUTFOX_SEARCH_USER_ID=-481680322@10.169.0.83;'
          }
        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编程的伙伴们,在这里为你们准备了丰富的学习大礼包

image

All done~完整源代码详见我的简介相关文件。