js 爬虫抓取网页数据(JS逆向方法论-反爬虫的四种常见方式(组图))

优采云 发布时间: 2022-02-20 11:21

  js 爬虫抓取网页数据(JS逆向方法论-反爬虫的四种常见方式(组图))

  如今,网页的代码越来越复杂。除了使用vue等前端框架让开发更简单外,主要是为了防止爬虫,所以越来越多的精力投入到编写爬虫上。攻防双方在交锋中结下了不好的关系,但也互相促进。

  本文讨论了JS反爬虫的策略,看看如何破解它们。

  

  JS 逆向方法论——四种常见的反爬方式

  1.JS写cookies

  如果我们要写爬虫来抓取某个网页中的数据,无非就是打开网页看源码。如果html中有我们想要的数据,那就简单了。使用requests请求URL获取网页源代码,然后解析提取。

  等等!requests得到的网页是一对JS,和浏览器看到的网页源码完全不一样!在这种情况下,浏览器运行这个 JS 来生成一个(或多个)cookie,然后用这个 cookie 发出第二个请求。当服务器接收到这个cookie时,它认为您的访问是通过浏览器的合法访问。

  事实上,你可以在浏览器(chrome、Firefox)中看到这个过程。首先删除Chrome浏览器保存的网站的cookie,按F12到Network窗口,选择“preserve log”(Firefox为“Persist logs”),刷新网页,这样我们就可以看到历史了网络请求记录。例如下图:

  

  js写cookie

  第一次打开“index.html”页面时,返回521,内容为一段JS代码;第二次请求页面时,获得正常的 HTML。查看这两个请求的cookie,可以发现第二个请求中带了一个cookie,而这个cookie并不是第一个请求时服务器发送的。其实是JS生成的。

  对策是研究JS,找到生成cookie的算法,爬虫可以解决这个问题。

  二、JS加密ajax请求参数

  编写爬虫爬取网页中的数据,发现网页源代码中没有我们想要的数据,有点麻烦。这些数据通常是通过 ajax 请求获得的。不过不要害怕,按F12打开Network窗口,刷新网页看看加载这个网页的时候已经下载了哪些URL,我们要的数据在一个URL请求的结果中。Chrome 网络中此类 URL 的大多数类型都是 XHR。通过观察他们的“Response”,我们可以找到我们想要的数据。

  然而,事情往往并不顺利。URL 收录很多参数,其中一个参数是一串看似无意义的字符串。这个字符串很可能是JS通过加密算法得到的,服务器也会通过同样的算法进行验证。验证通过后,它认为你是从浏览器请求。我们可以把这个URL复制到地址栏,把参数改成任意字母,访问看看能不能得到正确的结果,从而验证它是否是一个重要的加密参数。

  对于这样的加密参数,对策就是调试JS找到对应的JS加密算法。关键是在 Chrome 中设置“XHR/fetch Breakpoints”。

  

  三、JS反调试(反调试)

  之前大家都是用Chrome的F12来查看网页加载的过程,或者调试JS的运行过程。这个方法用的太多了,网站加了反调试策略。只要我们打开F12,它就会停在一个“调试器”代码行,无论如何也不会跳出来。它看起来像这样:

  

  无论我们点击多少次继续运行,它总是在这个“调试器”中,而且每次都会多出一个VMxx标签,观察“调用栈”发现似乎陷入了递归函数调用. 这个“调试器”让我们无法调试 JS。但是当F12窗口关闭时,网页正常加载。

  解决这种JS反调试的方法叫做“反反调试”,它的策略是通过“调用栈”找到让我们陷入死循环的函数并重新定义。

  这样的功能几乎没有其他功能,但对我们来说是一个陷阱。我们可以在“Console”中重新定义这个函数,比如把它重新定义为一个空函数,这样当我们再次运行它的时候,它什么也不做,不会把我们引入陷阱。在调用此函数的位置放置一个“断点”。因为我们已经陷进去了,要刷新页面,JS的运行应该停在设置的断点处。此时,该功能尚未运行。我们在Console中重新定义,继续运行跳过陷阱。

  四、JS 发送鼠标点击事件

  还有一些网站,其反爬不是上面的方法。您可以从浏览器打开普通页面,但在请求中您需要输入验证码或重定向其他页面。一开始你可能会感到困惑,但不要害怕,仔细看看“网络”可能会发现一些线索。例如,以下网络流中的信息:

  

  仔细观察后发现,每次点击页面的链接,都会发出“cl.gif”请求,貌似下载的是gif图片,其实不然。它在请求的时候会发送很多参数,这些参数就是当前页面的信息。例如,它收录点击的链接等。

  我们先梳理一下它的逻辑。JS 会响应链接被点击的事件。在打开链接之前,它会先访问cl.gif,将当前信息发送到服务器,然后再打开点击的链接。当服务器收到点击链接的请求时,会检查之前是否通过cl.gif发送过相应的信息。

  因为请求没有鼠标事件响应,所以直接访问链接,没有访问cl.gif的过程,服务器拒绝服务。

  了解了这个过程,我们想出对策就不难了,几乎不用研究JS内容(JS也可能修改点击的链接)绕过这个反爬策略,访问cl. gif 就可以了。关键是研究一下cl.gif之后的参数,把这些参数都带上就万事大吉了。

  结尾

  爬行动物和 网站 是一对敌人,他们彼此生活在一起。如果爬虫知道反爬策略,可以做出响应式反反爬策略;网站 知道了爬虫的防反爬策略,就可以制定“防反反爬”策略了……道高一尺高一丈,二人争斗将没有结束。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线