如何使用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: true
和navigator.webdriver: true
请求标头,以在雷达下爬行。
这要归功于扩展模块。
内置规避模块
内置规避模块是驱动 Puppeteer Stealth 功能的预打包插件。如前所述,基础 Puppeteer 有漏洞或属性将其标记为机器人,Stealth 插件旨在修复这些漏洞。
每个Puppeteer Stealth 规避模块都旨在堵住特定的漏洞。看看下面:
- iframe.contentWindow
HEADCHR_iframe
通过修改window.top
和修复检测window.frameElement
。 - Media.codecs修改
codecs
以支持实际 Chrome 支持的内容。 - Navigator.hardwareConcurrency将逻辑处理器的数量设置为四个。
- Navigator.languages修改
languages
属性以允许自定义语言。 - Navigator.plugin模拟
navigator.mimeTypes
并navigator.plugins
使用功能模拟来匹配人类使用的标准 Chrome。 - Navigator.permissions屏蔽
permissions
属性以通过权限测试。 - Navigator.vendors使自定义属性成为可能
navigator.vendor
。 - Navigator.webdriver掩码
navigator.webdriver
。 - Sourceurl隐藏了
sourceurl
Puppeteer 脚本的属性。 - User-agent-override修改用户代理组件。
- Webgl.vendor更改了
Vendor/Renderer
来自 Google 的属性,这是 Puppeteer headless 的默认值。 - Window.outerdimensions添加缺失的
window.outerWidth
或window.outerHeight
属性。
如何使用 Puppeteer Stealth 抓取网页
在我们以隐身模式深入 Puppeteer 之前,有必要使用基本的无头浏览器探索网络抓取。作为目标,我们将使用NowSecure,这是一个网站,它会在每次请求时抛出反机器人挑战,并you passed
在您成功时显示一条消息。
让我们开始!
- 使用以下命令安装NodeJS和Puppeteer :
npm install puppeteer
- 导入 Puppeteer 并打开一个
async
函数,您将在其中编写代码。
import puppeteer from 'puppeteer'; (async () => { }
- 启动浏览器,创建一个新页面,然后导航到您的目标 URL。
(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); 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(); })();
将所有这些放在一起,这是您的完整代码:
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(); })();
上面的结果表明我们的 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(); });
恭喜!您使用 Puppeteer Extra Stealth 阻止了机器人检测。
让我们更进一步,抓取页面。
第 4 步:抓取页面
首先,右键单击要抓取的元素并选择“检查”。这将打开 Chrome DevTools,您将在Elements
选项卡中找到选择器。
接下来,复制选择器并使用每个选择器获取其文本。该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(); });
您解决了主要问题并成功避免了 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:
我们直接被挡住了!幸运的是,有一个快速的解决方案。使用 ZenRows 库,您甚至可以绕过最复杂的反机器人程序。
让我们看看它的实际效果。
npm install zenrows
接下来,导入 ZenRows 并打开一个async
函数。
// import ZenRows const { ZenRows } = require("zenrows"); (async () => { }
然后,创建一个新的 ZenRows 实例,定义您的目标 URL 和所需的参数:antibot: true
和premium_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); } } })();
这是我们的结果:
结论
Puppeteer 是一种流行的网络抓取和自动化工具。但它的默认属性使网站可以轻松检测和阻止您的机器人。幸运的是,Puppeteer Stealth 让您可以利用其规避模块来躲避雷达。
然而,Puppeteer Stealth 跟不上反机器人措施的频繁发展。因此,它不适用于高级障碍。