Project Atlas 知识图谱 / 舆情系统 / 采集后端 API ← 返回图谱
⚙️

采集后端 chrome-pa-api

网页内容抓取与舆情监控平台的后端服务,基于 FastAPI。负责采集编排、搜索引擎聚合、舆情监控、任务调度、DeepSeek 情感分析与数据落库。

FastAPI Python 3.9+ MongoDB 4.0+ RabbitMQ 3.8+ XXL-JOB :8000
本页导航
定位 架构 接口概览 配置 部署 关联

# 一、定位与数据流

采集端由后端与 Chrome 插件组成,作为流水线协作:后端创建采集任务 → 插件轮询领取 → 打开目标 URL → 平台插件抓取 → 结构化数据回传后端存储与 LLM 情感分析。

TaskPoller 轮询 GET /get-not-started-task
   → 后端下发任务 → 插件打开标签页
   → content 脚本按域名分发到平台插件
   → 抓列表/详情 → POST /sentiment-monitor/data
   → 后端存 MongoDB + DeepSeek 情感分析
MongoDB 数据库名为 deep-research,采集原文主集合 html_md,舆情成品存 sentiment_data,与报告端共享同一个库。
插件领采集任务走 HTTP 轮询(GET /get-not-started-task,含 longpoll 版),不依赖 RabbitMQ。RabbitMQ 消费的是 platform_task_queue_* 平台任务队列(异步任务分发/语义处理)。因此 RabbitMQ 不可用时,插件采集这条主链路不受影响。详见下方部署说明。

# 二、架构

入口
main.py — 定义核心路由,并通过 include_routers_from_dir() 动态加载子目录路由。
配置
config.py 用 Pydantic Settings,APP_ENV(dev/prod)决定加载 .env.dev 或 .env.prod。

路由模块(按域组织,位于 api/)

目录职责
api/gov_api/政府站点采集器(16 个领域:金融、法律、能源、教育、农业等)
api/not_gov_api/非政府站点采集器(13 个领域:新闻、购物、投资、汽车等)
api/index_api/索引/首页相关路由

每个域含一个 *_api.py 路由文件和一个 *_api_utils/ 抓取辅助目录。

关键服务

