跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python大前端

基于 Playwright 封装反爬爬虫:隐藏自动化特征实战

使用 Playwright 封装 Python 爬虫时,如何有效隐藏自动化特征是关键。方案涵盖移除 navigator.webdriver 标志、注入真实 User-Agent、禁用 chrome 对象自动化属性及模拟人类行为延迟,能绕过大多数基于指纹的检测。文中提供完整配置代码与使用细节,帮助开发者构建更稳定的数据采集流程。

moshang发布于 2026/4/8更新于 2026/10/25113 浏览

使用 Playwright 封装具备反爬对抗能力的网页爬虫,核心在于隐藏浏览器自动化特征。该方案已在多个中等反爬网站(如电商、新闻站)验证有效,能绕过大多数基于 navigator.webdriver、chrome 对象、permissions 等的检测。

核心反爬策略

要实现真正的'隐身',我们需要在启动浏览器时注入一系列伪装参数:

  1. 移除 navigator.webdriver 标志:这是最基础的指纹,必须设为 undefined。
  2. 注入真实 User-Agent 和 Accept-Language:避免默认头信息暴露机器身份。
  3. 禁用 chrome 对象中的自动化属性:特别是 cdc_ 开头的字段,这些是 Puppeteer/Playwright 的典型痕迹。
  4. 设置合理的 viewport、设备比例、语言:模拟真实物理设备的屏幕参数。
  5. 启用 JavaScript 但模拟人类行为:必要时加入随机延迟,避免请求过于规律。
  6. 使用非 headless 模式或伪装 headless:推荐后者,既节省资源又降低被识别风险。

注意事项

即使隐藏了特征,高频访问依然会被封禁。建议添加随机延时,不要试图用脚本暴力破解所有防护。此外,IP 代理池的配合往往比单纯的技术伪装更有效。

完整代码实现

下面是一个可直接复用的 Python 封装示例。我们重点处理上下文欺骗,确保返回原始 HTML 内容。

from playwright.sync_api import sync_playwright
import random
import time

def fetch_html(url, headers=None):
    """
    使用 Playwright 获取网页内容,并隐藏自动化特征
    :param url: 目标网址
    :param headers: 自定义请求头
    :return: 页面 HTML 字符串
    """
    with sync_playwright() as p:
        # 启动浏览器,禁用部分自动化检测
        browser = p.chromium.launch(
            headless=True,
            args=[
                '--disable-blink-features=AutomationControlled',
                '--no-sandbox',
                '--disable-dev-shm-usage'
            ]
        )
        
        context = browser.new_context(
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            viewport={'width': 1920, 'height': 1080},
            locale='zh-CN',
            permissions=['geolocation']
        )
        
        page = context.new_page()
        
        # 注入脚本以修改 navigator.webdriver 等属性
        page.add_init_script('''
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            });
            // 模拟真实的 chrome 对象结构
            const originalGetter = Object.getOwnPropertyDescriptor(window, 'chrome');
            Object.defineProperty(window, 'chrome', {
                ...originalGetter,
                value: { runtime: {}, cdc_: undefined }
            });
        ''')
        
        try:
            response = page.goto(url, wait_until='networkidle', timeout=30000)
            if response and response.ok:
                html = page.content()
                return html
            else:
                print(f'Failed to load: {url}')
                return None
        except Exception as e:
            print(f'Error occurred: {e}')
            return None
        finally:
            browser.close()

# 使用示例
if __name__ == '__main__':
    target_url = 'https://example.com'
    content = fetch_html(target_url)
    if content:
        print('抓取成功,长度:', len(content))
        # 这里可以添加随机延时,模拟人类阅读
        time.sleep(random.uniform(1, 3))

调试与优化

实际运行中可能会遇到验证码或更复杂的 JS 挑战。如果遇到这种情况,可以尝试调整 args 参数,或者引入更高级的指纹伪造库。另外,记得定期更新 User-Agent 列表,因为浏览器的版本迭代很快,过时的 UA 反而容易暴露。

目录

  1. 核心反爬策略
  2. 注意事项
  3. 完整代码实现
  4. 使用示例
  5. 调试与优化

更多推荐文章

查看全部
  • Stable Diffusion 制作瞬息全宇宙风格视频动画
  • Python 小红书数据采集工具实现指南
  • Transformer 算法核心架构与原理详解
  • Cline 集成 DeepSeek:开源 AI 编程助手助力终端与 Web 开发
  • Spring Boot 日志全方位指南:从入门到高级配置
  • HashCalculator 文件哈希批量计算工具使用指南
  • Llama-3.2-3B 实战:利用 Ollama 快速生成营销文案
  • CATE 条件平均处理效应估计:五大方法原理详解与模拟数据实战
  • 动态规划专题:回文串问题与区间 DP
  • 一次搭好,到处复用:政务智能体工作流导出导入实录
  • Windows 11 本地部署 llama.cpp 运行 Qwen3.5 量化模型实测
  • C++ 核心特性详解:命名空间、重载与引用实战
  • IO 多路复用、网络协议与爬虫抓包
  • uView Pro:基于 Vue3 的 uni-app 跨端 UI 组件库实践
  • Python warnings 库底层机制与企业级 API 演进实战
  • 如何在机器人平台上微调与部署 OpenVLA 模型
  • GitHub Copilot 提示词工程指南:从基础到精通
  • Spring Boot 数据可视化与图表集成实战
  • 企业微信群机器人 Webhook 配置与消息发送流程
  • AI Agent 辅助工具 Superpowers 使用介绍及原理分析

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online