阅读 929

Puppeteer在工作中是如何伪装自己的(爬虫与反爬虫)

为了更好保护我们的数据与程序安全.

今天就介绍一下,如何检测访问我们的web程序是否为无头浏览器, 以及他们的一些反检测的方法.

Webdriver检测

一般来说,如果是无头浏览器模式下, navigator.webdriver 会返回 true.

检测方式

最简单的检测方式

if (navigator.webdriver) {
  // 针对无头浏览器的操作
}
复制代码

使用defineProperty删除webdriver后如何检测

如果对方使用以下方式删除了webdriver属性,其实还是有办法检测的

 Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined,
 })
复制代码

应对方案

以下方式,还是可以检测出来

webdriver in navigator
复制代码
navigator.hasOwnProperty("webdriver")
复制代码

绕过方法

直接删掉webdriver属性,这是我目前验证成功的方法. 目前其他网上找到的方法已经无效.

await page.evaluateOnNewDocument(() => {
    const newProto = navigator.__proto__;
    delete newProto.webdriver;
    navigator.__proto__ = newProto;
  });
复制代码

chrome属性检测

检测方式

在无头浏览器模式下,全局对象下的chrome对象是没有 runtime属性的

if (!window.chrome || !window.chrome.runtime) {
  // 无头浏览器模式...
}
复制代码

绕过方法

所以绕过方法也很简单,我们只需要伪造一个

window.navigator.chrome = {
    runtime: {}
  };
复制代码

如果是Puppeteer 我们跟上面一样,只要提前运行一下上面的代码就好了.

await page.evaluateOnNewDocument(() => {
    window.navigator.chrome = {
        runtime: {}
      };
  });
复制代码

尾巴

其他网络上的方法我都尝试过,可以成功的我都放在了这里. 因为浏览器跟反爬虫方式时时刻刻都会更新,所以可能当你看到这篇文章的时候. 有的方式已经不能用了,但是核心点还是要善于观察力与对比. 所有的形式都可以有伪装与绕过的方法.大致思路都跟上面提到的差不多.