python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

小帅b 学习python的正确姿势

嘿嘿嘿,小帅b又来跟你说说一些爬虫过程中需要斗智斗勇的事情了,这次咱们就来说说关于一些 JS 混淆加密的事。所谓 JS ,就是 JavaScript ,一种前端的脚本语言,一般情况下每个网站都需要 JS 来做一些数据交互,页面渲染等一些异步操作。当然,对于反爬的人来说,JS 的用处还可以用来对一些数据进行加密。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

今天咱们就以有道词典这个在线翻译的网站为例,看看他们是如何加密请求数据的,以及小帅b是如何通过 Python 模拟请求从而获得关键数据的。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

咱们打开有道翻译的网站:http://fanyi.youdao.com/

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

输入中文然后点击翻译按钮就会翻译出来英文,比如:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

Hello, everyone, I'm Small handsome b.

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

哈哈哈,ok,我们打开开发者工具,按下 F12 来抓一下数据,当我们点击翻译的时候,可以看到有了一个请求:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

点进去看可以发现,POST请求的地址是:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

我们再来看一下请求过去携带的参数是啥

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

可以看到,还是需要挺多参数的,其中的 i 就是我们要翻译的内容,那简单啊~想要得到翻译后的数据,那么我们直接把请求头和所需参数的值复制一下,然后用 requests 请求一波不就搞定了?

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

说干就干,代码走起!

定义一个请求的 url 和 headers

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

再把 form data 的数据整过来

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

requests 走起

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

运行一波

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

what? 返回的是一个错误码。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

好的吧,如果是这么简单,小帅b何必写这篇教程呢?如果你之前玩过加密相关的,那么你应该对 form data 中的 salt、sign 这两个字眼不陌生,那么,如何破呢?

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

接下来就是:

学习 python 的正确姿势

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

我们再点多几次翻译按钮,然后就可以看到有多次请求。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

可以发现,每一次的请求中的 salt、sign、ts、bv 参数是会一直变化的。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破
python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

how to do it?我们回到 NetWork ,我们看到 Initiator 这一栏,可以看到它请求到了 fanyi.min.js:1 这个 js 文件。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

我们就点 fanyi.min.js:1 进去看看,牛的一比,直接看不懂...

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

还好,左下角有一个 {} ,可以点一下

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

发现有惊喜,直接帮我们把压缩的 js 代码格式化。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

牛逼不,行号都给我们显示出来了,不过到了这里,依然懵逼,我们还是不知道怎么拿到 salt、sign、ts、bv 这些参数的值...

咋办?恩,Chrome浏览器的打断点功能在这个时候就要派上用场了。这时候还要把帅b语录搬过来应景哈哈哈。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

那么如何使用断点功能呢,我们看到 Chrome 的右边是这样的:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

看到这个 XHR/fetch BreakPoints 没,在这里我们可以添加 url ,根据请求这个 url 打断点。而我们要打的断点就是一开始获取到的请求 url :

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

点击 XHR/fetch BreakPoints 右边的 + 号,然后把链接复制进去:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

这时候再点击翻译按钮:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

突然,你的屏幕一灰,表示好事将近,我们成功打上了断点,也就是说,现在我们可以在请求之前做一些骚操作。

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

这时候我们将右边的 Call Stack 展开:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

这些,就是我们在点击翻译按钮之后,会调用到 js 里面的方法,从这里下手,来寻找那些参数是被如何加密的,说实话,用文字来说怎么去 debug 有点繁琐..要不,视频走起?

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

挖槽,我 1080p 的视频被腾讯压缩成 av 画质,但也不能否认我是全网第一良心博主有没有,请叫我良心b!!!

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

通过帅b的视频,相信你已经知道了这些参数是如何加密的了,那么接下来就可以通过 Python 模拟了。

代码走起!

ts 在 js 中是这样的:


r = "" + (new Date).getTime()

那么在 Python 中就是这样的:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

bv 在 js 中是这样的:


n.md5(navigator.appVersion)

那么它在 Python 中就是这样的:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

salt 在 js 中是这样的:


r + parseInt(10 * Math.random(), 10)

那么它在 Python 中就是这样的:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

sign 在 js 中是这样的:


n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")

那么它在 Python 中就是这样的:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

所以我们获取 form data 的方法就是这样的:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

那么我们的请求就可以这样:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

这样我们就使用了最正确的参数值来请求了,运行一波:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

cool~~~拿到数据啦!顺便说一句,用到的库有这么几个:

python爬虫反反爬 | 像有道词典这样的 JS 混淆加密应该怎么破

完事了!

ps:觉得对你有帮助,给我点个在看,转发,赞赏。让帅b老仙,一直法力无边。另外,接下来会有骚动作,为了能让你及时收到通知,赶紧把这个公众号设置为星标,以免到时亏得一批,我们下回见,peace!

猜你喜欢

转载自blog.51cto.com/15082392/2647312
今日推荐