模块职责
sentiment_monitor/舆情监控模块,自带 models / router / service / XXL-JOB 集成
mq_api/RabbitMQ 消息 API,与 Chrome 插件异步通信
utils/mongodb_handler.py所有 MongoDB CRUD 操作
utils/llm_service.pyDeepSeek LLM 集成(情感分析、内容摘要)
utils/base_util.py核心 URL 处理与内容抽取
utils/*_web_service.py搜索引擎集成(百度/必应/搜狗/Google/豆瓣/天眼查/企查查)
utils/api_key_manager.pyTavily API Key 轮询(MongoDB 支撑的 Key 池)

# 三、接口概览

完整交互式接口文档在服务启动后访问 http://localhost:8000/docs(Swagger UI)。以下为主要端点分组:

方法路径说明
GET/get-not-started-task插件轮询待采集任务
POST/sentiment-monitor/data插件回传抓取到的舆情数据
GET/search · /bing-search · /baidu-search1多搜索引擎查询
GET/tavily-md · /google-md · /bing-web-md搜索结果抓取转 Markdown
GET/tianyancha-web-md · /qichacha-web-md · /aiqicha-web-md企业信息采集
GET/company-info-rotation企业信息轮询采集
POST/get-md · /get-mdsURL 抓取转 Markdown(单/批量)
POST/update · /update-status-to-failed更新采集记录状态
路由随版本演进,以 /docs Swagger 为准。这里只列稳定的主干端点,帮助建立整体认识。

# 四、配置

通过 APP_ENV 加载不同配置文件,优先级:系统环境变量 > .env 文件 > config.py 默认值。首次:cp .env.example .env.dev。

配置项说明示例
MONGO_HOST / PORTMongoDB 地址端口192.168.x.x / 27017
MONGO_DATABASE数据库名deep-research
MONGO_COLLECTION默认集合html_md
RABBITMQ_IP / PORTRabbitMQ 地址端口5672
RABBITMQ_VIRTUAL_HOSTvhostlangwell-v2
XXL_JOB_ADMIN_URL调度中心地址(须以 /api/ 结尾).../xxl-job-admin/api/
XXL_JOB_EXECUTOR_NAME执行器名chrome-pa-api
XXL_JOB_EXECUTOR_PORT执行器端口19999
TAVILY_BASE_URL / API_KEYTavily 搜索 APIhttps://api.tavily.com
LLM_BASE_URL / API_KEY / MODEL情感分析用的 LLM(OpenAI 兼容),仅 utils/llm_service.py 使用https://api.deepseek.com / deepseek-chat
LLM_CHECK_ROLE_MODEL废弃配置:仅在 config 中定义,代码无任何引用,配不配都不生效—
.env.dev 和 .env.prod 含真实密码;config.py 有硬编码默认凭据。切勿提交真实凭据,镜像通过 volumes 挂载或 env_file 传入。
LLM 仅用于舆情情感分析(analyze_sentiment_and_extract_info:情感倾向 + 摘要 + 关键词)。不配置 LLM 服务不会崩溃——客户端初始化不校验 key,调用失败时有多层兜底(异常/解析失败回退到 情感=中性、摘要空、关键词按词表启发式匹配),但会失去 AI 分析能力、退化成默认值。

# 五、部署

运行依赖

依赖类别端口 / 标识必需性说明
MongoDB数据库27017 · 库 deep-research✅ 必需采集原文 html_md + 舆情成品 sentiment_data,与报告端共享
MinIO对象存储OSS_ENDPOINT · 桶 OSS_BUCKET_NAME⚙ 采集落图必需utils/oss_service.py:发票图片 / 法律 / 保险文件上传。不采集这些则可不接
RabbitMQ消息队列5672 · vhost 如 langwell-v2⏸ 失败降级(见下)消费 platform_task_queue_*;连不上仅记日志、不影响主服务
XXL-JOB定时调度执行器 19999⏸ 定时采集才需按监测周期自动触发采集;手动/插件采集不依赖
DeepSeek LLM外部服务LLM_BASE_URL⏸ 可降级仅情感分析用;不配置退化成默认值,不崩
Tavily外部服务api.tavily.com⏸ 搜索才需联网搜索能力

依赖安装与启动

# 安装依赖
pip install -r requirements.txt

# 开发环境(默认 dev)
python main.py
APP_ENV=dev uvicorn main:app --host 0.0.0.0 --port 8000 --reload

# 生产环境
APP_ENV=prod uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

# 生产后台运行
APP_ENV=prod nohup uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 > logs/app.log 2>&1 &

systemd(推荐生产)

# /etc/systemd/system/chrome-pa-api.service
[Unit]
Description=Chrome PA API Service
After=network.target

[Service]
Type=simple
User=app
WorkingDirectory=/path/to/chrome-pa-api
Environment=APP_ENV=prod
ExecStart=/path/to/python -m uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
Restart=always
RestartSec=5

Docker Compose

# 通过 APP_ENV 切换环境,挂载对应 .env 文件
APP_ENV=prod docker compose up -d
APP_ENV=dev  docker compose up -d
环境要求:Python 3.9+、MongoDB 4.0+、RabbitMQ 3.8+、XXL-JOB 调度中心。核心依赖见 requirements.txt:pymongo / fastapi / uvicorn / BeautifulSoup4 / pyxxl / pika / openai / minio / markdownify。
RabbitMQ 是"失败降级"而非配置开关:没有 RABBITMQ_ENABLED 之类的开关字段。MQ 消费者在启动时以 daemon 线程 + try/except 拉起(main.py startup),连不上只记 error 日志、不影响主服务启动,HTTP 接口照常可用。所以 RabbitMQ 可以"不接"照跑,但每次仍会尝试连接并刷错误日志——想彻底静默需改代码在 startup 里跳过消费者启动。

# 六、关联

Project Atlas · 返回知识图谱 · 如何维护