如何使用Puppeteer Stealth

如何使用Puppeteer Stealth抓取插件

Puppeteer 是一个很棒的无头浏览器库,但它很容易被反抓取措施检测和阻止。这就是 Puppeteer Extra 在 Stealth 等插件的帮助下发挥关键作用的地方。

本教程介绍Puppeteer Stealth 以及如何使用它抓取网页。让我们开始吧!

什么是 Puppeteer Extra?

Puppeteer Extra 是一个开源库,旨在扩展流行的 Puppeteer 无头浏览器的功能。

以下是您可以与 Puppeteer Extra 一起使用的一些主要插件的列表以及它们的作用:

  • Stealth 插件通过掩盖无头浏览器和常规 Chrome 浏览器之间的细微差别来隐藏 Puppeteer 的自动化属性。
  • AdBlocker 插件阻止广告和跟踪器。
  • User Data Dir 插件在会话之间维护一致的浏览器数据和设置。
  • reCAPTCHA 插件自动解决 hCAPTCHA 和 reCAPTCHAs。
  • Block Resource 插件拦截并阻止不需要的资源,包括图像、字体、CSS 等。
  • DevTools 插件创建了一个通往 Chrome DevTools API 的安全门户,以允许从任何地方进行调试和自定义分析。

我们将专注于如何避免使用 Puppeteer 进行检测

什么是 Puppeteer Stealth?

Puppeteer Stealth,也称为 puppeteer-extra-plugin-stealth,是建立在 Puppeteer Extra 之上的扩展,它使用不同的技术来隐藏可能将您的请求标记为机器人的属性。这使得网站更难检测到您的抓取工具。

Puppeteer Stealth 有什么作用?

虽然使用无头浏览器进行网络抓取可为您提供类似浏览器的访问权限,但网站也可以获得代码执行访问权限。这意味着他们可以利用各种浏览器指纹识别脚本来收集可以识别您的自动浏览器的数据。

Puppeteer Stealth 在这里至关重要。它的目标是掩盖一些默认的无头属性,例如headless: truenavigator.webdriver: true请求标头,以在雷达下爬行。

这要归功于扩展模块。

内置规避模块

内置规避模块是驱动 Puppeteer Stealth 功能的预打包插件。如前所述,基础 Puppeteer 有漏洞或属性将其标记为机器人,Stealth 插件旨在修复这些漏洞。

每个Puppeteer Stealth 规避模块都旨在堵住特定的漏洞。看看下面:

  • iframe.contentWindowHEADCHR_iframe通过修改window.top和修复检测window.frameElement
  • Media.codecs修改codecs以支持实际 Chrome 支持的内容。
  • Navigator.hardwareConcurrency将逻辑处理器的数量设置为四个。
  • Navigator.languages修改languages属性以允许自定义语言。
  • Navigator.plugin模拟navigator.mimeTypesnavigator.plugins使用功能模拟来匹配人类使用的标准 Chrome。
  • Navigator.permissions屏蔽permissions属性以通过权限测试。
  • Navigator.vendors使自定义属性成为可能navigator.vendor
  • Navigator.webdriver掩码navigator.webdriver
  • Sourceurl隐藏了sourceurlPuppeteer 脚本的属性。
  • User-agent-override修改用户代理组件。
  • Webgl.vendor更改了Vendor/Renderer来自 Google 的属性,这是 Puppeteer headless 的默认值。
  • Window.outerdimensions添加缺失的window.outerWidthwindow.outerHeight属性。

如何使用 Puppeteer Stealth 抓取网页

在我们以隐身模式深入 Puppeteer 之前,有必要使用基本的无头浏览器探索网络抓取。作为目标,我们将使用NowSecure,这是一个网站,它会在每次请求时抛出反机器人挑战,并you passed在您成功时显示一条消息。

让我们开始!

  1. 使用以下命令安装NodeJSPuppeteer :
npm install puppeteer
  1. 导入 Puppeteer 并打开一个async函数,您将在其中编写代码。
import puppeteer from 'puppeteer';
 
