今天给你们带来的是一个论坛网站,牛仔俱乐部-努比亚社区,html
网址为:https://bbs.nubia.cn/
python
若是你想要获取这个网站的源代码的话,必需要先获取一个 cookie,其字段名为:acw_sc__v2,你是否是不相信?爬取网站还须要获取 cookie 值才能够?说实话,我刚开始爬的时候我也不相信,直到我运行请求代码,一看,给我返回这个:git
这是什么啊,一段 JavaScript 代码,很容易地就能够看到下面有个 setCookie 的方法,这不就是我刚才说的须要获取的 cookie 的字段吗?若是你看到这,留下了没技术的眼泪的话?别怕,我劝你擦干眼泪,继续看下去,你会发现新大陆!github
咱们首先在 chrome 看看这里网站的请求先,打开 chrome,打开开发者工具,输入网址:https://bbs.nubia.cn/(须要先清除cookie),你能够看到下面这个东西:chrome
是否是呆住了?这是debug,明明什么都没按啊,若是你按跳出这个函数的话,能够暂时跳出,不过等到运行多几行代码的话,他会运行到一个无限执行 debug 的函数,让你永无翻身之日,一直在 debug 转动。浏览器
那怎么办?莫慌,其实这里运行代码就是咱们在上面第一次请求这个网站给咱们返回的 JavaScript 代码,那么咱们能够把刚才响应回来的代码复制出来,写成 html 文件,使用 chrome 浏览器打开。cookie
若是你把 那段代码展开的话,打开的时候就会无限进行刷新,直到浏览器崩溃。ide
这里是代码在执行过程当中使用正则检测你把代码展开了,因此就会无限进行刷新,这叫作内存爆破,是否是又 get 新知识?函数
因此咱们直接原样复制进去,在打开 chrome 进行调试。工具
可是,当咱们一打开 开发者工具,仍是会马上弹出 debug 页面
这又是为何呢?咱们根据右边的调用栈看看是怎样执行的,查看调用栈,能够看到这个函数:
若是你是学习过 JavaScript 的话,很容易就知道 setInterval 是个设置每隔一段时间就执行相应操做的函数。因此他这里每隔一段时间就会执行函数,用于检测用户有没有打开开发者工具,这个太猛了,具体原理我如今还不知道,若是你知道的不防在下面留言分享给你们。
知道了,以后,咱们直接在原文件找到这个定时设置语句给删除就能够了。删除了以后,仍是会执行这个 debug 语句,咱们继续把这个执行给删除。
如今就不会出现 debug 了,可是有一个新的问题,出现,页面会不断刷新,也是一个定时操做,这时该怎么办呢?由于是一个刷新操做,每次刷新必然会执行里面的 JavaScript 代码,因此不妨随便打个断点,看看调用栈,这里我比较有经验,因此就在这里打了个断点
由于这个 relaod 函数就是一个刷新页面的函数,因此直接在这里点击,能够确定这个函数会被执行,若是你打的断点没有被执行,能够多打几个断点,总会被执行的,这个不须要担忧。
当断点被执行到时,你就能够查看右边的调用栈了,很容易就找到这个地方
这个 setTimeout 也是一个定时执行,不过他只执行一次,至关于定时炸弹。又由于每次都会 reload,因此这个炸弹在每次刷新的时候就会继续新的炸弹,才会有刚才的不断刷新,了解了原理以后,那么咱们就把这个 setTimeout 给删除便可。
这时候,再次刷新网页,就什么阻力都没有了,是否是感受来到这一步不容易?哈哈,爬虫就是这样,与反爬死坑到底,不服就干,看谁更有耐心。
这时候终于能够开始咱们的调试之旅了,由于知道这个 JavaScript 执行以后会返回一个 cookie 值,因此接下来就是寻找生成的位置,若是你熟练的话,能够利用二分法来找,具体怎样找本身探索,由于我也不是很熟练。若是你不熟练的话,能够学我同样,由于代码就几百行,能够直接从第一行开始找。
若是你认真找,不用多久,很快就能够发现这个,这个 arg2 就是咱们须要找的 cookie 的值,因此接下来能够在这里打断点,看看具体的执行步骤。
能够看到,经过传一参数,使用这个函数就能够完成加密了,根据这个函数的函数名是 hexXor,能够知道是一个 Xor 加密,想知道原理的能够看看这篇文章:http://www.ruanyifeng.com/blog/2017/05/xor.html,咱们也能够根据 JavaScript 代码直接转成 python 代码也能够,不难。
经过调试发现,这里面须要两个参数,一个是加密的信息,一个是key
加密的信息是在很容易就发现,是从这里生成的
因此也能够在这里打断点,再刷新一下,就能够看到加密信息是由这个函数生成的。
这里的 JavaScript 代码也很容易,也能够直接翻译成 python 代码。而其参数须要的是 arg1,这个变量在代码第一行就声明了,因此在获取的时候,可使用正则获取。
接着就是 key 的获取了。直接搜索这个 key 的变量,很容易就找到这个
加密函数很长,可是也是能够本身转 python的,难度也不大。
在通过我屡次测试以后,发现这个 key 是固定的,因此无需本身实现这个函数,能够直接取这个值便可。
如今大功告成,已经能够得到所须要的 cookie 值了,是否是以为很是难以想象,一路走过来都不容易。
不过这里有个 bug,就是有时仍是获取到 JavaScript 代码,可是多运行几回仍是能够正常获取到 html 源码的,因为本身只是获取这个值而已,能成功便可,因此没有研究下去,若是你知道缘由,也能够在留言区告诉我。
最后总结下遇到各类挑战:
代码展开会无限刷新,内存爆破,若是你认真本身调试的话,会发现里面有几个正则,有些是用来匹配函数的,用于判断有没有展开代码的,展开了就表明有人想搞代码了,因此就会无限刷新。
设置定时与刷新网页,使网页无限刷新。这个对咱们来讲调试问题不大,毕竟每次刷新咱们均可以断点调试代码
设置定时检测有没有打开开发者工具,这个才是最厉害的,检测到的话就胡无限 debug。
最后就没有啦,若是你须要源码的话,能够在个人 GitHub 上获取,地址为:https://github.com/SergioJune/Spider-Crack-JS/tree/master/nubiya_bbs
若是对你有用的话,还请给个star,我会一直更新下去,你有什么须要破解的网站也能够提issue。
目前还更新了拼多多的搜索参数 anti_content 和另外一个更加厉害的 cookie 反爬,也是属于这个 Incapsula-CDN 的,难度比今天这个难上很多,因为我的问题,暂时只能每周讲解一个,请谅解。
原创不易,但愿能给个赞,给个star,支持下继续写下去。
本文仅用于交流学习,请勿用于非法用途,后果自负!
我的首发地址:请求网页时,怎么给我返回了一段 JavaScript 代码