1、JS写的cookie
当我们要写爬虫爬某个网页里面的数据的时候,无非就是发开网页,然后查看源代码,如果html里面有我们要的数据的话,那样也就简单了,直接就可以用requests请求网址得到网页源码,然后解析提取一下我们要的内容就可以了
requests得到的网页是一对JS,跟浏览器打开看到的网页源代码是完全不一样的,当遇到这种情况的时候,往往就是浏览器通过运行这段JS生成了一个或者多个cookie,之后再带着这个cookie去做二次请求
其实你在浏览器中可以看到这个过程,首先就是把浏览器中保存的cookie删掉,然后刷新网页,再次进行访问,我们就可以看到在历史的network请求记录中看到第一次访问返回的是521,内容是一段JS代码;当再次进行访问的时候就可以得到真实的页面了。分析这两次的请求,发现第二次请求中多带了一个cookie,而这个cookie并不是第一次请求服务器发送过去的,而是利用JS进行生成的
解决方法:
研究那一段JS,找到它生成cookie的算法,然后就可以利用python代码进行解决了
2、JS加密ajax请求参数
当要爬取某个网页的数据的时候,发现网页源代码里面并没有我们要的真实的数据,那这时候数据往往是ajax请求得到的。这个时候就可以通过XHR里面的response进行分析,一般那里面的数据都是我们想要的
当然这个URL里面会包含很多参数,其中一个可能看上去不是很起眼,但是这个字符串就可能是JS通过一个加密算法得到的,服务器也会通过同样的算法进行验证,验证通过了才认为你这个是从浏览器发送来的请求。我们可以通过将那个URL拷贝到地址栏中,把那个参数随便改动一下,访问看一下,是不是我们想要的正确的结果,以此来检验它是否是加密参数
解决方法
对于这样的加密参数,对策就是通过debug JS来找到对应的JS加密算法。其中最关键的就是在浏览器中设置XHR/fetch Breakpoints
3、JS反调试(反debug)
前面我们都会用到chrome中的F12去查看网页的加载过程,当这种方法用多了网站就加了反调试的策略,只要我们打开F12,就会暂停在一个‘debugger’的代码行中,无论怎么样都跳不出去,不管我们点击多少次继续运行,他都一直在这里面,每次都会多出一个VMxx的标签,观察‘Call Stack’发现好像陷入了一个函数的递归调用中。这个‘debugger’让我们无法调试JS。但是只要关闭了F12窗口,网页就可以正常加载了
解决这种JS反调试的方法我们称之为‘反-反调试‘,其策略就是通过‘Call Stack’找到把我们带入死循环的函数,并且重新定义它
这样的函数几乎没有任何其他的功能,只是给我们设置的一个陷阱罢了。我们可以把这个函数在console中重新定义一下,比如将其定义成空函数,这样在运行的时候它就会什么都不干了,也就不会把我们带到无限递归的场景中去了,在这个函数调用的地方打个Breakpoint。因为我们已经在陷阱中了, 所以要刷新页面,JS的运行应该停止在设置的断点处,此时该函数还没有运行,我们就已经在console中重新定义完了,所以继续运行就会跳过该陷阱
4、JS发送鼠标点击事件
有些网站,你从浏览器可以打开正常的页面,而在requests里面却被要求输入验证码或者是重定向到其他的页面。
JS会响应链接被点击的链接。服务器收到被点击链接的请求,会看看之前是不是已经通过某个文件把信息发送过来了,如果发过了就认为是合法的浏览器访问,给出正常的网页内容
因为requests没有鼠标事件响应就没有访问文件的过程,就直接访问链接了,服务器就拒绝服务
当明白了这个过程以后,我们几乎可以不研究JS中的内容(JS也有可能对被点击链接进行修改)就可以绕过反爬策略了,无非就是在访问链接以前先访问一下那个文件就可以了。关键是要修改那个文件后面的参数,把这些参数都带上就OK了
总结:
爬虫和网站是相生相克的,当爬虫知道了反爬策略就可以做成反-反爬策略;网站知道了爬虫的反-反爬策略就可以做一个反-反-反爬策略,正可谓是道高一尺魔高一丈,两者的斗争是永远不会结束的
原文地址:https://www.cnblogs.com/tulintao/p/11616640.html