无头浏览器中的爬虫与反爬虫


无头浏览器中的爬虫与反爬虫

一些网站为了防止数据的爬取,一般会检测访问我们的web程序是否为无头浏览器, 以及他们的一些反检测的方法;
因为浏览器跟反爬虫方式时时刻刻都会更新,所以可能当你看到这篇文章的时候,有的方式已经不能用了,但是核心点还是要善于观察与对比。
所有的形式都可以有伪装与绕过的方法。大致思路都相差不多。

Webdriver检测

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

// 1.最简单的检测方式
if (navigator.webdriver) {
    // 针对无头浏览器的操作
}
webdriver in navigator

// 1.绕过方法
Object.defineProperty(navigator, 'webdriver', {
    get: () => undefined,
})

// 2.使用defineProperty删除webdriver后如何检测
navigator.hasOwnProperty("webdriver")

// 2.绕过方法
// 直接删掉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: {}
    };
});

文章作者: darebeat
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 darebeat !
 上一篇
Markdown语法汇总 Markdown语法汇总
Markdown是一种轻量标记语言,通过简单的语法,使普通文本具有一定的格式;通过文本写出你想要的文字和排版,为用户提供了超高效的沉浸式写作体验。
2020-11-17
下一篇 
JAVA并发 JAVA并发
Java是一种多线程编程语言,我们可以使用Java来开发多线程程序。 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU时。多线程使您能够写入多个活动,可以在同一程序中同时进行操作处理。
2020-11-02
  目录