js抓取网页内容(网页代码搞得越来越复杂怎么办?看看这中间都有着怎样的方法破解 )

优采云 发布时间: 2021-09-10 18:15

  js抓取网页内容(网页代码搞得越来越复杂怎么办?看看这中间都有着怎样的方法破解

)

  现在网页代码越来越复杂了。除了使用vue等前端框架让开发更简单之外,主要是为了防止爬虫,所以写爬虫需要越来越多的努力。攻守相争,结下缘分,却相互促进。

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

  

  一、JS写cookie

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

  等等! requests得到的网页是一对JS,和浏览器打开看到的网页源码完全不同!在这种情况下,往往是浏览器运行这个JS来生成一个(或多个)cookie,然后拿着这个cookie进行第二次请求。当服务器收到此 cookie 时,它​​会将您的访问视为通过浏览器进行的合法访问。

  实际上,您可以在浏览器中看到此过程(chrome 或 Firefox 都可以)。首先删除Chrome浏览器中保存的网站cookie,按F12到Network窗口,选择“保留日志”(Firefox是“Persist logs”),刷新网页,这样我们就可以看到Network请求记录的历史记录了比如下图:

  

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

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

  二、JS 加密的ajax请求参数

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

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

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

  

  三、JS 反调试(anti-debug)

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

  

  无论我们点击多少次继续运行,它总是在这个“调试器”里,每次都会多出一个VMxx标签,观察“调用栈”发现好像卡在了一个函数的递归调用。这个“调试器”阻止我们调试 JS。但是关闭F12窗口,网页加载正常。

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

  这样的功能几乎没有其他功能,但对我们来说是陷阱。我们可以在“控制台”中重新定义这个函数,比如将它重新定义为一个空函数,这样当我们再次运行它时,我们什么都不做,不会导致我们陷入陷阱。在调用此函数的地方键入“Breakpoint”。因为我们已经在陷阱中了,要刷新页面,JS操作应该停在设置的断点处。此时,该功能尚未运行。我们在 Console 中重新定义它并继续运行以跳过陷阱。

  四、JS 发送鼠标点击事件

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

  

  仔细观察后发现,每次点击页面上的链接,都会发出“cl.gif”的请求。看起来它正在下载 gif 图片,但事实并非如此。它在请求时发送了很多参数,这些参数就是当前页面的信息。例如,它收录点击的链接等。

  我们先梳理一下它的逻辑。 JS 会响应链接被点击的事件。打开链接前,先访问cl.gif,将当前信息发送到服务器,然后打开点击的链接。服务器接收到点击链接的请求,会检查之前是否通过cl.gif发送过相应的信息。如果发送,则视为合法浏览器访问,给出正常网页内容。

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

  了解这个过程,我们不难想出对策,几乎不需要研究JS的内容(JS也可能修改点击的链接)绕过这个反爬策略,无非就是访问首先链接只需单击 cl.gif。关键是研究cl.gif之后的参数。带上这些参数就可以了。

  结束

  爬行动物和网站是一对敌人。当爬虫知道反爬策略时,可以做出响应式反爬策略; 网站知道爬虫的反反爬策略,他可以做出“反反反爬”的策略……两者之间的斗争不会结束。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线