前言
在使用 Playwright 进行自动化采集时,很多网站会检测 navigator.webdriver、chrome 对象属性或特定的浏览器指纹。直接运行脚本很容易被识别为机器人并拦截。本文分享一套经过实战验证的封装方案,重点在于隐藏自动化特征,模拟真实用户行为。
该方案已在多个中等反爬场景(如电商、新闻站)测试有效,能绕过大多数基础检测机制。
核心反爬策略
- 移除
navigator.webdriver标志:这是最基础的检测点,必须通过注入脚本清除。 - 注入真实 User-Agent 和 Accept-Language:避免默认 Puppeteer/Playwright 的特征 UA。
- 禁用
chrome对象中的自动化属性:例如移除cdc_开头的内部变量。 - 设置合理的 viewport、设备比例、语言:匹配常见桌面或移动端参数。
- 启用 JavaScript 但模拟人类行为:可选添加随机延迟,避免请求过于规律。
- 使用非 headless 模式或伪装 headless:推荐后者,既节省资源又降低风险。
注意事项
- 不要频繁请求:即使隐藏了特征,高频访问依然会被封禁。建议配合代理池和随机延时。
- 合规性:请确保采集行为符合目标网站的 robots.txt 协议及相关法律法规。
- 动态更新:反爬策略是动态博弈的,代码需定期维护更新。
完整实现
1. 安装依赖
pip install playwright
playwright install
2. 封装代码
下面是一个完整的 Python 类封装,返回原始 HTML 内容,并重点隐藏自动化特征。
from playwright.sync_api import sync_playwright, Page
import random
import time
class AntiDetectCrawler:
def __init__(self):
self.playwright = None
self.browser = None
self.context = None
self.page = None
def start(self):
# 启动 Playwright
.playwright = sync_playwright().start()
.browser = .playwright.chromium.launch(
headless=,
args=[
,
,
]
)
.context = .browser.new_context(
user_agent=,
locale=,
viewport={: , : },
ignore_https_errors=
)
.context.add_init_script()
.page = .context.new_page()
():
:
delay = random.uniform(, )
time.sleep(delay)
.page.goto(url, wait_until=, timeout=)
time.sleep(random.uniform(, ))
.page.content()
Exception e:
()
():
.browser:
.browser.close()
.playwright:
.playwright.stop()
__name__ == :
crawler = AntiDetectCrawler()
:
crawler.start()
html = crawler.crawl()
html:
(, (html))
:
()
:
crawler.close()

