| # 小红书稳定采集微服务 (Spider_XHS) 使用说明文档 |
| |
| 本文档旨在指导开发者、运维人员及业务方如何快速部署、配置、对接与运维 Spider_XHS 数据采集微服务。 |
|
|
| --- |
|
|
| ## 1. 快速启动与部署 |
|
|
| 本项目推荐使用 Docker Compose 进行容器化部署,以保证运行环境的一致性。 |
|
|
| ### 1.1 前置要求 |
| - **环境**:已安装 Docker 和 Docker Compose。 |
| - **配置**:建议在宿主机(如项目根目录)准备 `.env` 文件。 |
| - **数据目录**:宿主机需要预留足够的磁盘空间用于挂载 `./storage` 目录(存放任务状态、结果、回调失败记录、日志及 HTML 快照)。 |
|
|
| ### 1.2 启动步骤 |
| 在项目根目录执行以下命令,构建并以后台模式启动服务: |
| ```bash |
| docker compose up -d --build |
| ``` |
| 启动成功后,FastAPI 服务默认监听宿主机的 `8000` 端口。你可以通过访问 `http://localhost:8000/docs` 查看 Swagger UI 接口文档。 |
|
|
| ### 1.3 运营控制台前端(frontend/,可选) |
| 项目内置一个运营控制台前端(Vite + React),用于在浏览器中查看健康状态、任务列表、任务详情与监控指标。 |
|
|
| 在项目根目录执行: |
| ```bash |
| cd frontend |
| npm install |
| export VITE_API_BASE_URL=/api/v1 |
| npm run dev |
| ``` |
|
|
| 访问地址:`http://localhost:5173/` |
|
|
| 页面路由: |
| - `/dashboard`:服务健康概览 |
| - `/tasks`、`/tasks/:id`:任务中心与任务详情 |
| - `/rpa`:RPA 回传(Chrome 插件) |
| - `/errors`:错误中心 |
| - `/resources/accounts`、`/resources/sessions`、`/resources/proxies`:资源池中心 |
| - `/content/raw-notes`、`/content/cleaned-notes`:内容库 |
| - `/metrics`:监控指标 |
|
|
| 本地联调建议同时启动 FastAPI: |
| ```bash |
| python -m uvicorn Spider_XHS.service.app:app --host 0.0.0.0 --port 8000 --reload |
| ``` |
|
|
| --- |
|
|
| ## 2. 核心配置说明 (环境变量) |
|
|
| 服务的大部分行为通过环境变量进行控制,建议将敏感信息(如 Cookie)通过环境注入,切勿硬编码。 |
|
|
| | 环境变量名 | 默认值 | 作用与说明 | |
| |---|---|---| |
| | `ENGINE_STRATEGY` | `auto` | 采集引擎调度策略(服务端自动执行的只有 A/B 两个引擎)。可选值:<br>- `auto`: 优先使用 API 引擎,遇风控自动降级到浏览器引擎<br>- `api`: 仅使用极速协议级引擎 (Spider_XHS)<br>- `browser`: 仅使用自动化浏览器引擎 (MediaCrawler) | |
| | `COOKIES` / `XHS_COOKIES` | 无 | 小红书登录后的 Cookie 字符串。支持多账号,可通过 `COOKIES_LIST` 等按逗号/换行分隔配置。 | |
| | `ACCOUNT_COOLDOWN_SECONDS` | `900` | 当账号遇到严重风控 (rate/risk) 时,自动进入冷却状态的时长(秒)。 | |
| | `SERVICE_PROXY` | 无 | 单一代理服务器地址(如 `http://127.0.0.1:7890`)。 | |
| | `SERVICE_PROXY_POOL` | 无 | 代理列表(逗号分隔)。浏览器引擎在重试时会按次数轮询;同时会与 `SERVICE_PROXY` 合并去重。 | |
| | `PROXY_API_URL` | 无 | 动态代理池提取 API(单个地址,向后兼容);建议使用 `PROXY_API_URLS`。 | |
| | `PROXY_API_URLS` | 无 | 动态代理池的提取 API,支持逗号分隔配置多个 Provider,系统将自动定时拉取、验活与打分剔除。 | |
| | `PROXY_FILE_PATH` | 无 | 静态代理池文件路径(每行一个代理),支持与 API 代理池聚合使用。 | |
| | `CALLBACK_URL` | 无 | 任务完成后的 Webhook 回调推送地址。若配置,服务将在采集成功/失败后主动推送数据。 | |
| | `STORAGE_ROOT` | `./storage` | 容器内的本地文件存储路径。 | |
| | `ORCHESTRATOR_DB_PATH` | `orchestrator/data/mvp.db` | Orchestrator SQLite 路径(内容库接口 `/content/*` 读取,只读打开)。 | |
| | `RAW_DATA_RETENTION_DAYS` | `7` | 浏览器引擎采集时保留的原始 HTML 快照天数,过期自动清理。 | |
| | `ERROR_SUMMARY_SCAN_LIMIT` | `1000` | 错误中心默认扫描最近任务数(用于 `/errors/summary` 的默认 `scan_limit`)。 | |
| | `MEDIACRAWLER_STEALTH` | `1` | 浏览器引擎是否启用 Stealth 脚本注入(`0` 关闭)。 | |
| | `MEDIACRAWLER_HUMANIZE` | `1` | 浏览器引擎是否启用随机拟人化动作(`0` 关闭)。 | |
| | `AGENT_LLM_API_KEY` | 无 | **[必填]** 用于驱动 AI Agent 操作浏览器的视觉大模型 API 密钥(如 OpenAI Key)。 | |
| | `AGENT_LLM_MODEL` | `gpt-4o` | AI Agent 使用的模型名称。必须支持 Vision 多模态能力(如 `gpt-4o`, `claude-3-5-sonnet-20241022`)。 | |
| | `AGENT_LLM_BASE_URL` | 无 | 大模型 API 的自定义 Base URL(如使用中转代理地址时填写)。 | |
| | `OPENAI_API_KEY` | 无 | 独立配置:如果 AI 图文生成(`ai_generation.py`)需要使用不同的模型或通道,可在此配置。 | |
|
|
| --- |
|
|
| ## 3. 数据抓取实战操作指南 |
|
|
| 系统提供了多种灵活的抓取方式,以适应本地测试、运营操作和系统集成等不同场景。 |
|
|
| ### 3.1 方式一:命令行工具 (CLI) 本地抓取(推荐测试与获取 Cookie) |
| 适合开发者在本地快速测试抓取效果,并获取最新、最完整的防风控 Cookie。 |
| 1. **扫码登录并保存 Cookie**: |
| ```bash |
| python cli.py login pc-qrcode --save-cookies --write-env |
| ``` |
| > 运行后会弹出真实的浏览器界面供你扫码登录,登录成功后会自动将完整的 Cookie 和浏览器状态(包含 `storage_state.json`)更新到 `.env` 文件中。这是解决 `auth` 风控拦截的最佳方案。 |
| 2. **执行抓取命令**: |
| ```bash |
| python cli.py search --query "小红书架构设计" --num 10 |
| ``` |
| > 支持的子命令包括 `search` 等,结果会默认保存到项目目录下的 `datas/excel_datas/` 文件夹中。 |
|
|
| ### 3.2 方式二:前端运营控制台 (Web UI) 可视化抓取 |
| 适合运营人员或无需编写代码的用户进行可视化交互操作。 |
| 1. **启动服务**:确保后端 FastAPI 和前端 Vite 服务已正常启动(参考文档 1.2 和 1.3 节)。 |
| 2. **访问控制台**:在浏览器中打开 `http://localhost:5173/tasks` 进入任务中心。 |
| 3. **创建任务**: |
| - **task_type**:填写 `search`(搜索)、`note_url`(单篇笔记)或 `user_profile`(用户主页)。 |
| - **target**:填写对应的关键词、笔记链接或用户主页链接。 |
| - 点击 **创建任务**。 |
| 4. **查看结果**:任务创建后会在列表中显示,点击列表中的任务 ID 即可进入详情页,实时查看轮询状态、Raw(原始快照数据)和 Normalized(清洗后标准数据)。 |
| |
| ### 3.3 方式三:API 接口调用 (上游业务集成) |
| 适合将数据采集能力集成到 Java/Go/Python 等后端微服务中。 |
| - **操作步骤**:通过发送 HTTP POST 请求发起任务,再通过 GET 请求轮询结果,或配置 Webhook 接收自动回调。 |
| - **详细说明**:请参考本文档第 **4. 对接指南 (上游业务调用)** 节。 |
| |
| ### 3.4 方式四:离线兜底与插件 RPA 回传 |
| 当线上自动化引擎均遭遇极严格风控拦截时的人工兜底方案。 |
| - **操作步骤**:利用小红书数据助手导出 Excel 或使用 Chrome 插件在真实浏览器中抓取,随后调用对应的导入接口将数据回传至服务端。 |
| - **详细说明**:请参考本文档 **4.4 场景三:离线数据兜底导入** 及 **4.5 浏览器插件 RPA 回传**。 |
| |
| --- |
| |
| ## 4. 对接指南 (上游业务调用) |
| |
| ### 4.1 接口规范 |
| 所有 API 请求路径前缀为 `/api/v1`。 |
| 所有响应统一为 JSON 格式: |
| ```json |
| { |
| "code": 200, // 200 为成功,100xx 为特定业务错误 |
| "msg": "success", |
| "data": { ... } // 具体业务数据 |
| } |
| ``` |
| |
| ### 4.2 场景一:异步轮询拉取 (推荐) |
| 最简单且稳定的对接方式。上游(如 Java 服务)发起任务后,定期查询结果。 |
| |
| **步骤 1:创建任务** |
| ```bash |
| curl -X POST "http://localhost:8000/api/v1/tasks" \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "task_type": "note_url", |
| "target": "https://www.xiaohongshu.com/explore/xxxx", |
| "engine": "auto" |
| }' |
| ``` |
| > 返回值中的 `data.task.id` 即为 `task_id`。 |
| |
| **步骤 2:轮询获取结果** |
| ```bash |
| curl "http://localhost:8000/api/v1/tasks/<task_id>/result" |
| ``` |
| > **注意**: |
| > - 如果任务还在执行中,会返回 HTTP `409` (result not ready),上游应捕获 409 并等待 1~2 秒后重试。 |
| > - 任务结束后返回 200,其中 `data.normalized` 为标准化后的数据字段,`data.meta` 包含采集消耗的引擎与溯源信息。 |
|
|
| ### 4.3 场景二:Webhook 回调推送 |
| 如果上游不希望轮询,可以在环境变量中配置 `CALLBACK_URL`。 |
|
|
| 服务在任务完成后(无论成功或失败),会自动向该地址发起 POST 请求: |
| - **Header**: 包含 `Idempotency-Key` (基于 task_id 和内容生成的哈希),上游应据此做**幂等去重**。 |
| - **Body**: |
| ```json |
| { |
| "task_id": "...", |
| "result": { |
| "raw": {...}, |
| "normalized": {...}, |
| "meta": {"ok": true, ...} |
| } |
| } |
| ``` |
| > 如果回调失败(网络抖动或上游返回 5xx),服务会自动使用指数退避算法重试最多 5 次。 |
| |
| ### 4.4 场景三:离线数据兜底导入 |
| 当线上风控极其严格,导致 API 和浏览器双双失效时,业务方可通过“小红书数据助手”导出 Excel,并由上游系统或运营人员调用导入接口,将离线数据平滑注入现有业务流。 |
|
|
| ```bash |
| curl -X POST "http://localhost:8000/api/v1/import/excel" \ |
| -F "file=@/path/to/data_assistant.xlsx" \ |
| -F "operator=运营人员张三" |
| ``` |
| > 服务会自动识别 Excel 表头(如曝光、阅读、互动等),并返回标准化的 `normalized` 数据数组。 |
|
|
| ### 4.5 浏览器插件 RPA 回传:POST /api/v1/import/extension |
| 用途:该链路属于**人工兜底通道**(不在服务端自动执行引擎内)。通常用于处于 `waiting_rpa` 的任务:运营人员在真实浏览器环境中完成登录/验证码后,通过 Chrome 插件采集页面并回传;服务端目前只校验 `task_id` 存在性,然后写入结果并将任务更新为 `rpa_imported`。 |
|
|
| ```bash |
| curl -X POST "http://localhost:8000/api/v1/import/extension" \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "task_id": "...", |
| "raw": {...}, |
| "normalized": {...} |
| }' |
| ``` |
|
|
| ### 4.6 运营控制台只读接口 |
| 资源池中心(只读): |
| - `GET /api/v1/resources/accounts` |
| - `GET /api/v1/resources/sessions` |
| - `GET /api/v1/resources/proxies` |
|
|
| 错误中心(聚合统计): |
| - `GET /api/v1/errors/summary` |
| - `scan_limit`:扫描最近任务数量(默认取 `ERROR_SUMMARY_SCAN_LIMIT`,未配置则 1000) |
| - `status` / `error_kind`:逗号分隔过滤 |
|
|
| 内容库(Orchestrator SQLite,只读): |
| - `GET /api/v1/content/raw-notes`(`query` 模糊匹配 author/url/content) |
| - `GET /api/v1/content/cleaned-notes`(`query` 模糊匹配 cleaned_content/raw_note 字段) |
|
|
| --- |
|
|
| ## 5. 支持的任务类型 (task_type) |
| |
| 在调用 `POST /api/v1/tasks` 时,支持以下三种主要采集任务: |
| |
| | task_type | target 含义 | 示例 | 产出数据 (`normalized` 核心字段) | |
| |---|---|---|---| |
| | `note_url` | 笔记链接 | `https://www.xiaohongshu.com/explore/xxx` | `note_id`, `title`, `author`, `publish_time` | |
| | `user_profile` | 用户主页链接或 ID | `https://www.xiaohongshu.com/user/profile/xxx` | `user_id`, `nickname`, `title` (个性签名) | |
| | `search` | 搜索关键词 | `AI Agent` | 匹配该关键词下的多条笔记基础信息列表 | |
|
|
| --- |
|
|
| ## 6. 运维与监控 |
|
|
| ### 6.1 IP 限流防雪崩 |
| 服务内置了防雪崩限流机制(默认每个 IP `100次 / 60秒`)。超出阈值的请求会立即被拒绝,并返回 HTTP `429 Too Many Requests` 以及 `Retry-After` Header。 |
| > **建议**:上游业务在收到 429 时,应遵守 `Retry-After` 指定的秒数进行休眠,避免持续轰炸。 |
|
|
| ### 6.2 Prometheus 指标监控 |
| 服务直接暴露标准的 Prometheus Metrics 接口: |
| ```bash |
| curl http://localhost:8000/api/v1/metrics |
| ``` |
| **核心监控指标**: |
| - `spider_xhs_tasks_total{engine="api", status="succeeded"}`:按引擎和状态统计的任务总数。 |
| - `spider_xhs_queue_length`:当前正在排队中的积压任务数。 |
| - `spider_xhs_recent_failure_rate`:近 5 分钟内的实时失败率(可用于配置 Grafana 报警:如 > 20% 时触发风控预警)。 |
| - 代理池指标(若启用 Proxy Pool):`spider_xhs_proxy_pool_size`、`spider_xhs_proxy_pool_avg_score`、`spider_xhs_proxy_pool_ejected_total`、`spider_xhs_proxy_pool_failures_total{reason}`。 |
|
|
| ### 6.3 存储与数据清理 |
| 所有任务状态、采集结果、失败回调记录以及日志,均持久化存储在宿主机挂载的 `./storage` 目录下。 |
| - **原子落盘 + 进程锁**:写入采用临时文件 + `os.replace` 原子替换;关键更新路径使用 `fcntl.flock` 做跨进程互斥,避免并发更新覆盖。 |
| - **自动清理**:服务后台线程会每天定期扫描 `./storage/raw` 目录,自动清理超过 `RAW_DATA_RETENTION_DAYS`(默认 7 天)的 HTML 页面快照,防止磁盘爆满。 |
|
|
| ### 6.4 常见错误排查 |
|
|
| 如果在获取结果时发现 `data.meta.ok = false`,请查看 `data.meta.error_kind`: |
|
|
| - **`auth`**: 鉴权失败。可能是由于 Cookie 失效。**系统策略**:标记为失效并切换 Session Pool,若耗尽则报错。 |
| - **`rate`**: 遭遇频控。**系统策略**:为当前账号设置冷却窗(例如 15 分钟),换号、降频并重试。 |
| - **`risk` / `captcha`**: 触发滑动验证码。**系统策略**:主引擎报错,降级至浏览器引擎;若被验证码拦截,系统会唤醒 **Agentic Captcha Solver**(基于视觉大模型)自动拖动滑块/点选验证码;若 AI 依然失败,则置为 `waiting_rpa`,等待人工借助 Chrome 插件拉取。 |
| - **`parse`**: 页面解析失败。通常发生在小红书前端 DOM 结构发生重大改版时。**系统策略**:自动降级唤醒 **Engine D (Agentic Crawler)**,利用大模型的视觉和推理能力自动寻找并提取页面数据,无视 DOM 结构变化。 |
| - **`timeout` / `proxy_failed`**: 网络超时。**系统策略**:代理池立刻将此 IP 降分或剔除,换新代理并重新请求。 |
| |
| --- |
| |
| ## 7. AI 自动化编排模块 (Orchestrator MVP) |
| |
| 本项目在底层采集服务之上,提供了一套基于 Python 脚本的轻量级业务编排样例(位于 `orchestrator/` 目录),演示了借助大模型和 Agentic 技术实现的**获客全链路自动化**。 |
| |
| ### 7.1 初始化数据库与测试数据 |
| 编排模块依赖 SQLite (`orchestrator/data/mvp.db`) 作为主数据库,首次使用前需初始化: |
| ```bash |
| # 生成 14 张核心业务表 |
| python orchestrator/db_init.py |
| |
| # 录入测试用的关键词与竞品账号 |
| python orchestrator/seed_data.py |
| ``` |
| |
| ### 7.2 核心业务流转脚本 |
| 请确保后台 FastAPI 采集服务已启动,并且在环境变量中配置了 `AGENT_LLM_API_KEY`。可按顺序执行以下脚本体验闭环: |
| |
| 1. **采集同步**:读取关键词并请求爬虫微服务,将 JSON 数据落库。 |
| ```bash |
| python orchestrator/crawl_sync.py |
| ``` |
| 2. **数据清洗**:从原始快照中清洗提取标题、互动量等结构化字段。 |
| ```bash |
| python orchestrator/note_cleaner.py |
| ``` |
| 3. **AI 图文生成**:利用大模型对爆款笔记进行分析、仿写与原创配图生成。 |
| ```bash |
| python orchestrator/ai_generation.py |
| ``` |
| 4. **AI 自动发布**:唤醒基于 `browser-use` 的 AI 浏览器代理,自动操控小红书创作者中心进行真实发帖。 |
| ```bash |
| python orchestrator/publish_tracker.py |
| ``` |
| 5. **AI 自动私信触达**:筛选出高意向互动用户,利用 AI Agent 自动打开私信窗口进行获客留资话术的回复。 |
| ```bash |
| python orchestrator/lead_service.py |
| ``` |
| 6. **飞书同步与告警(Mock)**:将获取的线索同步至上游 CRM(如飞书多维表格)。 |
| ```bash |
| python orchestrator/feishu_sync.py |
| ``` |
| |