1. 项目概述:当自动化遇上“反自动化”

做自动化测试或者数据采集的朋友,最近几年应该都感受到了一个明显的趋势:网站对自动化工具的检测和封禁越来越严格了。以前用Selenium写个脚本,模拟点击、填表单,基本畅通无阻。但现在,很多稍微有点规模的网站,你刚启动浏览器,脚本还没开始操作,页面可能就直接提示“检测到异常访问”或者干脆给你一个验证码。这背后的技术,就是所谓的“浏览器自动化检测”或“反机器人(Anti-bot)”技术。

我最近在做一个需要高频、稳定访问特定电商网站数据采集的项目,就深刻体会到了这种对抗的激烈。传统的Selenium配合一些简单的User-Agent伪装、窗口大小设置,已经很难奏效。经过一番调研和实战,我发现了一套组合拳效果非常显著: 利用10xcursor规则集来精细化模拟人类鼠标轨迹,再结合Playwright框架的Stealth插件来隐藏自动化指纹 。这个组合,可以说是我目前找到的绕过主流浏览器自动化检测最有效的方案之一。

简单来说,这个项目的核心就是解决“如何让机器人的行为看起来更像真人”的问题。它不仅仅是为了“绕过检测”,更是为了构建一个稳定、可靠、长期可用的自动化环境。无论是做UI自动化测试(尤其是需要绕过反爬的测试场景)、还是进行合规的数据聚合与分析,这套方案都提供了新的思路和工具。接下来,我就把这套方案的思路、具体实现步骤、踩过的坑以及一些独家心得,毫无保留地分享出来。

2. 核心思路拆解:为什么是10xcursor + Playwright Stealth?

在深入代码之前,我们必须先搞清楚,现在的网站到底是怎么发现我们是机器人的,以及我们选择的这两个工具是如何针对性地解决这些问题的。

2.1 浏览器自动化检测的常见维度

网站检测自动化脚本,通常不会只依赖单一特征,而是构建一个多维度的“指纹”系统进行综合判断。主要维度包括:

  1. WebDriver属性 :这是最经典的检测点。通过 navigator.webdriver window.chrome 对象下的某些属性(如 runtime ),可以判断浏览器是否由WebDriver控制。Selenium在这方面暴露得比较明显。
  2. 浏览器指纹 :包括Canvas、WebGL、AudioContext、字体列表等。自动化工具驱动的浏览器,其硬件加速、渲染细节可能与真实浏览器有细微差别,从而生成独特的指纹。
  3. 行为模式 :这是目前越来越重要的检测维度。
    • 鼠标轨迹 :真人鼠标移动是带有随机加速度曲线和微小抖动的贝塞尔曲线,而程序控制的鼠标移动往往是瞬间、直线或过于规律的路径。
    • 点击精度 :真人点击很难每次都精准命中元素中心点,会有偏移;程序点击则常常是完美的 element.click()
    • 输入节奏 :真人打字有速度变化、会有退格修改;程序输入则是匀速且完美的。
    • 页面停留与滚动 :真人的浏览有随机停留、非匀速滚动;脚本则可能严格按照代码逻辑执行。
  4. HTTP请求头与参数 :一些自动化库会添加特定的请求头(如 Sec-Ch-Ua 等),或者缺少某些真人浏览器会携带的头信息。

2.2 工具选型背后的逻辑

