🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

使用 Playwright Stealth 避免机器人检测:2026 年的 9 个解决方案

Michael Lee
Michael Lee

Expert Network Defense Engineer

30-Jun-2026

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实例时,它带有特定的标志——如设置为truenavigator.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种解决方案

自动化中最常见的指标之一是navigator.webdriver属性,在自动化浏览器环境中,该属性被设置为trueW3C WebDriver标准特别定义了该标志,以便服务器能够识别自动化流量。网站可以轻松检查该标志以识别机器人。禁用它是一种基本的隐匿技术。

代码操作步骤:

使用page.add_init_script()注入JavaScript,修改navigator.webdriver属性,使其在任何站点脚本运行之前:

python Copy
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 Copy
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 Copy
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.mousepage.keyboard方法引入延迟和真实的路径:

python Copy
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 Copy
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视口是一个常见的红旗。模拟常见的设备配置有助于融入真实用户流量。

代码操作步骤:

在创建新上下文时设置viewportuser_agent

python Copy
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 Copy
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-stealthplaywright-extra

不要手动编写 JavaScript 注入,要使用专门的隐身包。Python 生态系统使用 playwright-stealth,而 Node.js 使用 playwright-extra 结合 puppeteer-extra-plugin-stealth。这些库自动应用一套规避策略来修补 浏览器指纹

代码操作步骤(Python):

安装包(pip install playwright-stealth)并使用 v2.x 上下文管理器 API:

python Copy
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 Copy
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 驱动数据管道了吗?

加入构建强大数据提取系统的开发者社区。


常见问题

问: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,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录