无检测指纹浏览器的 Puppeteer 与 Scrapeless
Scraping and Proxy Management Expert
TL;DR:
- Puppeteer 已经能够使用 Chrome DevTools 协议,因此
puppeteer.connect()通过一个 URL 将其指向 Scrapeless。 将本地的puppeteer.launch()替换为对云浏览器的连接,从而每个脚本都在干净的身份下运行。 - 本地 Puppeteer 浏览器在三个方面泄露自动化信息:
navigator.webdriver标志、无头默认指纹和您自己的出口 IP。反机器人系统将这三者一起打分。 - Scrapeless 爬虫浏览器在服务器端处理这三者 - 真实的自开发 Chromium、一致的每会话指纹且没有
webdriver标识,以及在 195 个以上国家的住宅出口。 - 您的 Puppeteer 代码保持不变。
page.goto、page.evaluate、选择器和等待的行为与本地完全相同;只有连接行发生了变化。 - 已验证直播: 一个
puppeteer.connect()会话将navigator.webdriver读取为false,报告了一个美国住宅出口 IP,并返回了目标页面的真实标题。 - 免费开始。 新的 Scrapeless 账户包括免费的爬虫浏览器运行时——请访问 app.scrapeless.com 注册。
介绍:连接 Puppeteer 到一个读取干净的浏览器
Puppeteer 通过 DevTools 协议驱动真实的 Chromium。在您的计算机上启动该 Chromium,任何脚本都会继承使自动化明显的信号:它通过 the navigator.webdriver 属性 自我声明,使用无头默认字体和画布行为,并通过声誉服务已识别的 IP 退出。
您可以通过隐身插件修补每一个问题,然后随着 Chromium 和检测器的变化继续修补。但有更短的路径。Puppeteer 通过 puppeteer.connect() 连接到任何暴露 DevTools 终端的浏览器,而 Scrapeless 爬虫浏览器 正是 通过一个 WebSocket URL 访问的 Chrome DevTools 协议 终端。将 Puppeteer 指向它,指纹、行为表面和出口 IP 移到服务器端——您的脚本保持在原地。
您可以用它做什么
- 针对反机器人保护的网站运行脚本——云浏览器在渲染期间清除挑战,因此
page.goto能够获取内容。 - 本地化会话——固定
proxyCountry,使页面以该市场的访问者视角呈现。 - 发送一致的指纹——传递一个
fingerprint对象,以确保用户代理、平台、屏幕和时区的一致性。 - 保持登录状态——携带一个
profileId,使得 cookies 和本地存储在不同运行间保存。 - 超越您的机器进行扩展——会话在云端运行,而不是在您的笔记本电脑上。
- 保持自动化一致——
page.evaluate、选择器、点击和等待保持不变。
为什么选择 Scrapeless 爬虫浏览器
Scrapeless 爬虫浏览器 是一个可定制的、抗检测的云浏览器,专为网络爬虫和 AI 代理设计。这个浏览器为 Puppeteer 特别带来了:
- 真实的自开发 Chromium,能够像 Chrome 一样精确运行页面 JavaScript,因此单页应用和挑战能够正常解析。
- 一致的每会话指纹——没有
navigator.webdriver标识,没有无头默认值泄露。 - 在 195 个以上国家的住宅出口,每会话使用一个
proxyCountry值选择。 - 通过
profileId持久化会话,使得身份验证流程能够保持状态。 - 一个连接界面——每个选项都是同一 WebSocket 终端上的查询参数。
获取免费的 API 密钥,请访问 app.scrapeless.com。
前提条件
- Node.js 18 或更新版本
- 安装
puppeteer-core(不需要捆绑的 Chromium — 您连接到远程的浏览器) - 一个 Scrapeless 账户和 API 密钥——请在 app.scrapeless.com 注册
完整的连接细节见于 爬虫浏览器文档。
安装
使用 puppeteer-core — 它不包含本地的 Chromium 下载,因为浏览器在云端运行。
bash
npm install puppeteer-core
export SCRAPELESS_API_KEY=your_api_token_here # 免费密钥在 https://app.scrapeless.com
配置连接
终端为 wss://browser.scrapeless.com/api/v2/browser,每个选项都是查询参数。将 proxyCountry 固定为住宅区域。
javascript
import { URLSearchParams } from "node:url";
function scrapelessEndpoint(extra = {}) {
```javascript
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: "180", // 秒
proxyCountry: "US",
...extra,
});
return `wss://browser.scrapeless.com/api/v2/browser?${params}`;
}
连接和运行
将 puppeteer.launch() 替换为 puppeteer.connect() 并传入端点。之后的一切都是标准的 Puppeteer。
javascript
import puppeteer from "puppeteer-core";
import { URLSearchParams } from "node:url";
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: "180",
proxyCountry: "US",
});
const endpoint = `wss://browser.scrapeless.com/api/v2/browser?${params}`;
const browser = await puppeteer.connect({ browserWSEndpoint: endpoint });
const page = await browser.newPage();
await page.goto("https://www.scrapeless.com/en", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log("标题:", await page.title());
console.log("navigator.webdriver:", await page.evaluate(() => navigator.webdriver));
await page.goto("https://httpbin.io/ip", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log("退出 IP:", JSON.parse(await page.evaluate(() => document.body.innerText)).origin);
await browser.close();
此脚本的实时运行打印了页面标题 轻松网络爬虫工具包 - Scrapeless,navigator.webdriver: false,以及一个美国住宅退出 IP —— 与您已经使用的相同 Puppeteer API,通过云浏览器提供。
在免费计划中获取您的 API 密钥:app.scrapeless.com
发送一致的指纹
一个 fingerprint 对象保持浏览器所宣传的身份一致——用户代理、平台、屏幕和时区完全一致。将其 JSON 编码,URL 编码,并作为一个参数传递。W3C WebDriver 规范 要求符合的自动化暴露 webdriver 标志;云浏览器不携带此标志,因此您发送的指纹不会与之矛盾。
javascript
const fingerprint = {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
platform: "Windows",
screen: { width: 1920, height: 1080 },
localization: { languages: ["zh-CN", "zh"], timezone: "Asia/Shanghai" },
};
const endpoint = scrapelessEndpoint({ fingerprint: encodeURIComponent(JSON.stringify(fingerprint)) });
本地 Puppeteer 停止的地方
在您自己的 Chromium 上运行 Puppeteer 适用于公开的、未受保护的页面。当目标评估浏览器时就出现摩擦:在数据中心 IP 上停滞的挑战插页,一个指纹头less默认值的页面,或希望在访问之间保持稳定身份的登录墙。每种情况都是指纹、行为或 IP 问题——正是云浏览器在服务器端处理的三种情况。连接到 Scrapeless 将这些情况交给托管会话,而您的 page 调用仍然保持不变。
您得到的回馈
会话的行为与任何 Puppeteer 会话相同——page.goto、page.evaluate、page.$$eval 和 cookies 都可以正常工作。通过云浏览器运行时的一些诚实观察:
navigator.webdriver是false,所以网站运行的第一次检查看起来像是真正的 Chrome。sessionTTL以秒为单位——设置得足够长以涵盖完整流程;会话在超时时关闭。- 退出 IP 与
proxyCountry匹配——地理限制页面按照本地访客看到的样子进行解析。 - 为顽固页面预热会话——首先加载网站的主页,然后再访问受保护页面,因此行为表面看起来像正常访问。
结论:相同的 Puppeteer,更清洁的浏览器
Puppeteer 决定做什么;Scrapeless 决定浏览器在网站上看起来如何。集成只需一行——puppeteer.connect() 连接云浏览器——其余的脚本保持不变。将 proxyCountry 固定为住宅区域,传递一致的 fingerprint,并重用 profileId 进行身份验证流程。要从 Python 运行相同的云浏览器,请参阅 Scrapling 生产爬虫指南,并在 Scrapeless 定价页面 上比较计划。
准备建立您的 Puppeteer 爬虫管道?
加入我们的社区以获取免费计划,并与构建 Puppeteer 管道的开发人员联系:Discord · Telegram。
在 app.scrapeless.com 注册以获得免费的爬虫浏览器运行时,并将 puppeteer.connect() 指向您的目标无法进行指纹识别的云浏览器。
常见问题
问:我需要更改我的 Puppeteer 代码吗?
不需要。您只需更改获取浏览器的方式 — 使用 puppeteer.connect({ browserWSEndpoint }) 代替 puppeteer.launch()。之后的每个 page 调用都是一样的。
问:使用 puppeteer 还是 puppeteer-core?
使用 puppeteer-core。它跳过了捆绑的 Chromium 下载,因为您连接到云浏览器而不是启动本地浏览器。
问:我需要代理吗?
不需要。住宅出口是内置的 — 将 proxyCountry 设置为一个区域或 ANY。没有单独的代理需要连接。
问:sessionTTL 是以秒还是毫秒为单位?
在这里,Scraping Browser 的连接是以秒为单位的 — 180 是三分钟。请设置它以覆盖整个流程。
问:使用 Puppeteer 进行网络爬取合法吗?
访问公开可用数据通常是被允许的,但规则因管辖区和网站而异。请查看目标网站的服务条款,遵守 robots 指令,并就任何敏感问题咨询律师。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



