使用 Python Playwright 采集网页数据时,避免被检测和封禁是关键挑战。现代网站广泛使用反爬虫技术(如浏览器指纹检测、自动化行为识别)来识别并阻止自动化工具。虽然完全“不被检测”无法100%保证,但可以通过一系列策略显著降低被识别为自动化脚本的概率。
以下是使用 Playwright 的最佳实践,帮助你更隐蔽地采集网页数据。
✅ 一、基础配置:隐藏自动化特征
1. 禁用自动化检测标志
Playwright 默认会暴露一些自动化特征(如 navigator.webdriver),需手动关闭。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 使用 Chromium,但伪装成普通 Chrome
browser = p.chromium.launch(
headless=True, # 可设为 False 调试
args=[
'--disable-blink-features=AutomationControlled',
'--disable-infobars',
'--disable-extensions',
'--no-first-run',
'--no-default-browser-check',
'--disable-dev-shm-usage',
'--disable-gpu',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-web-security', # 谨慎使用
]
)
context = browser.new_context(
# 设置真实用户代理
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
# 设置视口大小
viewport={'width': 1920, 'height': 1080},
# 地理位置(可选)
geolocation={'longitude': 116.397026, 'latitude': 39.908063},
permissions=['geolocation'],
# 时区
timezone_id='Asia/Shanghai'
)
# 移除 navigator.webdriver 标志
context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
""")
page = context.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()✅ 二、高级反检测技巧
2. 使用真实浏览器用户数据目录(推荐)
通过加载真实 Chrome 的用户配置文件,模拟真实用户环境。
browser = p.chromium.launch_persistent_context(
user_data_dir="./user_data", # 本地目录,可预存真实浏览数据
headless=False,
user_agent='...',
viewport={'width': 1920, 'height': 1080},
# 其他参数...
)💡 第一次运行时设
headless=False,登录常用账号,保存 Cookie 和缓存。
3. 随机化行为模式
避免固定节奏,模拟人类操作延迟。
import time
import random
def random_delay(min_sec=1, max_sec=3):
time.sleep(random.uniform(min_sec, max_sec))
page.click("text=登录")
random_delay(1, 2)
page.fill("#username", "user@example.com")
random_delay(0.5, 1.5)
page.fill("#password", "password")
random_delay(1, 2)
page.click("button[type=submit]")4. 禁用 Playwright 特有标识
某些网站检测 Playwright 注入的脚本或对象。
context.add_init_script("""
// 隐藏 Playwright 特征
window.chrome = {
runtime: {},
loadTimes: () => {},
csi: () => {}
};
Object.defineProperty(navigator, 'languages', {
get: () => ['zh-CN', 'zh', 'en']
});
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
""")5. 使用代理(Proxy)
避免IP被封,尤其在大规模采集时。
browser = p.chromium.launch(
proxy={
"server": "http://your-proxy-ip:port",
"username": "user",
"password": "pass"
}
)可结合 BrightData、SmartProxy 等动态代理服务轮换IP。
6. 处理验证码(CAPTCHA)
使用第三方打码平台(如 2Captcha、Anti-Captcha)
或人工介入(不适合大规模)
✅ 三、检测与绕过常见反爬机制
| 检测方式 | 绕过方法 |
|---|---|
navigator.webdriver === true | 用 add_init_script 设为 false |
window.__playwright__ 存在 | 不暴露调试端口,避免开发模式 |
| 检测无头模式(Headless) | 使用 headless=False 或新版 Chromium 的 headless=new 模式 |
| 鼠标轨迹过于直线 | 使用 page.mouse.move() 模拟曲线移动 |
| 请求频率过高 | 加入随机延迟,使用代理轮换 |
| 缺少真实字体/插件 | 在 add_init_script 中伪造 navigator.plugins 和 fonts |
✅ 四、增强真实性的技巧
启用摄像头/麦克风权限(某些网站需要):
context.grant_permissions(["microphone", "camera"])
设置真实 Cookie 和 Storage:
context.add_cookies([{ 'name': 'session_id', 'value': 'abc123', 'domain': '.example.com', 'path': '/', 'httpOnly': True, 'secure': True }])模拟触摸事件(移动端):
context = browser.new_context( viewport={'width': 390, 'height': 844}, user_agent='Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)...', is_mobile=True, has_touch=True )
⚠️ 五、注意事项与风险
法律合规:确保采集行为符合《网络安全法》和网站
robots.txt规则。道德使用:不要用于恶意攻击、数据倒卖或侵犯隐私。
动态对抗:反爬虫技术持续升级,需定期更新策略。
性能权衡:越像真人,速度越慢,成本越高。
✅ 六、推荐组合方案
Playwright + 真实用户数据 + 代理IP + 随机行为 + AI识别验证码
适用于中低频、高价值数据采集场景。
总结
虽然无法绝对避免被检测,但通过以下组合可极大提升隐蔽性:
✅ 移除
navigator.webdriver
✅ 使用真实 User-Agent 和视口
✅ 加载真实用户数据目录
✅ 添加随机延迟和行为
✅ 使用代理IP轮换
✅ 伪造浏览器指纹特征(plugins, languages 等)
建议先在 https://bot.sannysoft.com 测试你的 Playwright 浏览器指纹,确保 navigator.webdriver、Chrome对象、插件等不被标记为异常。
如需大规模采集,建议结合 BrightData Crawler 或 Scrapy + Selenium/Playwright 集群,并做好 IP 和账号管理。