面对这些检测,我们的策略是“多管齐下,全面伪装”。

  • 为什么选择Playwright而不是Selenium? Playwright是微软开源的新一代浏览器自动化库,它天生在设计上就更“隐蔽”。它提供了对CDP(Chrome DevTools Protocol)更深度的控制能力,可以更彻底地修改浏览器环境。相比之下,Selenium的WebDriver协议历史包袱较重,暴露的指纹更多。Playwright的启动速度、执行稳定性以及对现代Web技术的支持(如Shadow DOM、网络拦截)也更具优势。从我们搜索的热词“playwright和selenium优缺点”也能看出,社区正在向Playwright迁移。

  • 为什么需要Playwright Stealth? Playwright本身已经做了一些反检测处理,但还不够彻底。 playwright-stealth (或类似的 puppeteer-extra-plugin-stealth 的Playwright移植版)是一个专门用于对抗检测的插件。它的核心作用是:

    • 清除WebDriver痕迹 :重写或删除 navigator.webdriver 等属性。
    • 伪装用户代理(UA)和语言 :提供更真实的UA字符串和 navigator.languages
    • 修复插件和mimeType列表 :确保 navigator.plugins navigator.mimeTypes 看起来正常。
    • 处理Chrome运行时属性 :这是Chrome环境下非常关键的检测点,Stealth插件会妥善处理。 你可以把它理解为给Playwright浏览器穿上一件“隐身衣”,把自动化工具最明显的几个特征给掩盖掉。
  • 为什么是10xcursor? 解决了“你是谁”(指纹)的问题,还要解决“你怎么动”(行为)的问题。 10xcursor (这里是一个代称,指代一类用于生成人类鼠标移动轨迹的规则集或算法)的核心价值在于模拟人类鼠标移动的物理特性。它通常基于贝塞尔曲线、随机扰动、速度变化等数学模型,生成带有加速度、减速和微小抖动的移动路径。仅仅使用 page.mouse.move(x, y) 是瞬间完成的,而 10xcursor 会将其分解为数十甚至上百个微小的、符合人类运动学的中间点,然后让鼠标依次经过这些点。这极大地增加了行为模式的真实性。

总结一下核心思路 Playwright Stealth 负责静态环境的伪装,让浏览器“看起来”像真人用的; 10xcursor 规则集负责动态行为的模拟,让脚本的“操作手法”也像真人。两者结合,才能构建一个相对坚固的“反反爬”堡垒。

3. 环境搭建与核心工具详解

工欲善其事,必先利其器。我们先来把环境和需要用到的核心工具准备好。

3.1 Playwright及其Stealth插件的安装

这里以Python环境为例。首先,安装Playwright。建议使用虚拟环境(如venv或conda)。

# 安装playwright库
pip install playwright

# 安装Playwright所需的浏览器(Chromium, Firefox, WebKit)。这一步可能会比较慢,可以尝试使用镜像源。
playwright install chromium

playwright install chromium 这个命令会下载Chromium浏览器,这也是我们最常用的。从热词“playwright安装”、“playwright install chromium 慢”可以看出,这一步有时会因为网络问题卡住。如果遇到下载慢,可以尝试设置环境变量使用国内镜像,或者耐心等待。

接下来,安装Stealth插件。Playwright社区有几个Stealth相关的包,一个比较流行的是 playwright-stealth 。但请注意,它可能更新不及时。另一个思路是使用 puppeteer-extra 及其 stealth 插件在Node.js环境,或者寻找其Python移植方案。为了更稳定,我这里介绍一个手动集成核心Stealth脚本的方法,这也是很多高阶用户的做法。

我们可以从知名的 puppeteer-extra-plugin-stealth 项目中提取其核心的“注入脚本”。实际上,很多检测规避的逻辑是通过在页面中执行JavaScript来覆盖原生属性实现的。

  1. 创建一个本地JavaScript文件,比如 stealth.js ,内容可以从可靠的Stealth插件源码中提取关键部分。一个简化版的思路是覆盖关键属性:
// stealth.js - 简化示例,实际应用需要更完整的实现
(() => {
    // 覆盖webdriver属性
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined,
    });
    // 覆盖chrome运行时
    if (window.chrome) {
        window.chrome.runtime = {};
    }
    // 覆盖permissions.query
    const originalQuery = window.navigator.permissions.query;
    window.navigator.permissions.query = (parameters) => (
        parameters.name === 'notifications' ?
            Promise.resolve({ state: Notification.permission }) :
            originalQuery(parameters)
    );
    // 更多覆盖逻辑...
})();

