爬虫有道词典进行自动翻译

当爬虫有道词典时出现“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()

你可能感兴趣的:(python)