# 前言python
最近有小夥伴留言說以前分享的翻譯軟件用不了了,就是這篇文章裏分享的:web
本身測試了一下,發現百度翻譯和Google翻譯都還能夠用,只有有道翻譯報錯,因而隨手踩點更新了一波代碼,順便在公衆號從新分享一波。廢話很少說,讓咱們愉快地開始吧~json
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編程的夥伴們,在這裏爲你們準備了豐富的學習大禮包
All done~完整源代碼詳見我的簡介相關文件。