更完整的脚本可以从开源社区获取。然后,在Playwright启动浏览器后,通过 page.add_init_script 方法在每个页面加载前注入这个脚本。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False) # 初期调试建议用非无头模式
    context = browser.new_context()
    page = context.new_page()

    # 注入stealth脚本
    with open('stealth.js', 'r') as f:
        stealth_js = f.read()
    page.add_init_script(stealth_js)

    page.goto('https://bot.sannysoft.com/') # 这是一个测试自动化检测的网站
    page.screenshot(path='stealth_test.png')
    # 观察页面结果,是否还有很多检测项被标红
    input("按回车键继续...")
    browser.close()

注意 puppeteer-extra-plugin-stealth 的规避逻辑非常复杂且持续更新,手动维护注入脚本成本较高。社区也有像 playwright_stealth 这样的Python包,但需要确认其兼容性和更新状态。对于生产环境,评估和选择稳定的Stealth方案是第一步,也是最重要的一步。

3.2 理解与集成10xcursor规则集

“10xcursor”并不是一个特定的官方库名,它更可能指的是一种鼠标移动算法或规则集。其核心思想是 人类行为模拟(Human Behavior Emulation) 。我们需要一个能生成拟人化鼠标移动路径的函数。

一个经典的实现是使用 贝塞尔曲线(Bezier Curve) 随机扰动 。思路如下:

  1. 确定起点(当前鼠标位置)和终点(目标元素中心或随机偏移点)。
  2. 生成一个或多个控制点,这些控制点使得路径呈现曲线。
  3. 将曲线离散化为数十个点。
  4. 为每个点之间的移动计算一个符合人类反应时间(快-慢-快)的速度曲线。
  5. 在移动过程中加入极微小的随机偏移(抖动)。

下面是一个Python的示例实现,它模拟了这种移动:

import random
import math
import asyncio
from playwright.async_api import async_playwright # 使用异步API示例

def human_like_mouse_move(start_x, start_y, end_x, end_y, steps=30, deviation=2):
    """
    生成从起点到终点的拟人化鼠标移动路径点。
    :param steps: 路径点数,越多越平滑但越慢。
    :param deviation: 随机抖动最大像素值。
    :return: 包含(x, y)坐标的列表。
    """
    points = []
    # 生成一个简单的控制点,使路径弯曲
    ctrl_x = start_x + (end_x - start_x) * random.uniform(0.3, 0.7)
    ctrl_y = start_y + (end_y - start_y) * random.uniform(0.3, 0.7) + random.randint(-50, 50)

    for i in range(steps + 1):
        t = i / steps
        # 二次贝塞尔曲线公式
        x = (1-t)**2 * start_x + 2*(1-t)*t * ctrl_x + t**2 * end_x
        y = (1-t)**2 * start_y + 2*(1-t)*t * ctrl_y + t**2 * end_y

        # 添加随机抖动
        x += random.uniform(-deviation, deviation)
        y += random.uniform(-deviation, deviation)

        points.append((int(x), int(y)))
    return points

async def human_click(page, selector):
    """模拟人类点击元素"""
    # 1. 获取元素位置和大小
    box = await page.locator(selector).bounding_box()
    if not box:
        raise Exception(f"Element {selector} not found or not visible.")

    # 2. 在元素内部随机选择一个点击点(非精确中心)
    target_x = box['x'] + box['width'] * random.uniform(0.2, 0.8)
    target_y = box['y'] + box['height'] * random.uniform(0.2, 0.8)

    # 3. 获取当前鼠标位置(假设从某个初始位置开始,或从屏幕角落开始)
    current_x, current_y = 10, 10 # 简单起见,假设从(10,10)开始移动

    # 4. 生成拟人化移动路径
    move_points = human_like_mouse_move(current_x, current_y, target_x, target_y)

    # 5. 按路径移动鼠标
    for point in move_points:
        await page.mouse.move(point[0], point[1])
        # 添加随机的小延迟,模拟人类反应时间
        await asyncio.sleep(random.uniform(0.001, 0.005)) # 1-5毫秒

    # 6. 模拟点击前的短暂停顿
    await asyncio.sleep(random.uniform(0.05, 0.2))

    # 7. 执行点击
    await page.mouse.down()
    await asyncio.sleep(random.uniform(0.02, 0.08)) # 按下持续时间
    await page.mouse.up()

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        context = await browser.new_context()
        page = await context.new_page()
        # ... 注入stealth脚本 ...
        await page.goto('https://example.com')
        await human_click(page, 'button#submit')
        await browser.close()

