Playwright不能绕过验证码,仅能通过模拟真实用户行为降低触发概率;需禁用自动化特征、覆盖navigator.webdriver、伪造指纹,并复用browser_context维持会话状态。

Playwright 能绕过验证码吗
不能。Playwright 和 Selenium 一样,只是浏览器自动化工具,不自带 OCR 或打码能力。所谓“绕过”,其实是换了一种更可控、更少被识别的方式与页面交互,降低触发验证码的概率——比如避免快速点击、模拟真实鼠标轨迹、正确设置 User-Agent 和 Accept-Language 等基础指纹。
真正需要识别验证码时,仍得接第三方服务(如 ddddocr、chaojiying)或人工干预。Playwright 的价值在于:它比 Selenium 更难被前端反爬逻辑识别,尤其在检测 webdriver 属性、navigator.webdriver、chrome.runtime 等特征时表现更好。
用 Playwright 启动浏览器时必须加哪些参数
默认启动的 Playwright 浏览器仍带明显自动化痕迹。关键要覆盖三类检测点:
- 禁用自动化特征:
chromium.launch(headless=True, args=["--disable-blink-features=AutomationControlled"]) - 覆盖 navigator.webdriver:
page.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") - 伪造常用指纹:
user_agent、locale、viewport必须设,且需与真实用户一致(例如user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
漏掉任意一项,都可能在登录页或请求接口前就被弹出验证码——不是因为代码写错了,而是前端 JS 已静默执行了检测逻辑。
立即学习“Python免费学习笔记(深入)”;
为什么 Playwright 的 page.goto() 还是被跳转到验证码页
常见原因不是请求发错了,而是会话上下文没延续。Selenium 用户习惯每开一个 driver 就重新登录,但 Playwright 更推荐复用 browser_context,否则 cookies、localStorage、TLS 会话等状态全部丢失,导致后端判定为新设备/新会话,直接拦截。
实操要点:
- 不要每次请求都
browser.new_page(),改用context.new_page() - 登录成功后,把
context存起来,后续所有页面都在这个上下文中打开 - 检查是否误用了
page.goto(url, wait_until="networkidle")——某些验证码页会懒加载验证模块,用networkidle反而错过检测时机,换成domcontentloaded更稳妥
验证码弹窗出现后,Playwright 怎么定位和截图
验证码通常以 div 层级浮层存在,不是新窗口,也不一定有固定 id。别依赖 page.query_selector("#captcha-img") 这类硬编码选择器。
更可靠的做法:
- 先用
page.query_selector("img[src*='captcha'], img[alt*='verify']")做模糊匹配 - 截图时不用全屏:
element.screenshot(path="captcha.png"),只截验证码图区域 - 若元素动态加载,加等待:
page.wait_for_selector("img[src*='captcha']", timeout=5000),超时就当没触发
注意:有些站点的验证码图是 canvas 渲染,Playwright 截不到原始图片。这时得用 page.evaluate() 提取 base64 数据,再解码保存——这点很容易忽略,一试就报空截图错误。


















