网页内容抓取与舆情监控平台的后端服务,基于 FastAPI。负责采集编排、搜索引擎聚合、舆情监控、任务调度、DeepSeek 情感分析与数据落库。
采集端由后端与 Chrome 插件组成,作为流水线协作:后端创建采集任务 → 插件轮询领取 → 打开目标 URL → 平台插件抓取 → 结构化数据回传后端存储与 LLM 情感分析。
TaskPoller 轮询 GET /get-not-started-task
→ 后端下发任务 → 插件打开标签页
→ content 脚本按域名分发到平台插件
→ 抓列表/详情 → POST /sentiment-monitor/data
→ 后端存 MongoDB + DeepSeek 情感分析
deep-research,采集原文主集合 html_md,舆情成品存 sentiment_data,与报告端共享同一个库。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.py | DeepSeek LLM 集成(情感分析、内容摘要) |
utils/base_util.py | 核心 URL 处理与内容抽取 |
utils/*_web_service.py | 搜索引擎集成(百度/必应/搜狗/Google/豆瓣/天眼查/企查查) |
utils/api_key_manager.py | Tavily 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-mds | URL 抓取转 Markdown(单/批量) |
| POST | /update · /update-status-to-failed | 更新采集记录状态 |
/docs Swagger 为准。这里只列稳定的主干端点,帮助建立整体认识。通过 APP_ENV 加载不同配置文件,优先级:系统环境变量 > .env 文件 > config.py 默认值。首次:cp .env.example .env.dev。
| 配置项 | 说明 | 示例 |
|---|---|---|
MONGO_HOST / PORT | MongoDB 地址端口 | 192.168.x.x / 27017 |
MONGO_DATABASE | 数据库名 | deep-research |
MONGO_COLLECTION | 默认集合 | html_md |
RABBITMQ_IP / PORT | RabbitMQ 地址端口 | 5672 |
RABBITMQ_VIRTUAL_HOST | vhost | langwell-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_KEY | Tavily 搜索 API | https://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 传入。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 &
# /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
# 通过 APP_ENV 切换环境,挂载对应 .env 文件
APP_ENV=prod docker compose up -d
APP_ENV=dev docker compose up -d
requirements.txt:pymongo / fastapi / uvicorn / BeautifulSoup4 / pyxxl / pika / openai / minio / markdownify。RABBITMQ_ENABLED 之类的开关字段。MQ 消费者在启动时以 daemon 线程 + try/except 拉起(main.py startup),连不上只记 error 日志、不影响主服务启动,HTTP 接口照常可用。所以 RabbitMQ 可以"不接"照跑,但每次仍会尝试连接并刷错误日志——想彻底静默需改代码在 startup 里跳过消费者启动。