这个 human_like_mouse_move 函数就是一个简易的“10xcursor规则集”实现。你可以调整 steps (步数)和 deviation (抖动幅度)来改变移动的平滑度和随机性。更高级的规则集还会模拟重力、惯性等,但上述核心原理已经能显著提升行为真实性。

4. 完整实战流程:构建一个抗检测的自动化脚本

现在,我们把Stealth伪装和拟人化操作结合起来,写一个完整的、用于测试和实战的脚本。这个脚本将访问一个专门检测自动化的测试页,然后执行一系列拟人化操作。

4.1 项目结构与初始化

创建一个新的项目目录,结构如下:

anti_detect_bot/
├── stealth.js          # Stealth注入脚本
├── mouse_tools.py      # 包含human_like_mouse_move, human_click等函数
├── config.py           # 配置文件(如User-Agent列表、等待时间范围等)
└── main.py             # 主程序

首先,完善我们的 stealth.js 。我们可以从 puppeteer-extra-plugin-stealth 的源码中复制其 evasions 目录下的核心文件内容(如 navigator.webdriver.js , chrome.runtime.js 等),合并成一个文件。这里由于篇幅,只展示如何组织,具体代码请从可靠开源项目获取。

mouse_tools.py 就放置我们上面写的 human_like_mouse_move human_click 函数,并可以继续丰富,比如添加 human_type (模拟人类输入)、 human_scroll (模拟人类滚动)等。

config.py 可以配置一些参数:

# config.py
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 ...',
    # 更多UA
]
MIN_WAIT = 0.5  # 最小操作间隔(秒)
MAX_WAIT = 2.0  # 最大操作间隔(秒)
MOUSE_STEPS = 40 # 鼠标移动步数

4.2 主程序实现与关键步骤解析

下面是 main.py 的一个完整示例,它访问测试网站,执行一系列操作,并保存证据。

import asyncio
import random
from playwright.async_api import async_playwright
from mouse_tools import human_click, human_type, human_scroll
from config import USER_AGENTS, MIN_WAIT, MAX_WAIT
import time

