如何使用Python playwright采集网页数据不被检测到

阿里云服务器

使用 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 === trueadd_init_script 设为 false
window.__playwright__ 存在不暴露调试端口,避免开发模式
检测无头模式(Headless)使用 headless=False 或新版 Chromium 的 headless=new 模式
鼠标轨迹过于直线使用 page.mouse.move() 模拟曲线移动
请求频率过高加入随机延迟,使用代理轮换
缺少真实字体/插件add_init_script 中伪造 navigator.pluginsfonts

✅ 四、增强真实性的技巧

  1. 启用摄像头/麦克风权限(某些网站需要):

    context.grant_permissions(["microphone", "camera"])
  2. 设置真实 Cookie 和 Storage

    context.add_cookies([{
        'name': 'session_id',
        'value': 'abc123',
        'domain': '.example.com',
        'path': '/',
        'httpOnly': True,
        'secure': True
    }])
  3. 模拟触摸事件(移动端)

    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.webdriverChrome对象插件等不被标记为异常。

如需大规模采集,建议结合 BrightData CrawlerScrapy + Selenium/Playwright 集群,并做好 IP 和账号管理。