Skip to content

Repository files navigation

AutoWeb

Python LangGraph DrissionPage Milvus

AutoWeb 是一个基于 LangGraph 的智能网页自动化 Agent。当前版本在原有 DrissionPage + Python Coder 执行链路之上,新增了 dp_cli 结构化动作模式:系统可以继续生成 Python 策略代码,也可以生成可审查、可缓存、可复用的 CLI Action JSON,由 drissionpage-cli 执行。

本次更新的重点不是简单替换执行器,而是把 AutoWeb 升级为双轨执行架构:

  • python_code 模式:保留原有 Coder 生成 Python 代码、Executor 通过 BrowserActor 执行的能力。
  • dp_cli 模式:Coder 生成单步 Action JSON,Executor 通过 DPCLIExecutor 调用 python -m dp_cli 执行。
  • ActionCache:在 dp_cli 模式下缓存成功动作,用于替代一部分“重复写代码”的场景。
  • dp_cli snapshot:可选用 CLI 快照作为 Observer 的轻量观察输入,失败时可回退到原 DOM Observer。
  • batch-detail-extract:针对“列表页抓详情页”任务,Verifier 可在一次成功提取后继续生成批量详情动作。
  • Agent Skills:启动时只发现各 SKILL.mdname + description;由 LLM 按任务和当前域名选择后,才把选中技能正文渐进加载给 Planner。

Current Status

当前系统默认保持保守兼容:不开启环境变量时,AutoWeb 仍走原有 Python Coder + CodeCache + BrowserActor 路径。要试用新链路,需要在 .env 中显式开启 DPCLI_ENABLED=True,并配置本地 drissionpage-cli 仓库路径。

Architecture

graph TD
    Start((Start)) --> Observer
    Observer --> Planner
    Planner --> SkillNeeded{Task/domain/catalog changed?}
    SkillNeeded -- Yes --> SkillSelector[SkillSelector: name + description only]
    SkillSelector --> LoadSkills[Load selected SKILL.md bodies]
    LoadSkills --> Planner
    SkillNeeded -- No --> Done{Task done?}
    Done -- Yes --> End((End))
    Done -- No --> CacheLookup

    Planner -- Need knowledge --> RAGNode
    RAGNode --> Observer

    CacheLookup --> ActionCache
    ActionCache -- Hit --> Executor
    ActionCache -- Miss --> CodeCache
    CodeCache -- Hit --> Executor
    CodeCache -- Miss --> Coder

    Coder --> Mode{execution_mode}
    Mode -- dp_cli --> ActionJSON[generated_action JSON]
    Mode -- python_code --> PythonCode[generated_code Python]

    ActionJSON --> Executor
    PythonCode --> Executor

    Executor -- dp_cli --> DPCLI[DPCLIExecutor]
    Executor -- python_code --> BrowserActor[BrowserActor]

    DPCLI --> Verifier
    BrowserActor --> Verifier
    Verifier -- Continue --> Observer
    Verifier -- Detail batch policy --> Executor
    Verifier -- Complete --> End
Loading

Core Features

Capability Current implementation
Multi-node workflow Observer -> Planner -> CacheLookup -> Coder -> Executor -> Verifier
Progressive Agent Skills Planner -> SkillSelector -> Planner;模型只先看元数据,选中后加载正文
Dual execution mode python_code for legacy Python strategies, dp_cli for structured CLI actions
Human-in-the-loop Executor 前可人工审查 Python 代码或 Action JSON,Verifier 后可确认结果
DomCache Observer 阶段缓存页面结构和语义观察
CodeCache Python Coder 生成代码的历史复用链路
ActionCache dp_cli 成功动作的轻量 JSON 缓存链路,支持失败命中黑名单
RAG 通过 Milvus/RAG 为复杂页面任务补充知识
dp_cli snapshot 可选使用 snapshot 作为轻量观察视图
Detail batch policy 从列表抽取结果继续生成详情页批处理动作

Repository Layout