async def run_anti_detect_bot():
    async with async_playwright() as p:
        # 1. 启动浏览器 - 关键参数配置
        browser = await p.chromium.launch(
            headless=False,  # 调试阶段务必用有头模式,观察行为
            args=[
                '--disable-blink-features=AutomationControlled', # 禁用自动化控制特征
                '--start-maximized', # 启动最大化,更符合真人习惯
                '--disable-infobars', # 禁用Chrome提示“正受到自动测试软件控制”
                '--no-sandbox',      # 仅在可信环境使用,如Docker
                '--disable-setuid-sandbox',
                '--disable-dev-shm-usage',
            ]
        )

        # 2. 创建上下文(Context) - 指纹伪装的核心层
        context = await browser.new_context(
            viewport={'width': 1920, 'height': 1080},
            user_agent=random.choice(USER_AGENTS), # 随机UA
            locale='zh-CN', # 设置语言
            timezone_id='Asia/Shanghai', # 设置时区
            permissions=['geolocation'], # 可以授予一些权限,更像真人
            # 可以设置代理 here: proxy={'server': 'http://xxx:xxx'}
        )
        # 设置更真实的WebGL和Canvas指纹(高级,可通过CDP执行)
        # await context.add_init_script(...)

        page = await context.new_page()

        # 3. 注入Stealth脚本
        with open('stealth.js', 'r', encoding='utf-8') as f:
            stealth_script = f.read()
        await page.add_init_script(stealth_script)

        # 4. 导航到目标页面 - 以检测网站为例
        test_url = "https://bot.sannysoft.com/"
        print(f"正在访问检测页面: {test_url}")
        await page.goto(test_url, wait_until='networkidle') # 等待网络空闲
        await asyncio.sleep(random.uniform(2, 4)) # 随机等待,模拟页面加载观察时间

        # 5. 执行拟人化操作序列
        print("开始执行拟人化操作...")
        # 5.1 模拟滚动阅读
        await human_scroll(page, duration=random.uniform(1, 3), direction='down')
        await asyncio.sleep(random.uniform(MIN_WAIT, MAX_WAIT))
        await human_scroll(page, duration=random.uniform(0.5, 1.5), direction='up')

        # 5.2 模拟鼠标移动并点击某个链接或按钮(假设页面上有‘test’链接)
        # 先尝试寻找一个可点击的元素
        all_links = await page.locator('a').all()
        if all_links:
            link_to_click = random.choice(all_links[:5]) # 从前几个链接中随机选一个
            await human_click(page, link_to_click)
            print(f"随机点击了链接。")
            await asyncio.sleep(random.uniform(2, 5)) # 等待新页面加载
            # 可能点击后打开了新标签页,这里简单处理:回退
            await page.go_back()
            await asyncio.sleep(random.uniform(1, 2))

        # 5.3 模拟键盘输入(如果有输入框)
        input_fields = await page.locator('input[type="text"], input[type="search"], textarea').all()
        if input_fields:
            field = input_fields[0]
            await field.click() # 简单点击聚焦
            await asyncio.sleep(random.uniform(0.3, 0.7))
            test_text = "hello world"
            await human_type(page, test_text, field) # human_type需要实现,能模拟打字节奏
            print(f"在输入框中键入了: {test_text}")
            await asyncio.sleep(random.uniform(1, 2))
            # 模拟删除部分内容
            for _ in range(3):
                await page.keyboard.press('Backspace')
                await asyncio.sleep(random.uniform(0.1, 0.3))

        # 6. 评估检测结果并截图
        # 在 bot.sannysoft.com 上,检测结果会直接显示在页面上。
        # 我们可以截图保存,人工检查哪些项目通过了(绿色),哪些失败了(红色)。
        timestamp = int(time.time())
        screenshot_path = f'./results/detection_test_{timestamp}.png'
        await page.screenshot(path=screenshot_path, full_page=True)
        print(f"检测结果已截图保存至: {screenshot_path}")
        print("请人工查看截图,绿色表示通过,红色表示被检测出。重点关注‘WebDriver’,‘Chrome’,‘User-Agent’等项。")

        # 7. 清理与关闭(重要!)
        await asyncio.sleep(2)
        await context.close()
        await browser.close()

if __name__ == '__main__':
    asyncio.run(run_anti_detect_bot())

这个脚本完成了几件关键事情:

  1. 配置浏览器启动参数 :通过 args 传递Chromium flags,禁用了一些自动化提示。
  2. 创建隔离的上下文 :每个 browser.new_context() 就像一个独立的浏览器会话,可以拥有独立的Cookie、缓存、指纹。这是Playwright比Selenium灵活的地方之一。
  3. 注入Stealth脚本 :在页面加载任何内容之前执行,从根源上修改环境。
  4. 模拟人类浏览行为 :不是直接 page.click() ,而是通过我们自定义的 human_click human_scroll human_type 函数,加入了随机等待、曲线移动、不精确点击等行为。
  5. 结果验证 :通过访问专门的检测网站并截图,直观地评估我们的伪装效果。

5. 高级技巧与深度优化

基础的组合拳打好了,但要想在更高强度的对抗中存活,还需要一些“骚操作”和深度优化。

5.1 指纹的深度定制与动态化

