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