先说结论网上对“Agent 通杀网站逆向”的各种说法很多都是营销话术。Agent 智能体真正能解决的是网页信息提取、流程自动化和结构化数据整理而不是绕过网站的安全机制。本文会把“AI Agent 做网站数据自动化”这件事讲清楚架构怎么搭、环境怎么准备、接口怎么调、批量任务怎么跑以及哪些事情绝对不能做。文章会给出通用可落地的工程方案LLM 负责规划与语义理解Playwright 负责浏览器控制FastAPI 提供接口服务任务队列负责批量处理。所有操作都以自有站点、授权测试环境或公开合法数据源为前提。如果你关心的是合法范围内的网页数据采集与流程自动化这篇可以直接收藏。1. 核心能力速览在动手之前先把能力边界列成一张表。这里说的“Agent 智能体”不是一个单一开源项目而是一套基于 LLM 浏览器自动化 结构化输出的通用流程框架底层全部使用公开生态里的成熟组件。能力项说明项目类型通用 Agent 流程框架由 LLM 规划器 浏览器自动化工具 结构化输出层组成核心功能网页文本提取、表格结构化、表单填写、分页遍历、登录后页面解析、批量信息收集运行依赖Python 3.10、Node.js可选、Chromium 浏览器、LLM API 或本地模型服务模型接入OpenAI 兼容接口支持调用云端 API也支持 Ollama / vLLM 等本地模型服务推荐硬件CPU 即可运行若使用本地 LLM显存需按模型实际规格评估启动方式命令行单次运行 FastAPI 启动 Web 服务API 能力提供 HTTP 接口可接收任务并返回结构化 JSON批量任务支持目录批量处理、队列顺序执行、失败重试输出格式JSON、Markdown、本地文件归档适合场景自有系统数据核对、公开数据整理、文档站抓取解析、自动化流程验证不适合场景绕过登录态、破解验证码、对抗反爬风控、抓取受限数据这里必须强调一个原则Agent 只能访问你有权访问的数据。凡是需要绕过网站安全机制才能拿到的内容都不是这套框架应该解决的问题。2. 适用场景与使用边界2.1 合法且高频的落地场景首先是自有站点或内网系统的数据核对。很多运营人员需要定期从后台导出报表再整理成固定格式Agent 可以自动登录、读取页面数据、按模板汇总省掉重复点击。其次是公开文档站的结构化整理。比如技术文档、产品说明、行业报告页面Agent 可以抽取正文、表格、关键字段导出为 Markdown 或 JSON。这里要注意遵守站点本身的使用条款和 robots.txt 限制。第三是授权测试环境下的流程自动化。在本地搭建演示系统或者在公司测试环境执行表单提交、按钮点击、分页浏览Agent 可以反复尝试替代手工回归测试。2.2 明确不能做的场景电商平台是这类话题的高发区。很多电商站点有严格的反爬风控页面结构也会频繁变化且用户协议通常禁止未经授权的数据采集。不要尝试用 Agent 对抗验证码、模拟登录态绕过风控或者高频请求公开商品页。正确的替代路径是使用平台开放 API或者通过数据授权合作获取结构化数据。另一个不能做的是绕过登录限制读取付费内容。这类行为可能违反账号使用规则和相关法律法规风险远高于收益。2.3 隐私与版权红线如果目标页面涉及个人信息手机号、地址、订单记录采集前必须确认是否有合法处理依据并做好脱敏和权限控制。输出结果如果包含第三方版权内容只能用于个人学习或已获授权的用途不能直接商用发布。3. 环境准备与前置条件整套框架的核心是“LLM 做计划浏览器执行代码做校验”。环境准备分成三层LLM 服务、浏览器自动化环境、项目依赖。3.1 LLM 服务选择Agent 的规划能力由 LLM 决定。你有两种接法云端 API直接用 OpenAI 兼容接口优点是无需 GPU缺点是每次调用产生费用且数据会发送到第三方服务。敏感页面不适合走这条路。本地模型用 Ollama 或 vLLM 起一个本地 API 服务数据不出本机但需要按模型规格准备内存和显存。7B 级别模型在小规模任务上表现尚可复杂长页面需要更强模型。本地模型启动示例Ollama# 安装 ollama 后拉取模型这里以 qwen2.5 为例 ollama pull qwen2.5:7b ollama serve启动后本地 API 地址为http://127.0.0.1:11434/v1兼容 OpenAI 的/v1/chat/completions接口。3.2 检查清单检查项要求说明操作系统Windows / Linux / macOS 均可Python3.10 及以上Chromium通过 Playwright 安装用于页面渲染磁盘空间浏览器约 300MB虚拟环境 2GB 左右内存本机跑 7B 模型建议 16GB 以上显存本机跑 7B 模型建议至少 8GB具体以模型为准端口11434本地模型、8000Agent API 服务网络能访问目标测试站点和模型服务启动前先确认端口没有被占用# Linux / macOS lsof -i :8000 lsof -i :11434 # Windows PowerShell netstat -ano | findstr :8000如果端口被占用要么关掉旧进程要么换端口启动。4. 智能体整体架构与关键设计4.1 三层架构整个 Agent 框架拆成三层规划层接收用户任务调用 LLM 将任务拆成可执行步骤例如“打开页面 - 定位正文 - 抽取标题和表格 - 输出 JSON”。执行层通过 Playwright 控制浏览器执行规划层给出的动作包括页面访问、点击、输入、滚动、翻页。校验层执行结束后检查结果完整性如果页面结构变化导致抽取失败则把错误信息回传给规划层重新生成修正步骤。这样的结构与单独写死爬虫脚本的区别在于脚本依赖固定的 CSS 选择器而 Agent 可以用语义描述定位页面元素例如“找到商品列表区域”“把表格第一列作为 key”不绑定具体页面结构。4.2 Agent 工作循环核心循环如下用户提交任务描述和目标 URL。规划层生成操作步骤清单。执行层逐条执行浏览器动作。校验层判断当前步骤是否成功。若失败将页面快照和错误文本回传给 LLM重新规划。全部步骤完成后统一输出结构化结果。这个循环相当于一个简化版 ReAct 模式Thought - Action - Observation直到完成用户目标。4.3 工具函数设计执行层建议把浏览器能力封装成独立工具函数便于 Agent 调用也方便人工单测。常见工具函数如下工具名入参输出说明open_pageurl页面摘要打开页面并截取可见文本extract_textselector文本内容按语义描述或选择器提取文本extract_tableselectorJSON 数组将页面表格转换为结构化数组fill_formselector, value成功/失败填写表单字段click_buttonselector成功/失败点击按钮paginatedirection成功/失败翻页操作snapshot无截图路径保存当前页面截图用于失败回溯工具封装得越干净Agent 的规划成功率越高。不要把页面操作散落在业务流程里。5. 搭建部署与启动方式5.1 安装项目依赖先创建虚拟环境并安装 Python 依赖python -m venv venv source venv/bin/activate # Windows 使用 venv\Scripts\activate pip install playwright fastapi uvicorn openai pydantic安装 Playwright 浏览器内核playwright install chromium如果系统缺少浏览器运行库Linux 环境还要安装依赖# Ubuntu / Debian 示例 playwright install-deps这里不需要 GPUCPU 环境可以正常完成页面渲染和文本提取。5.2 项目目录结构建议按以下结构组织agent-project/ ├── agent/ │ ├── planner.py # LLM 规划器 │ ├── executor.py # 浏览器执行器 │ ├── validator.py # 结果校验器 │ └── tools.py # 工具函数集 ├── app.py # FastAPI 入口 ├── tasks.json # 批量任务配置 ├── inputs/ # 输入素材 ├── outputs/ # 输出结果 └── logs/ # 运行日志5.3 核心代码Agent 主循环下面给出一段可以跑通的简化版 Agent 主循环实际项目可以在此之上扩展# agent/core.py from playwright.sync_api import sync_playwright from openai import OpenAI class WebAgent: def __init__(self, base_url: str, api_key: str, model: str qwen2.5:7b): self.client OpenAI(base_urlbase_url, api_keyapi_key) self.model model self.tool_names [open_page, extract_text, extract_table, fill_form, click_button, paginate] def plan(self, task: str, page_info: str) - list[dict]: prompt f 当前可调用工具{self.tool_names} 目标任务{task} 当前页面信息{page_info} 请返回 JSON 格式的操作步骤列表字段为 step, tool, params。 resp self.client.chat.completions.create( modelself.model, messages[{role: user, content: prompt}], temperature0.2 ) return eval(resp.choices[0].message.content) # 仅作示例生产环境建议用 json.loads 解析 def run(self, task: str, start_url: str): with sync_playwright() as p: browser p.chromium.launch(headlessTrue) page browser.new_page() page.goto(start_url, wait_untildomcontentloaded) steps self.plan(task, page.inner_text(body)[:2000]) results [] for step in steps: try: result self._execute_tool(page, step[tool], step[params]) results.append({step: step[step], status: ok, result: result}) except Exception as exc: results.append({step: step[step], status: error, error: str(exc)}) break browser.close() return results def _execute_tool(self, page, tool: str, params: dict): # 实际项目在这里把工具名映射到 tools.py 里的函数 if tool open_page: page.goto(params[url], wait_untildomcontentloaded) return page.title() if tool extract_text: return page.inner_text(params[selector]) raise NotImplementedError(f工具 {tool} 未实现)需要注意示例中的eval仅用于演示可读性生产环境必须使用json.loads并要求 LLM 严格输出 JSON避免表达式注入风险。5.4 启动 Web API 服务用 FastAPI 把 Agent 包成 HTTP 服务# app.py from fastapi import FastAPI from pydantic import BaseModel from agent.core import WebAgent app FastAPI() agent WebAgent( base_urlhttp://127.0.0.1:11434/v1, api_keylocal, modelqwen2.5:7b ) class TaskRequest(BaseModel): task: str start_url: str app.post(/run) def run_task(req: TaskRequest): return agent.run(req.task, req.start_url)启动服务uvicorn app:app --host 0.0.0.0 --port 8000启动后可以通过http://127.0.0.1:8000/docs查看 Swagger 文档也可以直接用 POST 请求调用接口。如果端口冲突换一个端口即可。6. 功能测试与效果验证框架搭好后建议按以下顺序跑功能测试。为保证合规所有测试目标都使用本地演示页面或公开合法数据源。6.1 静态信息提取测试测试目的验证 Agent 是否能把网页正文和标题抽取为结构化 JSON。操作步骤使用一个公开技术文档页面或本地静态 HTML 文件提交任务“提取页面标题、第一段正文和所有二级标题”。请求示例curl -X POST http://127.0.0.1:8000/run \ -H Content-Type: application/json \ -d {task: 提取页面标题、第一段正文和所有二级标题, start_url: http://127.0.0.1:8080/test.html}预期结果返回 JSON 中包含完整字段标题正确、正文无乱码、二级标题数量与实际页面一致。判断标准字段级校验通过缺失字段为 0。失败排查如果提取结果为空先检查目标页面是否被正常加载再确认页面正文是否通过 JavaScript 动态渲染。6.2 表格转结构化数据测试测试目的验证表格抽取能力这是 Agent 在数据处理场景中最常被用到的功能。操作步骤准备一个包含多行多列的本地 HTML 表格页面提交任务“把页面上第一个表格转成 JSON”。预期结果表格每一行变成一个 JSON 对象表头成为字段名空单元格保持为空字符串而不是丢弃。常见问题多层表头、合并单元格会显著增加解析难度。如果表格结构复杂应该让 Agent 先输出 Markdown 格式再二次转换。6.3 表单填写与点击流程测试测试目的验证 Agent 能否根据语义描述完成“输入关键词 - 点击搜索 - 读取结果”的整段流程。操作步骤在本地测试系统准备一个带搜索框的页面提交任务“在搜索框输入 Agent点击搜索按钮读取结果区域文本”。预期结果搜索框正确填入内容按钮点击成功返回结果区域包含目标关键词。判断标准观察 Playwright 日志确认每个动作都有明确成功标记如果点击后页面跳转需要等待新页面加载完成再执行下一步。失败排查如果定位失败将页面截图回传给 LLM用图片描述替代纯文本描述成功率会明显提升。6.4 分页与动态加载测试测试目的验证翻页和滚动加载。操作步骤在本地测试页模拟分页列表提交任务“遍历前 3 页收集所有列表项标题”。预期结果返回结果包含 3 页的数据总和且没有重复项。注意点分页遍历必须加入页数上限否则动态加载页面可能无限制滚动下去。批量任务中建议统一加 max_pages 参数。6.5 输出质量校验每次任务结束后都应该跑一遍字段完整性检查。可以写一个独立校验函数def validate_result(data: dict, required_keys: list[str]) - bool: missing [key for key in required_keys if not data.get(key)] if missing: print(f缺少字段: {missing}) return False return True校验不通过时把缺失字段名和页面摘要重新交给 LLM 做第二次规划而不是直接丢弃结果。这比提高 prompt 温度参数更有效。7. 接口 API 与批量任务7.1 API 设计原则接口层需要区分两类能力单次任务接口和批量任务接口。单次任务用于联调和测试批量任务用于生产环境。批量任务不建议同步等待而应采用“提交任务 - 后台执行 - 轮询状态”的异步模式。扩展 FastAPI 接口# app.py 追加 import uuid from pydantic import BaseModel BATCH_TASKS {} class BatchRequest(BaseModel): tasks: list[dict] app.post(/batch) def create_batch(req: BatchRequest): batch_id str(uuid.uuid4()) BATCH_TASKS[batch_id] {status: running, results: [], total: len(req.tasks)} # 实际项目这里应丢给后台任务队列处理而不是直接阻塞 return {batch_id: batch_id, status: accepted} app.get(/batch/{batch_id}) def get_batch(batch_id: str): return BATCH_TASKS.get(batch_id, {status: not_found})7.2 Python 客户端调用示例import requests import time BASE_URL http://127.0.0.1:8000 def submit_batch(tasks): resp requests.post(f{BASE_URL}/batch, json{tasks: tasks}, timeout30) batch_id resp.json()[batch_id] print(批量任务ID:, batch_id) return batch_id def wait_batch(batch_id, interval5, timeout300): for _ in range(timeout // interval): status requests.get(f{BASE_URL}/batch/{batch_id}, timeout30).json() if status[status] ! running: return status time.sleep(interval) return {status: timeout}7.3 批量任务配置模板批量任务建议使用 JSON 文件维护方便审计和复用{ max_retry: 3, rate_limit_seconds: 2, tasks: [ { id: task-001, task: 提取页面标题和第一段, start_url: http://127.0.0.1:8080/doc1.html, required_keys: [title, summary] }, { id: task-002, task: 提取表格为JSON, start_url: http://127.0.0.1:8080/doc2.html, required_keys: [table] } ] }rate_limit_seconds字段用来控制相邻请求间隔这对任何网站都是必要的。不要删除这个字段也不要把间隔设为 0。失败重试策略单个任务失败时先记录错误快照间隔指数退避重试如 3 秒、9 秒、27 秒超过最大重试次数后将该任务标记为 failed并继续执行后续任务。不要让一个失败任务卡死整个批次。8. 资源占用与性能观察8.1 LLM Token 开销Agent 每轮规划都需要把任务描述、页面文本、当前状态发送给 LLM。一个普通页面正文约几千字换算成 token 大约是 1000 到 3000。如果循环中每步都携带完整页面文本token 消耗会快速增长。优化方式截断页面文本默认只取 body 前 2000 到 4000 字符。缓存页面摘要同一 URL 在短时间内的页面摘要直接复用。使用小模型做规划规划任务是简单 JSON 输出7B 级别模型足够不必每次都调用大模型。8.2 浏览器内存与并发从常见部署形态看单个 Chromium context 的内存开销在数百 MB 量级。如果同时开多个并发任务内存压力会成倍上升。建议控制 Chrome 实例数量优先用同一个浏览器实例内开多个 tab而不是多个独立浏览器进程。使用headlessTrue能省掉渲染开销常规文本提取任务不需要窗口可见。只有在需要截图排障时才临时开启有头模式。8.3 性能观察指标建议记录以下指标单任务总耗时LLM 调用次数单次调用的 token 数浏览器内存峰值失败重试次数某个固定步骤的成功率通过观察这些指标可以判断瓶颈在 LLM 规划、页面渲染还是目标结构变化。页面结构变化是 Agent 方案最值得关注的风险点目标站点改版后旧规则全部失效。缓解策略是让 Agent 输出更依赖语义描述而不是固定选择器并在每次任务前先做一次页面结构摘要。9. 常见问题与排查方法问题现象可能原因排查方式解决方案依赖安装失败Python 版本过低或网络源不可用查看 pip 日志升级 Python换国内镜像源Chromium 启动失败缺少系统运行库或浏览器内核未安装运行 playwright install-deps安装系统依赖后重启LLM 接口超时模型服务未启动或网络不通curl 测试接口确认 ollama serve 正常Agent 返回空结果页面为动态渲染正文未加载完成截图检查页面状态增加 wait 策略数据提取缺字段页面结构与 prompt 描述不符打印页面摘要用语义描述替换选择器批量任务卡住单任务异常未捕获查看任务日志加超时控制失败跳转被目标站点限制访问请求频率过高查看 HTTP 状态码拉大间隔改用官方 API端口冲突旧进程残留netstat 检查端口kill 旧进程或换端口额外提醒如果目标站点返回验证码或风控拦截正确的做法是立即停止采集并调整方案而不是尝试绕过。一旦触发 IP 限制解决成本远高于采集收益。10. 合规与工程化最佳实践10.1 授权边界检查清单每次新增目标站点前先做五步检查确认自己是否有合法访问权限例如自有站点、团队内部系统或已获得授权。阅读目标站点的 robots.txt 和使用条款确认是否允许自动化访问。评估数据性质是否涉及个人信息、付费内容或商业机密。控制访问频率避免对目标站点造成负载压力。保留任务日志记录采集时间、目标地址和用途。# 检查目标站点的抓取约定 curl https://example.com/robots.txt10.2 数据与日志管理输出结果按来源和用途分目录存放敏感字段在落盘前做脱敏。任务日志保留至少 30 天。Agent 的每个决策步骤都尽量记录使用哪个模型、输入了什么任务、调用了什么工具、返回了什么结果。这样一旦出现数据问题可以回溯到具体环节。10.3 模型与接口安全如果 Agent 服务对外提供接口必须限制访问范围。生产环境不要直接暴露到公网可以绑定内网 IP或增加 Token 鉴权uvicorn app:app --host 127.0.0.1 --port 8000对外提供服务时把 API Key 放在环境变量中不要写进代码仓库export LLM_BASE_URLhttp://127.0.0.1:11434/v1 export LLM_API_KEYyour_key10.4 上线前效果复核批量采集结果上线前人工抽样核对 5% 到 10% 的数据。Agent 的抽取质量受页面结构影响较大特别是表格和复杂排版。宁可保留一份经过人工复核的小数据集也不要直接发布未校验的全量结果。11. 总结与下一步AI Agent 做网站信息提取的完整链路是LLM 负责语义理解浏览器自动化负责操作代码校验负责兜底。这套架构能够覆盖公开文档整理、自有系统数据核对、表单流程自动化等场景门槛不高CPU 机器可以跑部署核心就是 Python 环境加浏览器。第一批建议做的测试很简单找一个本地 HTML 页面让 Agent 把标题和表格提取成 JSON跑通后再加上批量任务和失败重试。最容易踩的坑有三个第一没有控制请求频率被目标站点限制第二用固定选择器依赖页面结构页面一改就失效第三批量任务没有超时和重试机制单任务失败卡死整个队列。这些坑都能通过日志和校验流程提前发现。更需要注意的是边界问题。Agent 能自动化流程但不能自动化“授权”。目标站点允不允许自动化访问、数据能不能采集、用在哪这些判断不能交给模型决定只能由使用者负责。先在授权环境下验证能力再逐步放大任务规模这套框架会非常顺手。下一步可以尝试的方向是多 Agent 协作做拆分任务、把页面截图纳入模型输入以提升定位准确率、以及将抽取结果接入数据看板做定期核对。
阅读完成 · 觉得有帮助?