
都說Python簡單易學,這不就來湊湊熱鬧。一直對爬蟲挺好奇了,于是搜到了C語言中文網的一篇文章。其中有一個例子是爬取有道翻譯的。根據輸入的內容獲取翻譯結果,一共不到50行的代碼,看著確實挺簡單的,思路也非常清晰。于是手殘也跟著寫了一份代碼。
爬取有道翻譯的數據,首先需要安裝requests庫,這些數據都可以在瀏覽器開發者工具(F12)中找到。
需要知道請求的url,如下圖:

需要知道標頭(Request Headers),如下圖:

需要知道表單(Form Data),如下圖:

翻譯的結果可以在Preview中查看,結果保存在字典中。所以只要從字典中能取出數據展示即可,如下圖:

不寫不知道,一寫嚇一跳,如果不出意外的情況下意外還是發生了,服務器響應{"errorCode":50},內容翻譯不出來。
這種程序可不能慣著,代碼寫出來了不能工作,勢必要拿下。
于是去網上找大神求助,爬取有道翻譯已經成為學習爬蟲的入門案例了,結果有道翻譯急了,后來就針對爬蟲做了反爬機制。其實就是對表單中salt和sign參數驗證,只有驗證正確才能返回翻譯結果。
可能網上的這篇文章比較久遠了,那個時候還沒有反爬機制,這樣就說得通了。
那么只要搞明白這兩個參數是如何加密的,就能正常翻譯了。
首先,在有道翻譯網頁源文件中,有一個fanyi.min.js文件,這個文件中記錄了這兩個參數加密的方式,如下所示:

當打開這個鏈接時,網頁顯示是這樣子的,比較亂。

我們直接把網頁的內容復制一份,找個在線格式化js代碼的(鏈接放在源碼中),然后把格式化之后內容保存下來,再用編輯器查看。其中有一段是這樣子的,如下:

solt就是時間戳加上一個隨機值,sign是對拼接的字符串經過MD5加密。e就是我們待翻譯的文字。
#?-*-?coding:?utf-8?-*-
import?requests
import?json
import?random
import?time
import?hashlib
"""
破解有道反爬蟲solt,sign,?{"errorCode":50}
有道云在線翻譯:https://fanyi.youdao.com/,?
有道云fanyi.min.js網址:https://shared.ydstatic.com/fanyi/newweb/v1.1.10/scripts/newweb/fanyi.min.js
js代碼格式化工具:https://tool.oschina.net/codeformat/js,把fanyi.min.js內容復制到這個網站上
"""
def?FormDataGetSign(text,?salt):
??str?=?"fanyideskweb"?+?text?+?salt?+?"Ygy_4c=r#e#4EX^NUGUc5"
??m?=?hashlib.md5()
??m.update(str.encode('utf-8'))
??return?m.hexdigest()
translate?=?input("Please?enter?what?you?want?to?translate:\r\n")
salt?=?str(int(time.time()?*?1000)?+?random.randint(0,?10))
url?=?"https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
#?url="https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
#?將原地址中的'_o'去掉就不會對salt和sing驗證了
Form_data={'i':translate,
????????????'from':'AUTO',
????????????'to':'AUTO',
????????????'smartresult':'dict',
????????????'client':'fanyideskweb',
????????????'salt':?salt,
????????????'sign':FormDataGetSign(translate,?salt),
????????????'lts':'1666619583365',
????????????'bv':'4b14f827cdc3aab7d8d501b4087648f8',
????????????'doctype':'json',
????????????'version':'2.1',
????????????'keyfrom':'fanyi.web',
????????????'action':'FY_BY_REALTlME'}
headers?=?{'Cookie':'OUTFOX_SEARCH_USER_ID=1000052898@180.109.232.235;',
????????????'Referer':?'http://fanyi.youdao.com/',
????????????'User-Agent':'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/106.0.0.0?Safari/537.36'}
????????????
content?=?json.loads(requests.post(url,?data=Form_data,?headers=headers).text)
if?'translateResult'?in??content:
??try:
????print('The?result?of?translation:\r\n'+content['translateResult'][0][0]['tgt'])
??except:
????pass
else:
????print("翻譯出錯")
可以直接將url地址中的_o刪除,反爬蟲機制就不會生效了。solt和sign可以直接用瀏覽器中的固定值。
參考鏈接:https://tendcode.com/article/youdao-spider/
END
往期推薦
Python中字符串格式化三種方法