静态的Stealth脚本可能被针对。我们需要让指纹“动”起来。

  • Canvas指纹噪声 :网站通过Canvas绘制图像并获取哈希值来生成指纹。我们可以通过注入JS,在每次访问时给Canvas的 getImageData toDataURL 结果添加一个微小的、随机的噪声,使得每次生成的指纹都略有不同,但又不至于离谱。

    // 示例:给Canvas添加噪声
    const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
    CanvasRenderingContext2D.prototype.getImageData = function(...args) {
        const imageData = originalGetImageData.apply(this, args);
        const data = imageData.data;
        // 对极少数像素进行微调
        for(let i = 0; i < data.length; i += 100) { // 每100个像素改一个
            data[i] = data[i] + Math.floor(Math.random() * 4) - 2; // RGB通道微调±2
        }
        return imageData;
    };
    

    警告 :这种修改需要极其谨慎,过大的噪声会导致图形明显失真,反而成为异常特征。建议只在 bot.sannysoft.com 这样的测试站反复调整参数,观察对检测结果的影响。

  • 动态User-Agent与屏幕分辨率 :不要固定使用一个UA和分辨率。可以从一个精心维护的列表中随机选取,并确保UA、浏览器版本、屏幕分辨率、操作系统之间逻辑自洽(例如,一个Windows 10的UA不应该配一个Mac常见的分辨率)。

  • 使用真实的浏览器配置文件 :Playwright可以加载一个现有的Chrome用户数据目录( user-data-dir )。你可以先手动用这个Chrome浏览一些网站,生成丰富的历史记录、Cookie、缓存,然后让Playwright使用这个目录启动。这样浏览器的指纹会更接近一个长期使用的真实用户。

    browser = await p.chromium.launch_persistent_context(
        user_data_dir='/path/to/your/chrome/profile',
        headless=False,
        args=[...]
    )
    

5.2 网络行为模拟与请求管理

除了浏览器环境,网络请求模式也是检测重点。

  • 请求头完善 :确保请求头完整,特别是 Accept Accept-Language Sec-* 系列头部。Playwright Context可以设置全局的 extra_http_headers
  • 请求随机化 :不要以固定的时间间隔发起请求。在关键操作之间加入符合人类阅读习惯的随机等待时间(如对数正态分布)。
  • 处理资源加载 :可以拦截并选择性屏蔽一些非必要的资源(如图片、字体、CSS),以加快速度,但这可能改变页面指纹。更隐蔽的做法是允许加载所有资源,但通过CDP模拟慢速网络( page.emulate_media() context.set_geolocation 不直接支持,需用 BrowserContext.route 拦截并延迟响应)。
  • 管理Cookie和Session :利用Playwright Context的隔离性,为不同的任务使用不同的Context,避免Cookie串扰。定期清理或更换Context,模拟“新会话”。

5.3 应对验证码与智能挑战

即使伪装得再好,遇到验证码(如reCAPTCHA, hCaptcha)也是不可避免的。这不是本文重点,但需要知道应对策略:

  1. 规避 :通过行为模拟、使用高质量代理IP池、控制访问频率,尽量减少触发验证码的几率。
  2. 第三方服务 :集成像2Captcha、Anti-Captcha这样的验证码解决服务。当检测到验证码出现时,截图发送给服务端,获取答案后回填。
  3. 机器学习模型 :对于简单的图像验证码或滑块验证码,可以尝试使用开源的深度学习模型(如PaddleOCR)进行识别。但这需要一定的技术投入,且对抗升级很快。

6. 常见问题、排查与实战心得

在实际操作中,你肯定会遇到各种各样的问题。这里我把我踩过的坑和解决方案整理出来。

6.1 问题排查清单

当你发现脚本被检测到时,可以按照以下清单逐项检查:

