有道词典,说实话,我也不知道爬取他有啥意义,但是,通过代码输入单词可以直接得到中文的翻译,总比开个网页或者是APP快吧 爬取的时候有几个注意点: (1)有道词典的url是经过了反爬的,fanyi.youdao.com/translate_o… 这个,需要将translate后面的_o删去,才能够进行爬取,否则都是error=50, (2)进行抓包之后,会发现我们需要的东西,
是post请求
(3)既然是post请求,在requests的时候需要加上params,
这是他的参数,i就是我们的输入的单词,salt和lts看起来像是时间戳,sign好像是被加密了,bv也好象被加密了,剩下的应该会不变,那我们可以再输入一次单词,之后进行再次抓包,看他的参数是不是变化了
结果是:sign变化,并且是进行了加密,salt和lts是变化的,bv并没有变化
(4)js里面的时间戳是等于python里的时间戳*1000
之后我们可以进行全局搜索:ctrl+shift+f 结果是这个样子的:
挨个找呗,最后是第二个包里面有我们想要的东西
在第二个包里找到了这个东西:
md5加密,在8391上打个断点:再次运行
分析代码和数据:
e是我们输入的东西,r是js里的时间戳(前面加了个双引号,代表是字符串类型的),i是r加上个10进制的,0-1的随机数*10的数,
如果要是没有pycharm专业版的话,安装不了node.js(在pycharm里面装),可以下一个js调试的东西,百度上一堆,还有一些可以在线调试的。我用的是发条js调试
先设一个函数,之后设变量e,i,返回我们要的东西
之后,去查找md5加密到底在哪里:
进行格式化后放在调试工具里面
并且需要将md5的:改成=
之后进行格式化加载代码后,会告诉我们,第三行少东西,那我们去找其中的h,f往上翻:
再往上看看会遇到这个样子:
所以,我们可以直接将var n 那行开始复制并粘在工具中
进行格式化,加载代码,往md5函数里输入几个数字看看能不能进行加密,之后再往getSign里传入几个数字看看能不能返回出值,能的话,sign就搞定了
之后复制下来,放在txt文件中,改成
保存成js文件
之后就是写代码了
import requests
import random
import time
import execjs
e=input('enter a English word:')#设置一个e,
r=str(int(time.time()*1000))#使用python的时间戳将js的表示出来
i=r+str(int(random.random()*10))
node=execjs.get()
ctx=node.compile(open('./有道翻译2.js',encoding='utf-8').read())
funcName='getSign("{0}","{1}")'.format(e,i)
sign =ctx.eval(funcName)
url='https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.71',
'Referer': 'https://fanyi.youdao.com/'
}
params={
'i': e,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': i,
'sign': sign,
'lts': r,
'bv': '8b6c8845a74df59c1f2be6165a6104b5',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
response=requests.post(url,headers=headers,params=params).json()
#print(response)
result=response['translateResult'][0][0]['tgt']
print(result)