失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 爬虫-反爬二:有道词典js加密

爬虫-反爬二:有道词典js加密

时间:2021-12-15 22:02:55

相关推荐

爬虫-反爬二:有道词典js加密

文章目录

絮叨一下分析开撸1.查找js2.分析js3. 写代码4.封装请求头5.提取数据6.整合 写给看到最后的你

絮叨一下

前个爬了boss直聘,感觉这些大网站的反爬总是有办法安排的,不要望而生畏,又想到即将面临毕业,论文是个大问题,便想到一招进行翻译,然后实现将重的功能,于是今个就安排了有道翻译一波。

分析

有道主页

打开F12进行抓包就会发现

/translate_o?smartresult=dict&smartresult=rule

这个才是真正的请求地址

既然是post请求看一下发送了什么数据

然后刷新,输入新的内容对比一下

发现这四个值是变化的,那就需要我们去分析一下js代码,看一下他们是怎么生成的

'salt': ,'sign': ,'ts':,'bv': ,

这样在封装进data中发送过去不就ok了吗

开撸

1.查找js

点击:Initiator可以看见请求的js文件有那些

然后点击@fanyi.min.js:1

进去看一下

格式化一下

添加断点,也就是找到XHR/fetch Breakpoints 你可以针对某一个请求或者请求的关键字设置断点:

点一下‘+’输入url即可

然后去点击翻译

哦可以可以

可以点击这里t.translate 然后发现

'salt': ,'sign': ,'ts':,'bv': ,

看一下8948行的断点处,发现是由generateSaltSign这个函数生成的

把鼠标放在上面提示这个函数在8368行,点击一下

没错就是这里了

2.分析js

var 是js 的变量 t,r,i 分别赋值给了ts,bv,salt 几个值 ,sign 是一个字符串加翻译内容加salt

然后分别来看一下他们是怎么生成的

ts:很明显是一个时间戳

bv:鼠标放在navigator.appVersion上发现 bv是ua 的md5 加密值

salt:是在时间戳的基础上加一位随机数

sign:是一个字符串加翻译内容加salt 在加一个字符串

OK全部分析完毕就可以撸代码了

3. 写代码

import timetime = str(int(time.time()*1000))#时间戳ts

import randomsalt = str(time + str(int(random.random()*10)))# 获取时间戳+随机数 salt

import hashlibua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'hashlib_bv = hashlib.md5()# 获取一个MD5加密的对象hashlib_bv.update(ua.encode('utf-8'))# 指定加密的字符串bv = hashlib_bv.hexdigest()# 获取加密后的16进制字符串 bv的值

import hashlibsign_data = 'fanyideskweb'+ translation_data + salt + 'mmbP%A-r6U3Nw(n]BjuEU'# 进行字符串的拼接hashlib_sign = hashlib.md5()hashlib_sign.update(sign_data.encode('utf-8'))sign = hashlib_sign.hexdigest()# sign

有了这些我们伪装一下ua 然后去访问

import requestsimport jsontranslation_data = input("请输入要翻译的内容:")ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'url = '/translate_o?smartresult=dict&smartresult=rule'headers = {'User-Agent':ua}data = {'i': translation_data,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': str(salt),'sign': str(sign),'ts': str(time),'bv': str(bv),'doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_CLICKBUTTION'}response = requests.post(url,headers=headers,data=data).content.decode()translation = json.loads(response)print(translation)

突然看见

额请求失败了

4.封装请求头

再看看headers 加入 Cookie 以及 Referer

于是

headers = {'User-Agent':ua,'Cookie':'OUTFOX_SEARCH_USER_ID=1120454603@10.108.160.101; JSESSIONID=aaa43DnyRwVqd5dr3eglx; OUTFOX_SEARCH_USER_ID_NCOO=1050084892.1281917; ___rl__test__cookies=1592466058098','Referer': '/'}

然后在请求一下:

okok 完全可以

5.提取数据

然后进行提取就可以了

print("翻译后:" + translation['translateResult'][0][0]['tgt'])

然后在运行一下

完全可以

整合一下代码

6.整合

import requestsimport timeimport hashlibimport randomimport jsontranslation_data = input("请输入要翻译的内容:")url = '/translate_o?smartresult=dict&smartresult=rule'ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'headers = {'User-Agent':ua,'Cookie':'OUTFOX_SEARCH_USER_ID=1120454603@10.108.160.101; JSESSIONID=aaa43DnyRwVqd5dr3eglx; OUTFOX_SEARCH_USER_ID_NCOO=1050084892.1281917; ___rl__test__cookies=1592466058098','Referer': '/'}time = str(int(time.time()*1000))# 获取时间戳salt = str(time + str(int(random.random()*10)))# 获取时间戳+随机数hashlib_bv = hashlib.md5()# 获取一个MD5加密的对象hashlib_bv.update(ua.encode('utf-8'))# 指定加密的字符串bv = hashlib_bv.hexdigest()# 获取加密后的16进制字符串sign_data = 'fanyideskweb'+ translation_data + salt + 'mmbP%A-r6U3Nw(n]BjuEU'# 进行字符串的拼接hashlib_sign = hashlib.md5()hashlib_sign.update(sign_data.encode('utf-8'))sign = hashlib_sign.hexdigest()data = {'i': translation_data,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': str(salt),'sign': str(sign),'ts': str(time),'bv': str(bv),'doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_CLICKBUTTION'}response = requests.post(url,headers=headers,data=data).content.decode()"""{"translateResult":[[{"tgt":"apple","src":"苹果"}]],"errorCode":0,"type":"zh-CHS2en","smartResult":{"entries":["","[园艺] apple\r\n"],"type":1}}"""translation = json.loads(response)print("翻译后:" + translation['translateResult'][0][0]['tgt'])

写给看到最后的你

朋友,感谢你看到了最后,新手报道,技术不成熟的地方请多多指点,感谢!

公众号:Linux下撸python

期待和你再次相遇

愿你学的愉快

如果觉得《爬虫-反爬二:有道词典js加密》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。