AutoWeb/
├── main.py                         # CLI 入口、交互循环、HITL 编辑逻辑
├── config.py                       # 环境变量和全局配置
├── core/
│   ├── graph_v2.py                 # LangGraph 图构建
│   ├── state_v2.py                 # AgentState 状态 schema
│   ├── llm_factory.py              # LLM 实例工厂
│   └── nodes/                      # Observer/Planner/Coder/Executor/Verifier 等节点
├── drivers/
│   └── drission_driver.py          # DrissionPage 浏览器单例
├── prompts/                        # LLM prompt 模板
├── agent_skills/                   # 每个技能一个目录及必需的 SKILL.md
├── skills/                         # 运行时模块 (actor, observer, cache, dpcli, logger, toolbox)
├── rag/                            # RAG schema、retriever、QA
├── scripts/
│   ├── smoke/                      # 手动冒烟脚本
│   └── maintenance/                # 维护工具脚本
├── tests/
│   ├── unit/                       # 单元测试 (无需外部服务)
│   ├── integration/                # 集成测试 (需要浏览器/Milvus/API)
│   ├── fixtures/                   # 测试夹具
│   └── legacy/                     # 历史实验/一次性脚本
├── docs/
│   ├── architecture/               # 架构文档
│   ├── debugging/                  # 调试文档
│   └── migration/                  # 迁移文档
├── plan_/                          # 历史实施计划
│   └── README.md                   # 计划归档说明
├── logs/                           # 运行时日志 (gitignored)
├── output/                         # 生成产物和缓存 (gitignored)
└── browser_data/                   # 浏览器运行数据 (gitignored)

Windows 一键部署

项目提供可重复执行的部署入口:创建项目本地 .venv、绑定本地 drissionpage-cli、生成/保留 .env,导入 AutoWeb 入口/图/执行器,并真实启动一次无头 Chromium 和执行一次 dp_cli --help。验证未通过时脚本会以非零退出,不会把“只装了一半”报告为成功。

前置条件:Windows、Python 3.11+、已安装 Chrome/Edge,以及本地 drissionpage-cli 仓库。默认 CLI 路径为 AutoWeb 同级的 ..\drissionpage-cli

已有 .env(推荐)时,一条命令即可部署:

powershell -ExecutionPolicy Bypass -File .\scripts\deploy_windows.ps1 `
  -Python "C:\Python311\python.exe" `
  -DpCliPath "E:\GitHub\Repositories\drissionpage-cli"

首次部署且尚未有 .env 时,可在同一命令中提供模型配置;脚本不会在日志中输出密钥:

