當爬蟲有道詞典時出現“errorCode”:50錯誤,那是有道發爬蟲機制引入,解決方法如下: 1、分析原因:從Form Data中分析原因得知,salt,sign,ts三個參數值是動態變化的,每次請求其值都不同,這表明網站對這三個參數作出了加密反爬蟲機制,若想取得數據,就必須先破解其加密機制。
2、獲取方法:右鍵,查看網頁源代碼,在html中並沒有找到對應參數,那麼就可能在js文件中,在網頁的最後一部分代碼,根據js文件的文件名,猜測這幾個參數的獲取方式可能在"fanyi.min.js"文件中。打開該js文件,發現這個文件是處理過的 js,直接看是難以看出邏輯的,所以可以把 js 代碼放到一些可以重新排版的工具中再查看,如在線“站長工具”,最後可以通過搜索“salt”找到幾個參數的生成位置,具體代碼片段如下: define("newweb/common/service", ["./utils", "./md5", "./jquery-1.7"], function(e, t) { var n = e("./jquery-1.7"); e("./utils"); e("./md5"); var r = function(e) { var t = n.md5(navigator.appVersion), r = "" + (new Date).getTime(), i = r + parseInt(10 * Math.random(), 10); return { ts: r, bv: t, salt: i, sign: n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE") } };
(1)網站採用的是md5加密 (2)ts = "" + (new Date).getTime() ,爲時間戳 (3)salt = "" + (new Date).getTime() + parseInt(10 * Math.random(), 10) (4)sign = n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE") #最後的字符串會變化 其中,e爲要翻譯內容,i爲時間戳,等於ts,其餘爲固定字符串 3、源代碼如下:
import urllib.request import urllib.parse import time,random import hashlib import requests import json class youdao: def __init__(self,msg): self.msg = msg self.url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" self.D = "n%A-rKaT5fb[Gy?;N5@Tj" self.salt = self.get_salt() self.sign = self.get_sign() self.ts = self.get_ts() def get_md(self,value): md5 = hashlib.md5() md5.update(value.encode("utf-8")) sign = md5.hexdigest() return sign def get_salt(self): salt = int(time.time() * 1000) + random.randint(0, 10) return salt def get_sign(self): sign = "fanyideskweb" + self.msg + str(self.salt) + str(self.D) return self.get_md(sign) def get_ts(self): s = int(time.time() * 1000) return str(s) def get_result(self): form_data = {'i':self.msg, 'from':"AUTO", 'to':"AUTO", 'smartresult':"dict", 'client':'fanyideskweb', 'salt':self.salt, 'sign':self.sign, 'ts':self.ts, 'bv':'75551116684a442e8625ebfc9e5af1ba', 'type':'json', 'version':'2.1', 'keyfrom':'fanyi.web', 'action':'FY_BY_CLICKBUTTION' } headers = { "Accept": "application/json,text/javascript,*/*;q=0.01", "Accept-Language": "zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7", "Connection": "keep-alive", "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", "Cookie": "[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=319595972.4533894; JSESSIONID=aaavbU6zTTPKSanbz2H_w; ___rl__test__cookies=1578968436936", "Host": "fanyi.youdao.com", "Origin": "http://fanyi.youdao.com", "Referer": "http://fanyi.youdao.com/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 X-Requested-With: XMLHttpRequest" } resp = requests.post(self.url, data=form_data, headers=headers).text translate_results = json.loads(resp) if 'translateResult' in translate_results: translate_results = translate_results['translateResult'][0][0]['tgt'] print("翻譯的結果是:%s" % translate_results) else: print(translate_results) if __name__ == "__main__": y = youdao('語文,英語,數學') y.get_result()
爬蟲有道詞典進行自動翻譯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.