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.md的name + description;由 LLM 按任务和当前域名选择后,才把选中技能正文渐进加载给 Planner。
当前系统默认保持保守兼容:不开启环境变量时,AutoWeb 仍走原有 Python Coder + CodeCache + BrowserActor 路径。要试用新链路,需要在 .env 中显式开启 DPCLI_ENABLED=True,并配置本地 drissionpage-cli 仓库路径。
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
| 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 | 从列表抽取结果继续生成详情页批处理动作 |
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)
项目提供可重复执行的部署入口:创建项目本地 .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.pydeploy.env.example 是不含密钥的配置模板。Milvus 仅在启用 RAG 检索时需要;一键部署会校验 Python、CLI、浏览器和模型配置,不会连接模型 API 或 Milvus,因此不会产生模型费用或修改远端数据。
默认 .venv 会继承指定 Python 的已安装运行时包,避免在网络镜像暂时不可用时陷入索引重试;部署成功门槛是 Agent 主链路所需模块、模型配置、CLI 和浏览器均通过真实探针。首次机器若需要安装完整开发/RAG 依赖,显式增加 -AllowNetworkDependencyInstall,它会安装整份 requirements.txt 并执行 pip check。若需要完全隔离的环境,必须同时增加 -NoSystemSitePackages -AllowNetworkDependencyInstall;若要重建本项目虚拟环境,增加 -RecreateVenv。-UpgradePip 仅在需要升级 pip 时使用,避免无必要的网络请求。
pip install -r requirements.txt如果要试用 dp_cli 模式,请先准备本地 drissionpage-cli 仓库,并确保该环境能运行:
python -m dp_cli --help基础 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建议按阶段开启:
- 先保持
DPCLI_ENABLED=False,确认原 Python 链路仍可运行。 - 设置
DPCLI_ENABLED=True,只验证单步动作生成和执行。 - 再开启
DPCLI_OBSERVER_ENABLED=True,验证快照观察质量。 - 最后开启
ACTION_CACHE_ENABLED=True,验证动作缓存复用。
Agent Skills 默认开启。目录扫描只读取 YAML frontmatter 中的 name 和 description;同一任务停留在同一域名时复用选择,任务、域名或技能目录变化后重新选择。完整协议见 docs/architecture/agent-skills.md。
python main.py这是 AutoWeb 原有主链路。Coder 生成 Python 代码写入 generated_code,Executor 调用 BrowserActor.execute_python_strategy() 执行。
适合:
- 复杂页面逻辑
- 需要临时计算或多步控制流的任务
- 还没有 dp_cli action 覆盖的动作类型
dp_cli 模式下,Coder 不再生成 Python 代码,而是生成结构化 Action JSON 写入 generated_action。Executor 使用 DPCLIExecutor 在 DPCLI_CWD 中调用:
python -m dp_cli ...当前支持的典型动作包括:
opensnapshotfindclicktypeexpandlist-itemsextractresolve-locatorsession.inspectbatch-detail-extract
HITL 审查时,系统会把动作写入 temp_action_edit.json,用户可以在执行前编辑 JSON。
Observer 继续维护页面 DOM 和语义观察缓存,用于减少重复页面理解成本。
Python CodeCache 仍用于旧的 Python Coder 路径。缓存命中时,Executor 可以直接执行历史 Python 策略。
ActionCache 是本次更新新增的轻量动作缓存。它面向 dp_cli 模式,缓存结构化动作和任务上下文,默认存储在:
./output/action_cache.json
如果某次缓存命中的动作执行失败,Executor 会把该 action id 放入本轮状态的失败黑名单,避免同一轮重复命中同一个坏动作。
对于“从列表页进入详情页并抓取详情”的任务,Verifier 会检查一次成功 extract 的结果。如果任务语义需要详情页,并且当前结果还不够完整,系统会通过 dpcli_crawl_policy.py 生成后续 batch-detail-extract 动作。
这个策略当前只在 dp_cli 路径生效,目的是把“列表 -> 详情页批量抓取”从自由代码生成逐步收敛为可审查的 CLI 批处理动作。
| 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 时的最短域名冷却时间(秒) |
# 单元测试 (无需外部服务)
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 测试。
下面的矩阵会在真实本地浏览器中依次运行 deepseek-v4-flash、kimi-k2.6 和 kimi-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- 图节点仍遵循
Command(goto="...")路由风格,不在graph_v2.py里新增复杂显式条件边。 DPCLI_ENABLED=False时应保持原行为兼容。- dp_cli 相关能力优先以小步开关验证,不建议一次性打开 snapshot、ActionCache 和批处理策略。
- 新增动作类型时,应同时更新
prompts/dpcli_action_prompts.py、skills/dpcli_executor.py和对应测试。 - 涉及浏览器实例时仍通过
BrowserDriver或 dp_cli session 管理,不绕过现有入口。
AutoWeb 不直接复制 drissionpage-cli 的实现,而是通过 DPCLIExecutor 做受控子进程适配:
- AutoWeb 负责规划、观察、缓存、HITL、验证。
- Coder 在 dp_cli 模式下只输出结构化动作。
drissionpage-cli负责把动作落到真实浏览器。- 执行结果回写到
dpcli_result、dpcli_snapshot和execution_result,供 Verifier 和后续节点使用。
这种边界让 AutoWeb 可以逐步从“生成代码执行”迁移到“生成动作执行”,同时保留旧链路作为回退。
MIT License