有道翻译是以异步方式实现数据加载的,要实现对此类网站的数据抓取,其过程相对繁琐,本节我以有道翻译为例进行详细讲解。通过控制台抓包,我们得知了POST请求的参数以及相应的参数值,如下所示:post请求参......
有道翻译是以异步方式实现数据加载的,要实现对此类网站的数据抓取,其过程相对繁琐,本节我以有道翻译为例进行详细讲解。
通过控制台抓包,我们得知了POST请求的参数以及相应的参数值,如下所示:
post请求参数并发现以下了规律:salt、sign、lts总是变化的,而bv等其他参数是不变化的。其中lts代表毫秒时间戳,salt和lts之间存在着某种关联,因为两者只有最后一个数字是不同的;而sign对应的值是一个加密后的字符串。
如果想要实现实时地抓取翻译结果,就需要将salt和sign转换为用Python代码表示的固定形式。最后将所有参数放入到()中,如下所示:
response=(url,data=data,headers=headers)1复制代码类型:[python]
其中data是字典格式参数,它用来构建POST请求方法的参数和参数值。
JS代码slat与signsalt、sign加密有两种实现方式:一种是通过前端JS实现,另一种是后台服务器生成加密串,并在返回响应信息时,将加密信息交给接浏览器客户端。但是,通过预览响应信息可知,并没有涉及salt、sign的信息,因此可以排除这种方法。
那么要如何找到关于salt、sign的JS代码呢?此时就要用到另外一个调试工具选项卡——JS。如下图所示:
或者您也可以使用Sources选项卡将文件中的JS代码格式化输出,并使用Ctrl+F找到相应的"salt"位置,如下图所示:
通过上述方法就找到了salt与sign(两个参数项是在一起的)JS代码,如下所示:
varr=function(e){vart=(),r=""+(newDate).getTime(),i=r+parseInt(10*(),10);return{ts:r,bv:t,salt:i,sign:("fanyideskweb"+e+i+"Tbh5E8=q6U3EXe+L[4c@")}};1234567891011复制代码类型:[python]注意,找到上述代码是解决本节问题的关键,大家一定要要掌握方法。
Python代码表示参数通过上述JS代码的简单分析可知:r变量等同于lts,salt变量等同于i,而sign是一个经过md5加密的字符串。接下来使用Python代码来表示上述参数,如下所示:
salt,lts+从0-9的随机数lts+str((0,9))word为要翻译的单词等同于js代码中的"e"string="fanyideskweb"+word+salt+"Tbh5E8=q6U3EXe+L[4c@"s=md5()16进制加密sign=()12345678910111213复制代码类型:[python]完整程序实现
完整代码如下所示:
url一定要写抓包时抓到的POST请求的提交地址,但是还需要去掉url中的“_o”,获取lts时间戳,salt加密盐,sign加密签名defget_lts_salt_sign(self,word):lts=str(int(()*1000))salt=lts+str((0,9))string="fanyideskweb"+word+salt+"Tbh5E8=q6U3EXe+L[4c@"s=md5()(())sign=()print(lts,salt,sign)returnlts,salt,signdefattack_yd(self,word):lts,salt,sign=_lts_salt_sign(word)使用()方法提交请求res=(url=,data=data,headers=,)客户端与服务器数据交互以json字符串传递,因此需要将它转换为python数据类型html=()print(html)#查看响应结果responsehtml:{"translateResult":[[{"tgt":"hello","src":"你好"}]],"errorCode":0,"type":"zh-CHS2en"}result=html["translateResult"][0][0]["tgt"]print('翻译结果:',result)defrun(self):try:word=input('请输入要翻译的单词:')_yd(word)exceptExceptionase:print(e)if__name__=='__main__':spider=YoudaoSpider()()1234567891011128192021222324252627282930337383940447484950557585960616263复制代码类型:[python]输出结果:
请输入要翻译的单词:大家好,这里是开课吧广场Python爬虫教程lts,salt,sign输出结果:161647209209016164720920902fcc592626aee42e1067c5195cf4c4576html响应内容:{'type':'ZH_CN2EN','errorCode':0,'elapsedTime':25,'translateResult':[[{'src':'大家好,这里是开课吧广场Python爬虫教程','tgt':'Helloeveryone,thisisthebeginningofthesquarePythoncrawlertutorial'}]]}翻译结果:Helloeveryone,thisisthebeginningofthesquarePythoncrawlertutorial开课吧广场-人才学习交流平台