使用 Playwright Stealth 避免机器人检测:2026 年的 9 个解决方案
Expert Network Defense Engineer
TL;DR:
- Playwright泄漏指纹。 默认的无头Chromium实例广播自动化信号,如
navigator.webdriver、缺失的插件和可预测的视口大小。 - Python和Node.js生态系统不同。 在Python中使用
playwright-stealth(使用v2.x上下文管理器),在Node.js中使用playwright-extra来修补这些泄漏。 - 隐匿需要多层保护。 绕过现代检测需要修补JavaScript层、随机化请求头、轮换代理并同时管理会话cookie。
- 云浏览器处理其余部分。 当本地隐匿插件在先进的WAF面前失败时,将浏览器执行转移到托管基础设施是唯一可靠的升级路径。
- 免费开始。 新的Scrapeless账户包括免费的抓取浏览器运行时——请访问app.scrapeless.com注册。
引言:默认自动化的局限性
Playwright是一种强大的浏览器自动化工具,但开箱即用时,它会以机器人的身份自我表露。当你启动无头Chromium实例时,它带有特定的标志——如设置为true的navigator.webdriver标志、缺失的标准浏览器插件和独特的WebGL签名。来自Cloudflare、DataDome和Akamai的现代反机器人系统会读取这些信号,并在你的脚本甚至解析DOM之前阻止请求。
要抓取受保护的网站,你需要Playwright隐匿模式。然而,“隐匿模式”并不是你在Playwright库中可以切换的内置开关。它需要实现特定的技术来修补浏览器指纹泄漏、管理网络特征并模拟人类行为。
本指南分解了2025年使用Playwright避免机器人检测的9种实用解决方案,并提供了详细的代码示例,帮助你应对现代网络抓取的复杂性。
你可以用它做什么
- 绕过基本的机器人检测。 通过修补
navigator.webdriver和用户代理泄漏,访问阻止默认无头浏览器的网站。 - 标准化浏览器指纹。 将真实的硬件并发、内存和插件数据注入你的无头Chromium实例。
- 保持会话持久性。 将隐匿补丁与适当的cookie和上下文管理相结合,以延长会话的生存时间。
- 扩展数据提取。 运行并行的、经过隐匿补丁的浏览器上下文,以进行高容量的抓取任务。
为什么选择Scrapeless抓取浏览器
Scrapeless抓取浏览器是一种可自定义的反检测云浏览器,专为网络爬虫和AI代理设计。当本地隐匿插件在先进的WAF面前遇到瓶颈时,它提供:
- 内置反检测。 超越JavaScript补丁的原生指纹伪装,包括TLS和TCP指纹管理。
- 自动代理轮换。 集成了195+个国家的住宅代理,以解决IP声誉问题。
- 管理的挑战解决。 自动解决Cloudflare Turnstile、reCAPTCHA和hCaptcha。
- Playwright兼容性。 通过CDP将现有的Playwright脚本连接到云浏览器,只需一行代码。
在app.scrapeless.com的免费计划上获取你的API密钥。
先决条件
- Node.js 18+ 或 Python 3.10+
- 一个Scrapeless账户和API密钥——请在app.scrapeless.com注册
- 对Playwright自动化的基本了解
避免Playwright隐匿检测的9种解决方案
1. 禁用 navigator.webdriver 标志
自动化中最常见的指标之一是navigator.webdriver属性,在自动化浏览器环境中,该属性被设置为true。W3C WebDriver标准特别定义了该标志,以便服务器能够识别自动化流量。网站可以轻松检查该标志以识别机器人。禁用它是一种基本的隐匿技术。
代码操作步骤:
使用page.add_init_script()注入JavaScript,修改navigator.webdriver属性,使其在任何站点脚本运行之前:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
# 注入JavaScript以禁用webdriver标志
context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
""")
page = context.new_page()
page.goto("https://bot.sannysoft.com/")
page.screenshot(path="webdriver_disabled.png")
browser.close()
2. 随机化用户代理字符串
User-Agent头部向网络服务器识别浏览器和操作系统。使用一致或过时的User-Agent(尤其是包含HeadlessChrome的)强烈表明是一个机器人。随机化User-Agent字符串有助于表现得像不同的合法用户。
代码操作步骤:
维护一个常见User-Agent字符串的列表,并为每个会话随机选择一个:
python
from playwright.sync_api import sync_playwright
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0"
]
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(user_agent=random.choice(user_agents))
page = context.new_page()
page.goto("https://www.whatismybrowser.com/detect/what-is-my-user-agent")
page.screenshot(path="random_user_agent.png")
browser.close()
3. 使用代理和轮换IP地址
来自同一IP地址的重复请求是机器人活动的主要指标。使用代理池和为每个请求或会话轮换IP地址可以分散流量,避免基于IP的阻止。
代码操作步骤:
配置Playwright以使用代理:
python
from playwright.sync_api import sync_playwright
import random
proxies = [
"http://user1:pass1@proxy1.example.com:8080",
"http://user2:pass2@proxy2.example.com:8080"
]
with sync_playwright() as p:
# 使用随机选择的代理启动浏览器
browser = p.chromium.launch(headless=True, proxy={
"server": random.choice(proxies)
})
page = browser.new_page()
page.goto("https://www.whatismyip.com/")
browser.close()
对于大规模操作,考虑使用像Scrapeless Proxies这样的托管代理服务,以自动处理轮换。
4. 模拟真实的鼠标移动和键盘输入
机器人通常直接而瞬间地与网页元素互动,这是不自然的。反机器人系统跟踪行为生物识别,如光标速度和击键节奏。模拟人类的鼠标移动、点击和键盘输入可以减少被检测的几率。
代码操作步骤:
使用page.mouse和page.keyboard方法引入延迟和真实的路径:
python
from playwright.sync_api import sync_playwright
import time
import random
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.example.com")
# 模拟人类输入
search_input = page.locator("#search-box")
search_input.click()
text_to_type = "Playwright Stealth"
for char in text_to_type:
page.keyboard.type(char)
time.sleep(random.uniform(0.05, 0.2)) # 在按键之间的随机延迟
page.keyboard.press("Enter")
browser.close()
5. 管理Cookies和会话数据
网站使用Cookies跟踪用户会话。在请求之间丢弃Cookies的机器人容易被识别为自动流量。通过接受和发送Cookies来保持一致的会话对于隐蔽性至关重要。
代码操作步骤:
使用context.storage_state()保存Cookies和本地存储的数据,然后将其加载到新的会话中:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
# 情景1:保存当前会话Cookies以备将来使用
context = browser.new_context()
page = context.new_page()
page.goto("https://www.example.com/login")
# 执行登录...
# 保存状态
context.storage_state(path="state.json")
browser.close()
# 情景2:从之前的会话加载Cookies
browser2 = p.chromium.launch(headless=True)
context2 = browser2.new_context(storage_state="state.json")
page2 = context2.new_page()
page2.goto("https://www.example.com/dashboard")
browser2.close()
6. 调整视口大小和设备模拟
网站检查视口大小和屏幕分辨率以检测异常。使用默认的800x600视口是一个常见的红旗。模拟常见的设备配置有助于融入真实用户流量。
代码操作步骤:
在创建新上下文时设置viewport和user_agent:
python
from playwright.sync_api import sync_playwright
import random
viewports = [
{"width": 1920, "height": 1080}, # 台式机
{"width": 1366, "height": 768}, # 笔记本电脑
]
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
selected_viewport = random.choice(viewports)
context = browser.new_context(
viewport=selected_viewport
)
page = context.new_page()
page.goto("https://www.deviceinfo.me/")
browser.close()
7. 避免无头模式检测
虽然无头模式效率高,但一些反机器人系统可以通过检查缺失图形渲染能力来检测它。在可见浏览器用户界面的有头模式下运行 Playwright 有时可以绕过检测,尤其是对于更具侵略性的系统。
代码操作步骤:
启动浏览器时设置 headless=False:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 在有头模式下启动
page = browser.new_page()
page.goto("https://www.example.com")
browser.close()
8. 使用 playwright-stealth 和 playwright-extra
不要手动编写 JavaScript 注入,要使用专门的隐身包。Python 生态系统使用 playwright-stealth,而 Node.js 使用 playwright-extra 结合 puppeteer-extra-plugin-stealth。这些库自动应用一套规避策略来修补 浏览器指纹。
代码操作步骤(Python):
安装包(pip install playwright-stealth)并使用 v2.x 上下文管理器 API:
python
import asyncio
from playwright_stealth import Stealth
from playwright.async_api import async_playwright
async def main():
# 上下文管理器自动应用隐身补丁
async with Stealth().use_async(async_playwright()) as playwright:
browser = await playwright.chromium.launch(headless=True)
context = await browser.new_context()
page = await context.new_page()
await page.goto("https://bot.sannysoft.com/")
await browser.close()
asyncio.run(main())
9. 在操作中实现延迟和随机化
机器人通常以完美的时间和速度执行操作。在操作之间引入随机延迟并变换交互速度会使脚本看起来更像人类。
代码操作步骤:
使用 time.sleep() 和随机间隔:
python
from playwright.sync_api import sync_playwright
import time
import random
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://www.example.com")
# 使用随机延迟模拟浏览
time.sleep(random.uniform(2, 5)) # 初始页面加载延迟
page.click("a[href='/products']")
page.locator("input[name='q']").fill("search item")
time.sleep(random.uniform(0.5, 1.5)) # 输入后延迟
page.keyboard.press("Enter")
browser.close()
在免费计划上获取您的 API 密钥: app.scrapeless.com
结论:超越基本的隐身
Playwright 隐身插件和行为调整对于基本的网页抓取是必不可少的,但它们有硬性限制。它们在 JavaScript 层面操作,这意味着它们无法伪造 TLS 指纹、TCP 窗口大小或解决复杂的行为挑战,例如 Cloudflare Turnstile。
当您的隐身补丁本地浏览器开始接收 403 错误或 CAPTCHA 循环时,解决方案不是编写更多的 JavaScript 躲避。解决方案是将浏览器执行卸载到托管基础设施,如 Scrapeless Scraping Browser,该基础设施自动处理 IP 轮换、TLS 指纹和挑战解决,同时让您能够保持 Playwright 代码。
准备构建您的 AI 驱动数据管道了吗?
加入构建强大数据提取系统的开发者社区。
- Discord: https://discord.gg/VU2vtbq7Q2
- Telegram: https://t.me/scrapeless
- 注册: app.scrapeless.com
常见问题
问:Playwright 隐身是否内置于库中?
不是。Playwright 没有本地隐身模式。您必须使用第三方包:对于 Python 使用 playwright-stealth,或者对于 Node.js 使用带有隐身插件的 playwright-extra。
问:隐身插件能绕过 Cloudflare 吗?
隐身插件修补基本浏览器指纹泄露,有助于应对简单检查。但它们无法解决高级 Cloudflare 挑战(如 Turnstile)或修复 IP 声誉问题。
问:Playwright 隐身是否适用于 Firefox 或 WebKit?
不。Python和Node.js隐身包中的规避模块专门设计用于修补Chromium API。它们不支持Firefox或WebKit。
问:使用隐身时我还需要代理吗?
是的。隐身插件仅掩盖浏览器的身份(指纹)。它们不隐藏您的IP地址。您仍然需要住宅代理以避免速率限制和基于IP的阻止。
问:使用Playwright抓取合法吗?
抓取公开可见的数据通常是允许的,尽管各地的法规不同。请查看目标网站的服务条款,并就您的具体用例咨询法律顾问。
问:可以在没有AI代理的情况下运行吗?
可以,Playwright代码作为标准自动化脚本端到端工作。实现浏览器隐身不需要AI代理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