问题现象 可能原因 排查步骤与解决方案
访问 bot.sannysoft.com WebDriver 项为红色 Stealth脚本未生效或注入失败。 1. 检查 stealth.js 路径是否正确,内容是否完整。
2. 检查 page.add_init_script 是否在 page.goto 之前调用。
3. 在页面中手动执行 console.log(navigator.webdriver) ,查看输出是否为 undefined
Chrome Headless Chrome 项为红色 浏览器启动参数或CDP覆盖不完整。 1. 确保启动参数包含 --disable-blink-features=AutomationControlled
2. 检查Stealth脚本是否包含了覆盖 window.chrome chrome.runtime 的逻辑。
3. 尝试使用 puppeteer-extra-plugin-stealth 的完整evasion脚本。
User-Agent Languages 项为红色 Context的UA或Locale设置不正确。 1. 检查 context.new_context() 时传入的 user_agent locale 是否有效且自洽。
2. 在页面中检查 navigator.userAgent navigator.language
鼠标移动被识别为“自动化” 鼠标移动路径过于规律或速度恒定。 1. 使用 human_like_mouse_move 函数,并增加 steps (如60)和 deviation (如3)。
2. 在移动中加入更多的随机暂停( await asyncio.sleep(tiny_delay) )。
3. 考虑引入更复杂的物理运动模型。
在目标网站直接被封IP或出验证码 1. 指纹仍有漏洞。
2. IP地址被标记。
3. 访问行为模式异常(频率过高、无停留)。
1. 再次用 bot.sannysoft.com 全面检测,确保所有项为绿。
2. 使用住宅代理IP 。数据中心IP被标记的概率极高。这是成本最高但往往最有效的一环。
3. 大幅降低访问频率,在每个操作步骤间加入长随机延迟,模拟真人阅读思考时间。
Playwright脚本运行速度慢 1. 鼠标模拟步骤太多。
2. 等待策略不佳。
3. 浏览器启动慢。
1. 在稳定性和速度间权衡,适当减少鼠标移动 steps
2. 使用 wait_for_selector wait_for_function 等精准等待,减少固定的 sleep
3. 考虑在无头模式下运行,或复用浏览器实例(注意指纹隔离)。

6.2 实战心得与经验之谈

  1. 测试,测试,再测试 :不要直接在你珍贵的目标网站上测试。先用 bot.sannysoft.com antoinevastel.com/bots pixelscan.net 等免费检测网站验证你的基础伪装水平。全部绿色通过,只是拿到了“入场券”。
  2. 代理IP是生命线 :技术伪装做得再好,一个被无数机器人用过的数据中心IP也能让你瞬间暴露。预算允许的情况下,投资高质量的 住宅代理 移动代理 。它们来自真实的ISP,行为指纹更干净。使用代理时,确保Playwright Context正确配置了代理设置。
  3. 行为模式大于静态指纹 :现在的检测系统越来越智能,它们会分析你的 行为序列 。即使你的指纹完美,但如果你总是在凌晨3点以每秒一次的频率访问同一个API,那也很可疑。引入 随机性 人性化延迟 至关重要。模拟“浏览-阅读-点击-离开”的自然流程,而不是“加载-抓取-关闭”的机器流程。
  4. 保持更新 :反检测是一场持续的“军备竞赛”。今天有效的Stealth脚本,明天可能就被识别。关注 puppeteer-extra-plugin-stealth 等项目的更新,了解最新的检测手段和规避方法。
  5. 合法合规是前提 :所有的技术都应在法律和网站服务条款允许的范围内使用。用于自动化测试、监控自家服务、聚合公开数据是合理的,但用于恶意爬取、刷量、攻击则是不可取的。技术本身无罪,但使用技术的人需要负责。

最后,我想说的是,完全、永久地绕过所有检测是不可能的。我们的目标是 提高自动化脚本的生存成本和检测难度 ,使其在合理的频率和用途下,能够稳定运行足够长的时间来完成所需任务。这套 10xcursor规则集 + Playwright Stealth 的组合,是我目前找到的在易用性、效果和可维护性之间最好的平衡点之一。希望这份详细的拆解和实战指南,能帮你少走弯路,更高效地解决浏览器自动化检测这个棘手的问题。在实际项目中,你可能还需要根据目标网站的具体情况,调整参数、增加新的伪装维度,这是一个需要耐心和不断调试的过程。

更多推荐