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~完整源代碼詳見我的簡介相關文件。

相關文章
相關標籤/搜索