今天在工作中,碰到了第一次碰见的反爬虫机制,感觉很有意思,在这里记录一下,希望对大家有帮助。
今天用到的库:
requests [请求]
lzstring [解压数据]
pyexecjs [执行JS]
简单粗暴,直接上网站部分源代码,因为这个网站应该不太希望别人来爬,所以就不上网站了。为什么这么说,因为刚开始请求的时候,老是给我返回GO TO HELL ,哈哈。
这个网站点击鼠标右键审查元素,查看网页源代码是无法用的,但是这个好像只能防住小白啊,简单的按F12审查元素,CTRL+u 直接查看源代码(谷歌浏览器)。
这次的目的主要是为了获取下面的链接(重度打码)
xxxxxxxxxxx/xxxxx-003-a5f7xxxxxx?cid=xxxxx&xxx=siOE_q4XxBtwdoXqD0xxxx
其中,红色加粗的就是我们要找的变量了。
一、观察与抓包
首先,我观察到了网页源代码中的一部分js代码:
为了节省篇幅,我把一些替换成…….了。如果你对这些数据的解压有兴趣,请联系我。
我第一眼看见时,做了2件事:
1、把[\x65\x76\x61\x6c],[ \x73\x70\x6c\x69\x63],[\x7c]分别解码,解码出的结果为eval和splic,| ;
注:其实这里看到eval时就应该想到可以试试直接用pyexecjs执行后面的那段js匿名函数,但是当时确实啥都没有想起来,很惭愧,后来复盘时才发现这一点。虽然执行了也会报错。
2、把那一长串的字母试着用base64解码了,但是解不出来;
然后,就只能再去其他js文件里找了,也找到了js代码,打了断点,但是看着还是很烦,于是这个时候我就没有在js上面死抠。
接着,我调转了方向,在GITHUB,Google运用了我祖传的高级搜索技巧,Finally,终于可以盘它了。
二、解密
下面开始解密:
1、数据解压
包含A===的字符串到底时啥呢,其实这个是js的一种数据的压缩方式,知道了这种方式你就可以立即破解这种反爬虫机制了,反正我以前是不知道的,第一次见到,学习了。
在这里,lzstring闪亮登场,运用这个库,执行下面的代码:
lzstring.LZString().decompressFromBase64(string)
这样就可以把上面的那串字符给解码了,解出来的数据像下面这样:
**webp|png|025|024|073**
没错,数据解压就是这么的简单;
2、看懂JS
我们在上面解码出来了一个splic和一个[ | ],再看看我们上面解压出来的数据,是不是很有感觉;但是,查了好一会资料,也没有发现js里面有这个方法,可能是在别的地方定义了;在我找到的资料里面,那个作者是直接用了split,最后的结果是对的,走逻辑上也说得过去,不知道为什么这么设置成splic,还希望有大神可以指教;
3、执行JS
所以,到这里就很明显了,把解码以后以及解压以后的数据在替换会原js数据中,我们前面解码出来的eval就有用了,我找到的资料里面作者使用node做的,我没有安装node环境,所以我就直接用了pyexecjs.eval直接执行了,结果也正确;
4、梳理流程:
匹配长字符串==>lzstring解压+解码后的字段==>拼凑成新的js代码==>pyexecjs执行==>出结果
5、部分代码
执行的主要步骤和结果
execjs.eval(res)
没错,就是这么简单,res就是替换后的js,然后就可以直接出来我们上面网址中需要的两个字段了。
截个图吧
如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的。交流经验。从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地
三、结语
到这里,今天的文章就结束了,总结一下就是知道了一种JS数据的压缩方式,并且学习了解压的方式,JS的执行,同时写代码的时候**多观察,多想,多试**。
来源:51CTO
作者:Python学习汇
链接:https://blog.51cto.com/14510224/2435944