(async () => {
 
 
 
}
  1. 启动浏览器,创建一个新页面,然后导航到您的目标 URL。
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
 
  await page.goto('https://nowsecure.nl/');
  1. 设置屏幕大小,等待页面加载,截图,然后关闭浏览器。
    // Set screen size
    await page.setViewport({width: 1280, height: 720});
 
    //wait for page to load
    await page.waitForTimeout(30000); 
 
    // Take screenshot 
    await page.screenshot({ path: 'image.png', fullPage: true }); 
 
    // Closes the browser and all of its pages 
    await browser.close(); 
})();

将所有这些放在一起,这是您的完整代码:

import puppeteer from 'puppeteer';
 
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    //navigate to target URL
    await page.goto('https://nowsecure.nl/');
 
    // Set screen size
    await page.setViewport({width: 1280, height: 720});
 
    //wait for page to load
    await page.waitForTimeout(30000); 
 
    // Take screenshot 
    await page.screenshot({ path: 'image.png', fullPage: true }); 
 
    // Closes the browser and all of its pages 
    await browser.close(); 
})();

这是网页的截图:

medium_nowsecure_blocked_46d5bb4831

上面的结果表明我们的 Puppeteer 脚本被阻止了,因为我们无法绕过反机器人检测。

现在,让我们尝试使用 Puppeteer Stealth 抓取同一个网站。

以下是您必须采取的步骤:

第 1 步:安装 Puppeteer-Stealth

如前所述,我们需要 Puppeteer Extra 库来使用 Puppeteer Stealth。因此,请使用以下命令安装两者。

npm install puppeteer-extra puppeteer-extra-plugin-stealth

第 2 步:配置 Puppeteer-Stealth

要配置 Puppeteer Stealth,首先导入 Puppeteer Extra。

const puppeteer = require('puppeteer-extra')

然后添加 Stealth 插件并在默认模式下使用它,以确保您的脚本使用所有规避模块。

// add stealth plugin and use defaults (all evasion techniques)
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())

接下来,导入executablePath(您的 Chrome 可执行文件的路径)。例如,在 Windows 上,路径可能如下所示:

const executablePath = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'; // Replace this with the path to your Chrome executable

在指定执行路径的同时启动 Puppeteer Stealth 并打开一个async函数。

puppeteer.launch({ executablePath: executablePath() }).then(async browser => {


}

第 3 步:截图

就像在我们的基础 Puppeteer 脚本中一样,创建一个新页面,设置屏幕大小,然后导航到目标网站。

// Create a new page 
const page = await browser.newPage(); 
 
// Setting page view 
await page.setViewport({ width: 1280, height: 720 }); 
 
// Go to the website 
await page.goto('https://nowsecure.nl/'); 

最后,等待页面加载并截图。

    // Wait for security check 
    await page.waitForTimeout(10000); 
 
    await page.screenshot({ path: 'image.png', fullPage: true }); 
 
    await browser.close(); 
});

这是我们的结果:

medium_nowsecure_success_c2fe4c0faf

恭喜!您使用 Puppeteer Extra Stealth 阻止了机器人检测。

让我们更进一步,抓取页面。

第 4 步:抓取页面

首先,右键单击要抓取的元素并选择“检查”。这将打开 Chrome DevTools,您将在Elements选项卡中找到选择器。

medium_nowsecure_devtools_836ee805d3

接下来,复制选择器并使用每个选择器获取其文本。该querySelector方法非常适合此目的。

    await page.goto('https://nowsecure.nl/'); 
    await page.waitForTimeout(10000); 
 
    // Get title text 
    title = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > header > div > h3').textContent; 
    }); 
 
    // Get message text 
    msg = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > h1').textContent; 
     }); 
 
     // get state text 
    state = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > p:nth-child(2)').textContent; 
    }); 
 
    // print out the results 
    console.log(title, 'n', msg, 'n', state); 
 
    await browser.close(); 
});

该脚本使用该.textContent方法获取每个元素的文本。可以重复相同的过程并将其保存到变量中。

