美文网首页
爬虫实战1.1.1 解决JS加密-采集天气信息

爬虫实战1.1.1 解决JS加密-采集天气信息

作者: 罗汉堂主 | 来源:发表于2020-01-03 10:04 被阅读0次

    由于这两年信息泄露的普遍,各网站(尤其是存储相对重要数据的网站)的反爬力度逐渐增强,采集数据的难度也随之直线上升,这第一篇先来了解一下较普遍的反爬措施:JS加密
    我们来攻克的第一个网站:中国空气质量在线监测分析平台:https://www.aqistudy.cn/html/city_detail.html

    我自己使用的是google浏览器,置于环境在开篇文章已经列举了以下,下面的一些包什么的,用到什么就装什么就可以了。

    下面的整个过程我会很详细的写出来,喜欢研究爬虫的可以仔细往下看真个过程的处理,单纯想要解决问题的可以直接看部分代码,在以后的文章中可能就不会把步骤写的这样详细了,会慢慢的简化,毕竟太啰嗦的东西,没人喜欢去看。。。

    第一步,打开页面,F12

    请求地址.png
    嗯,,还是比较干净的,,但是千万不要被表象所迷惑了,越干净的页面,可能爬的难度就越大。。。
    果然,往下一看,POST请求中一个参数,返回的也是一串不知道什么的东西,到这里就知道了,数据已经被加密了,果然不是这么简单
    请求参数.png
    返回值.png
    那么接下来就让我们一步一步来解决他吧。。。
    第一步,我们打开sources,右面的面板中的Event Listener,展开下面有个mouse,再展开有个click,选中它,然后点击上面的搜索:
    鼠标点击事件.png
    接下来,让我们看一下数据从请求到返回的整个过程是怎样的:
    搜索之后会出现下面这项的画面,我们可以看到右面面板的Call Stack,这里面就标明了你执行到具体步骤的源文件,想要看的清楚地话,需要先一下左下角的花括号:格式化。上面的小符号就是进入下一步,或者按F11,找到相关内容
    搜索事件执行过程.png
    很久之后,终于看到了想要看到的东西:
    获取数据的方法.png
    这里有个getData的方法,下面还有getAQIData,getWeatherData,字面的意思就能看懂了,获取XXX数据。
    恰巧,这两个方法就在getData下面,接下来就要分析这3个方法了:
    getData什么没有,不用看
    看一下下面的两个方法:
    getAQIData.png
    getWeatherData.png
    很简洁的两个方法,而且惊人的相似,看代码的意思就是定义了method、param两个变量,然后传入getServerData这个方法中,返回了一个data对象,下面解析这个对象先暂时不看。
    那就再去找getServerData就好了:
    继续点点点、不过这样实在是太累了啊,我的毅力可能不太好了,那就再换个方法吧:既然我们已经定位到这个方法名了,那肯定就在某一个角落会出现这个方法,接下来我们这样做:
    我们吧注意力转移到最右边的 “X” 号,旁边的三个点那里,点一下,找到下面的Search,再点一下,下面会出现一个新的窗口,在搜索框中输入我们要找的方法:
    查找方法.png
    哎!看到了两个文件中都有这个方法,其中文件1就是我们刚才看到调用方法的地方,剩下的就只有文件2中的了,居然是jquery这个文件,
    不管了,先点进去看一下吧!
    getServerData.png
    看的出来,这是一种JS的常见加密方式:混淆加密,先了解一下这种加密方式:

    JS反混淆

    进入这个反混淆网站,顺便加个书签,方便以后再用:https://www.bm8.com.cn/jsConfusion/
    把getServerData所在的字符串所在的方法:eval;整个复制,然后格式化,复制出来放到Notepad++里面,东西也很多,我们再次搜索一下:getServerData,终于找到这个方法,我们来看一下:

    getServerData方法.png
    终于看到我们最开始发出的请求链接了,在这里是一个Ajax请求,请求参数就传入了一个:d:param
    那这个param不难发现,在上面通过一个getParam方法获取,getParam方法传入了method, object两个变量,返回了一个param,这个param就是我们需要的东西。那我们再继续找一下getParam这个方法,刚好就在上面。。。。。。
    参数加密.png
    不用解释也应该能看明白了,就是把几个传入的参数跟定义的几个固定参数拼接加密,然后再讲整个param通过Base64跟AES加密,最后返回。
    再回到刚才的getServerData中的Ajax请求,发出请求成功后返回的data,又经过了一个方法decodeData,继续往上看就会看到这个方法:
    返回数据解析.png
    这个也不难理解,传入data后经过了AES、DES、BASE64三种解密方式,最终得到返回数据。
    至次,整个分析的过程已经完成了,对上面整个篇幅描述的东西可以简单整理,不想看整个过程的朋友可以看下面这句话:
    发出一个带了经过Base64、AES加密后的参数的post请求,返回了经过AES、DES、BASE64三次解密的data。

    接下来由于篇幅过长,分两篇来发,具体试下部分看下一篇。

    相关文章

      网友评论

          本文标题:爬虫实战1.1.1 解决JS加密-采集天气信息

          本文链接:https://www.haomeiwen.com/subject/kllagctx.html