当爬虫有道词典时出现“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": "OUTFOX_SEARCH_USER_ID=-269532254@61.164.45.178; 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()
爬虫有道词典进行自动翻译
最新推荐文章于 2021-11-18 11:18:33 发布