完整的代码如下所示:

const puppeteer = require('puppeteer-extra'); 
 
// Add stealth plugin and use defaults 
const pluginStealth = require('puppeteer-extra-plugin-stealth'); 
const {executablePath} = require('puppeteer'); 
 
// Use stealth 
puppeteer.use(pluginStealth()); 

//Import your executablePath
const executablePath = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'; // Replace this with the path to your Chrome executable
 
// Launch pupputeer-stealth 
puppeteer.launch({ headless:true, executablePath: executablePath() }).then(async browser => { 
    // Create a new page 
    const page = await browser.newPage(); 
 
    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 
 
    // Go to the website 
    await page.goto('https://nowsecure.nl/'); 
 
    // Wait for security check 
    await page.waitForTimeout(10000); 
 
    // Get title text 
    title = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > header > div > h3').textContent; 
    }); 
 
    // Get message text 
    msg = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > h1').textContent; 
    }); 
 
     // get state text 
    state = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > p:nth-child(2)').textContent; 
     }); 
 
    // print out the results 
    console.log(title, 'n', msg, 'n', state); 
 
    await browser.close(); 
});

运行脚本后,输出应如下所示:

medium_nowsecure_text_5d606c3587

您解决了主要问题并成功避免了 Puppeteer 机器人检测。

puppeteer-extra-plugin-stealth 的局限性和解决方案

虽然 Puppeteer Stealth 在避免被发现方面做了很多工作,但它也有其局限性:

  • 它无法避免高级反机器人。例如,如果您使用 Puppeteer Stealth 试图绕过 Cloudflare绕过 DataDome,您的脚本很容易被检测到并被阻止。
  • 它可能会变得非常慢,因此难以扩展
  • 与其他无头浏览器一样,很难调试

让我们看一个针对 Cloudflare 的 Puppeteer Stealth 示例。

我们将尝试使用与之前相同的代码来抓取受 Cloudflare 保护的网站Okta 。

// same as before 
puppeteer.launch({ headless:true, executablePath: executablePath() }).then(async browser => { 
    const page = await browser.newPage(); 
    await page.setViewport({ width: 1280, height: 720 }); 
 
    // Go to the website 
    await page.goto('https://okta.com/'); 
 
    // Wait for security check 
    await page.waitForTimeout(10000); 
    await page.screenshot({ path: 'image.png', fullPage: true }); 
    await browser.close(); 
});

首先,注册以获取免费的 API 密钥。然后,通过在终端中输入以下命令来安装 ZenRows:

这是我们的结果:

medium_okta_blocked_496ac629c6

我们直接被挡住了!幸运的是,有一个快速的解决方案。使用 ZenRows 库,您甚至可以绕过最复杂的反机器人程序。

让我们看看它的实际效果。

npm install zenrows

接下来,导入 ZenRows 并打开一个async函数。

// import ZenRows
const { ZenRows } = require("zenrows");

(async () => {




}

然后,创建一个新的 ZenRows 实例,定义您的目标 URL 和所需的参数:antibot: truepremium_proxy: true。对于这个例子,我们将抓取上面阻止我们的网站。

const { ZenRows } = require("zenrows");

(async () => {
    //create new zenrows instance
    const client = new ZenRows("Your API Key");
    const url = "https://www.okta.com/";

    //make request with the required parameters
    try {
        const { data } = await client.get(url, {
            "antibot": "true",
            "premium_proxy": "true"
});
        console.log(data);
    } catch (error) {
        console.error(error.message);
        if (error.response) {
            console.error(error.response.data);
        }
    }
})();

这是我们的结果:

medium_zenrows_okta_success_8eba20e28c

结论

Puppeteer 是一种流行的网络抓取和自动化工具。但它的默认属性使网站可以轻松检测和阻止您的机器人。幸运的是,Puppeteer Stealth 让您可以利用其规避模块来躲避雷达。

然而,Puppeteer Stealth 跟不上反机器人措施的频繁发展。因此,它不适用于高级障碍。

类似文章