powershell -ExecutionPolicy Bypass -File .\scripts\deploy_windows.ps1 `
  -Python "C:\Python311\python.exe" `
  -DpCliPath "E:\GitHub\Repositories\drissionpage-cli" `
  -BailianModel "你的模型名" `
  -BailianApiKey $env:BAILIAN_API_KEY `
  -BailianBaseUrl "https://你的兼容接口/v1"

若 Chrome/Edge 不在系统默认位置,再增加 -BrowserPath "C:\Program Files\Google\Chrome\Application\chrome.exe"。脚本成功后使用同一虚拟环境启动:

.\.venv\Scripts\python.exe main.py

deploy.env.example 是不含密钥的配置模板。Milvus 仅在启用 RAG 检索时需要;一键部署会校验 Python、CLI、浏览器和模型配置,不会连接模型 API 或 Milvus,因此不会产生模型费用或修改远端数据。

默认 .venv 会继承指定 Python 的已安装运行时包,避免在网络镜像暂时不可用时陷入索引重试;部署成功门槛是 Agent 主链路所需模块、模型配置、CLI 和浏览器均通过真实探针。首次机器若需要安装完整开发/RAG 依赖,显式增加 -AllowNetworkDependencyInstall,它会安装整份 requirements.txt 并执行 pip check。若需要完全隔离的环境,必须同时增加 -NoSystemSitePackages -AllowNetworkDependencyInstall;若要重建本项目虚拟环境,增加 -RecreateVenv-UpgradePip 仅在需要升级 pip 时使用,避免无必要的网络请求。

Quick Start(手动方式)

1. Install dependencies

pip install -r requirements.txt

如果要试用 dp_cli 模式,请先准备本地 drissionpage-cli 仓库,并确保该环境能运行:

python -m dp_cli --help

2. Configure .env

基础 LLM、Milvus、浏览器配置仍沿用原项目设置。下面是本次更新新增或重点相关的配置:

# --- dp_cli structured action mode ---
DPCLI_ENABLED=False
DPCLI_CWD=E:\GitHub\Repositories\drissionpage-cli
DPCLI_PYTHON=python
DPCLI_SESSION=autoweb
DPCLI_HEADLESS=False
DPCLI_TIMEOUT_SECONDS=60
DPCLI_BATCH_TIMEOUT_SECONDS=900

# --- Optional dp_cli observer snapshot ---
DPCLI_OBSERVER_ENABLED=False
DPCLI_OBSERVER_FALLBACK_TO_DOM=True

# --- Optional dp_cli action cache ---
ACTION_CACHE_ENABLED=False
ACTION_CACHE_THRESHOLD=0.75
ACTION_CACHE_STORE_PATH=./output/action_cache.json

# --- Public structured-content fallback (SessionPage JSON-LD only) ---
SESSION_STRUCTURED_FALLBACK_ENABLED=True

# --- LLM-selected Agent Skills ---
AGENT_SKILLS_ENABLED=True
AGENT_SKILLS_DIR=./agent_skills
AGENT_SKILLS_MAX_SELECTED=3
AGENT_SKILLS_MAX_BODY_CHARS=20000

# --- Site policy: robots, shared budget, and 429 cooldown ---
SITE_POLICY_ENABLED=True
SITE_POLICY_MIN_INTERVAL_SECONDS=0.5
SITE_POLICY_ACCESS_LEDGER_PATH=./output/state/site_access_policy.sqlite3
SITE_POLICY_MAX_REQUESTS_PER_DOMAIN=240
SITE_POLICY_REQUEST_WINDOW_SECONDS=3600
SITE_POLICY_COOLDOWN_SECONDS=300

建议按阶段开启:

  1. 先保持 DPCLI_ENABLED=False,确认原 Python 链路仍可运行。
  2. 设置 DPCLI_ENABLED=True,只验证单步动作生成和执行。
  3. 再开启 DPCLI_OBSERVER_ENABLED=True,验证快照观察质量。
  4. 最后开启 ACTION_CACHE_ENABLED=True,验证动作缓存复用。

Agent Skills 默认开启。目录扫描只读取 YAML frontmatter 中的 namedescription;同一任务停留在同一域名时复用选择,任务、域名或技能目录变化后重新选择。完整协议见 docs/architecture/agent-skills.md

3. Run AutoWeb

python main.py

Execution Modes

Python Code Mode

这是 AutoWeb 原有主链路。Coder 生成 Python 代码写入 generated_code,Executor 调用 BrowserActor.execute_python_strategy() 执行。

适合:

  • 复杂页面逻辑
  • 需要临时计算或多步控制流的任务
  • 还没有 dp_cli action 覆盖的动作类型

dp_cli Mode

dp_cli 模式下,Coder 不再生成 Python 代码,而是生成结构化 Action JSON 写入 generated_action。Executor 使用 DPCLIExecutorDPCLI_CWD 中调用:

python -m dp_cli ...

当前支持的典型动作包括:

  • open
  • snapshot
  • find
  • click
  • type
  • expand
  • list-items
  • extract
  • resolve-locator
  • session.inspect
  • batch-detail-extract

HITL 审查时,系统会把动作写入 temp_action_edit.json,用户可以在执行前编辑 JSON。

Cache Strategy

DomCache

Observer 继续维护页面 DOM 和语义观察缓存,用于减少重复页面理解成本。

CodeCache

Python CodeCache 仍用于旧的 Python Coder 路径。缓存命中时,Executor 可以直接执行历史 Python 策略。

ActionCache

ActionCache 是本次更新新增的轻量动作缓存。它面向 dp_cli 模式,缓存结构化动作和任务上下文,默认存储在:

./output/action_cache.json

如果某次缓存命中的动作执行失败,Executor 会把该 action id 放入本轮状态的失败黑名单,避免同一轮重复命中同一个坏动作。

Detail Extraction Flow

对于“从列表页进入详情页并抓取详情”的任务,Verifier 会检查一次成功 extract 的结果。如果任务语义需要详情页,并且当前结果还不够完整,系统会通过 dpcli_crawl_policy.py 生成后续 batch-detail-extract 动作。

这个策略当前只在 dp_cli 路径生效,目的是把“列表 -> 详情页批量抓取”从自由代码生成逐步收敛为可审查的 CLI 批处理动作。

Important Config

Variable Default Description
DPCLI_ENABLED False 是否启用 dp_cli 动作生成和执行主路径
DPCLI_CWD E:\GitHub\Repositories\drissionpage-cli 本地 drissionpage-cli 仓库路径
DPCLI_PYTHON python 执行 dp_cli 的 Python 解释器
DPCLI_SESSION autoweb dp_cli 浏览器会话名
DPCLI_HEADLESS False dp_cli 是否使用 headless
DPCLI_TIMEOUT_SECONDS 60 单步 dp_cli 动作超时
DPCLI_BATCH_TIMEOUT_SECONDS 900 批量动作超时
DPCLI_OBSERVER_ENABLED False Observer 是否优先使用 dp_cli snapshot
DPCLI_OBSERVER_FALLBACK_TO_DOM True dp_cli snapshot 失败时是否回退原 DOM Observer
DPCLI_TASK_CONTRACT_ENABLED True 是否由确定性任务契约直接规划;模型横评时设为 False,契约仍负责字段、数量和完成度校验
LLM_ENABLE_THINKING 未设置 可选的模型思考模式开关;模型横评脚本会显式关闭以保证条件一致
ACTION_CACHE_ENABLED False 是否启用 dp_cli ActionCache
ACTION_CACHE_THRESHOLD 0.75 ActionCache 相似度阈值
ACTION_CACHE_STORE_PATH ./output/action_cache.json ActionCache JSON 存储路径
SESSION_STRUCTURED_FALLBACK_ENABLED True 浏览器抽取不满足契约时,是否允许使用 Site Policy 约束的公开 JSON-LD 回退
SITE_POLICY_ACCESS_LEDGER_PATH ./output/state/site_access_policy.sqlite3 跨 Task Run 的域名访问预算与冷却账本
SITE_POLICY_MAX_REQUESTS_PER_DOMAIN 240 每域名在窗口期内的最大请求数,0 表示不设置上限
SITE_POLICY_REQUEST_WINDOW_SECONDS 3600 域名请求预算的统计窗口(秒)
SITE_POLICY_COOLDOWN_SECONDS 300 收到 429 时的最短域名冷却时间(秒)

Test Commands

# 单元测试 (无需外部服务)
python -m unittest discover -s tests\unit -p "test_*.py"

# 集成测试 (需要浏览器/Milvus/API/Qwen/CUDA)
python -m unittest discover -s tests\integration -p "test_*.py"

# 冒烟脚本 (需要本地 drissionpage-cli 环境)
python scripts\smoke\smoke_dpcli_executor.py

注意:部分历史测试依赖 Milvus、pymilvus 或本地模型服务。没有准备这些外部依赖时,建议先运行 unit 测试。

Natural-language Crawler Model Benchmark

下面的矩阵会在真实本地浏览器中依次运行 deepseek-v4-flashkimi-k2.6kimi-k2.5,覆盖分页、无限滚动、详情页聚合、表单筛选和浏览器重启恢复任务。脚本会分别保存运行轨迹、JSON 结果和日志,并生成一份自包含 HTML 报告:

python scripts\benchmark\benchmark_model_matrix.py --models deepseek-v4-flash,kimi-k2.6,kimi-k2.5 --output output\benchmarks\model_matrix.json --report output\reports\autoweb_crawler_model_comparison.html

模型横评会关闭确定性契约的直接规划、DOM/代码/动作缓存和模型思考模式,让三个模型处理相同的页面与任务;契约仍用于结构化字段、目标数量和完成条件校验。运行前请确认 .env 已配置百炼兼容接口,并可先执行:

python scripts\verify_deployment.py --require-runtime-config --check-browser

Development Notes

  • 图节点仍遵循 Command(goto="...") 路由风格,不在 graph_v2.py 里新增复杂显式条件边。
  • DPCLI_ENABLED=False 时应保持原行为兼容。
  • dp_cli 相关能力优先以小步开关验证,不建议一次性打开 snapshot、ActionCache 和批处理策略。
  • 新增动作类型时,应同时更新 prompts/dpcli_action_prompts.pyskills/dpcli_executor.py 和对应测试。
  • 涉及浏览器实例时仍通过 BrowserDriver 或 dp_cli session 管理,不绕过现有入口。

Relationship With drissionpage-cli

AutoWeb 不直接复制 drissionpage-cli 的实现,而是通过 DPCLIExecutor 做受控子进程适配:

  1. AutoWeb 负责规划、观察、缓存、HITL、验证。
  2. Coder 在 dp_cli 模式下只输出结构化动作。
  3. drissionpage-cli 负责把动作落到真实浏览器。
  4. 执行结果回写到 dpcli_resultdpcli_snapshotexecution_result,供 Verifier 和后续节点使用。

这种边界让 AutoWeb 可以逐步从“生成代码执行”迁移到“生成动作执行”,同时保留旧链路作为回退。

License

MIT License

About

基于DrissionPage自动化操作浏览器做事情,包括但不限于爬取数据等操作

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages