爬蟲有道詞典進行自動翻譯

當爬蟲有道詞典時出現“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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章