docs: 文档清理与重构 — 统一为 3 个核心文档
- 删除 5 个过时/残留文档(project_plan/agent_prompt/optimization_plan/report_db_design/deploy/README) - 新建 docs/architecture.md(项目架构:11 包职责+数据模型+配置+产物) - 重写 docs/user-guide.md(CLI 全量+增量/断点续跑+MCP+FAQ) - 重写 README.md(精简入口+文档索引) - 更新 continuation.md(追加本次记录) - 更新 .gitignore(排除 data/* 运行产物)
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""configs 配置包:提供 configs/*.yaml 的加载能力。"""
|
||||
@@ -0,0 +1,133 @@
|
||||
# =============================================================================
|
||||
# configs/llm_models.yaml —— 大模型使用场景配置
|
||||
#
|
||||
# 本文件集中配置本项目所有调用 AI 大模型的地方,每个场景可独立指定
|
||||
# provider(厂商/服务类型)与 model(模型名),互不影响、单独切换。
|
||||
#
|
||||
# ── 配置优先级(从高到低)──────────────────────────────────────────────────────
|
||||
# 1. 代码 / 命令行显式参数(如 --provider qwen --model qwen-plus)
|
||||
# 2. 本文件 scenes.<场景>.xxx
|
||||
# 3. 环境变量 / .env(LLM_PROVIDER、DEEPSEEK_MODEL 等,向后兼容)
|
||||
# 4. 代码内置默认值
|
||||
#
|
||||
# ── 规则 ─────────────────────────────────────────────────────────────────────
|
||||
# · provider 取值:
|
||||
# 对话大模型: deepseek | qwen(OpenAI 兼容 chat 接口)
|
||||
# 向量嵌入模型: dashscope | local-bge(仅 embedding 场景)
|
||||
# · model 留空 = 该场景不覆盖模型 → 回退 .env(如 DEEPSEEK_MODEL / QWEN_MODEL /
|
||||
# LLM_MODEL);若全部缺失则直接报错,绝不静默使用内置默认模型。
|
||||
# · api_key_env / base_url_env 为可选字段,填写存放 API Key / 服务地址的
|
||||
# 环境变量名;API Key 一律放 .env,禁止写入本文件(安全规范)。
|
||||
# · 修改后无需重启常驻服务即可生效(每次调用重新读取;如需热更新缓存可重启)。
|
||||
# =============================================================================
|
||||
|
||||
# ---- 全局默认参数(各场景可覆盖;低于 .env,高于代码内置默认)----
|
||||
defaults:
|
||||
timeout_sec: 60
|
||||
temperature: 0.1
|
||||
|
||||
scenes:
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 1: 投资事件抽取(M4 核心)
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:对每条唯一新闻调用大模型,抽取结构化投资事件
|
||||
# (stock_codes / company_names / industries / sentiment / importance /
|
||||
# event_type / summary),输出严格 JSON,经 Pydantic 校验后落盘。
|
||||
# 调用方: llm/extractor.py、scripts/run_event_extraction.py、
|
||||
# scheduler/pipeline.py 的 llm 步骤。
|
||||
# 频率:每日数百~数千篇;建议异步并发(--concurrency,默认 3)。
|
||||
# 使用方式:
|
||||
# uv run a-share events # 读本场景配置
|
||||
# uv run a-share events --provider qwen # CLI 临时覆盖 provider
|
||||
# uv run a-share events --model qwen-max # CLI 临时覆盖模型
|
||||
# 对模型的要求:
|
||||
# · 必须支持 OpenAI 兼容 chat/completions 接口;
|
||||
# · 必须支持 JSON 结构化输出(response_format=json_object,硬性要求);
|
||||
# · 上下文窗口 ≥ 16K tokens(单篇正文最多截断到 8000 字符);
|
||||
# · 中文理解能力强,能区分 A 股事件类型(业绩预告/投资并购/宏观政策等 23 类);
|
||||
# · 低 temperature(0.1)保证抽取稳定,避免字段抖动。
|
||||
# 建议模型: deepseek-v4-flash(生产实测) / deepseek-chat / qwen-plus / qwen-max
|
||||
event_extraction:
|
||||
provider: qwen # 建议 deepseek | qwen;留空则回退 .env 的 LLM_PROVIDER
|
||||
model: qwen3.7-flash # 留空则回退 .env(DEEPSEEK_MODEL → LLM_MODEL)
|
||||
api_key_env: DASHSCOPE_API_KEY # 例如: DEEPSEEK_API_KEY / QWEN_API_KEY / DASHSCOPE_API_KEY
|
||||
base_url_env: QWEN_BASE_URL # 例如: DEEPSEEK_BASE_URL / QWEN_BASE_URL
|
||||
temperature: 0.1
|
||||
timeout_sec: 60
|
||||
max_attempts: 3 # 单篇解析失败的最大重试次数
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 2: 日报 AI 摘要
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:每天汇总「新闻联播 + 过去 24h 高重要度新闻 + 近 N 日重要公告/调研」,
|
||||
# 生成 500 字以内的日报要点摘要,渲染进 HTML 日报。
|
||||
# 调用方: scheduler/reporter.py 的 _generate_ai_summary → _llm_summarize。
|
||||
# 频率:每天 1 次(07:00 定时任务,与 pipeline 同批)。
|
||||
# 使用方式:无需手动触发,定时任务自动执行;失败自动降级(日报留空,不影响入库)。
|
||||
# 对模型的要求:
|
||||
# · OpenAI 兼容 chat 接口(不需要 JSON 输出);
|
||||
# · 输出长度 ≥ 1500 tokens(max_tokens=1500,输出超长会被截断并记 WARNING);
|
||||
# · 中文摘要能力强、要点化输出稳定(每条一行,以 "- " 开头);
|
||||
# · 上下文窗口 ≥ 8K tokens(素材按 3000 字符/块分块,多块先分段再合并);
|
||||
# · temperature 0.3 左右,兼顾稳定与表达;网络失败按指数退避重试 3 次。
|
||||
# · 输出长度需求:分段摘要约 800 tokens、合并摘要约 1500 tokens(代码内置,
|
||||
# 不在本文件配置),模型应能稳定输出 1500+ tokens 的中文要点。
|
||||
# 建议模型: deepseek-v4-flash(生产实测) / deepseek-chat / qwen-plus
|
||||
daily_report:
|
||||
provider: # 建议 deepseek | qwen;留空则回退 .env 的 LLM_PROVIDER
|
||||
model:
|
||||
api_key_env:
|
||||
base_url_env:
|
||||
temperature: 0.3
|
||||
timeout_sec: 60
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 3: 个股 AI 要点分析
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:针对观察清单中的单只股票,汇总其近期公告/调研/新闻/互动问答,
|
||||
# 生成 5-8 条要点分析,渲染进个股日报。
|
||||
# 调用方: scheduler/stock_reporter.py 的 _generate_ai_summary。
|
||||
# 频率:每交易日 1 次(07:30),对 watchlist 内每只股票各调用一次。
|
||||
# 使用方式:定时任务自动执行;单次失败不影响其他股票(该股显示"AI 摘要暂不可用")。
|
||||
# 对模型的要求:
|
||||
# · OpenAI 兼容 chat 接口(不需要 JSON 输出);
|
||||
# · 输出长度 ≥ 500 tokens(max_tokens=500);
|
||||
# · 中文要点分析能力,输入素材最多 3500 字符(公告+调研+新闻+互动问答);
|
||||
# · temperature 0.3 左右。
|
||||
# · 输出长度需求:约 500 tokens(代码内置,不在本文件配置)。
|
||||
# 建议模型: deepseek-v4-flash(生产实测) / deepseek-chat / qwen-plus
|
||||
stock_report:
|
||||
provider: # 建议 deepseek | qwen;留空则回退 .env 的 LLM_PROVIDER
|
||||
model:
|
||||
api_key_env:
|
||||
base_url_env:
|
||||
temperature: 0.3
|
||||
timeout_sec: 60
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 4: 文本向量化 Embedding(新闻/事件入库 + 语义检索)
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:把新闻正文/事件文本转为向量,写入 Qdrant 知识库;检索时对查询文本
|
||||
# 同样向量化后做相似度搜索。M5 入库、MCP 检索、pipeline 均复用本场景。
|
||||
# 调用方: embedding/remote.py(远程)、embedding/local.py(本地)、
|
||||
# embedding/factory.py、scripts/run_embedding.py、mcp_server/tools.py。
|
||||
# 使用方式:
|
||||
# uv run a-share embed # 读本场景配置
|
||||
# uv run a-share embed --provider local-bge # 临时切换本地模型
|
||||
# 注意:这是「嵌入模型」而非对话大模型,二选一:
|
||||
# · provider: dashscope → 阿里百炼 text-embedding-v3(远程,需 API key);
|
||||
# · provider: local-bge → 本地 BGE-M3(离线,需 uv sync --extra
|
||||
# local-embedding,首次加载约 2.3GB)。
|
||||
# 对模型的要求:
|
||||
# · 输出固定维度向量(本项目默认 1024 维,DashScope 与本地 BGE-M3 兼容);
|
||||
# · 中文语义匹配效果好,支持 batch 输入(单批上限 batch_limit 条);
|
||||
# · 远程需 OpenAI 兼容 embeddings 接口。
|
||||
# 建议模型: text-embedding-v3(远程) / BAAI/bge-m3(本地)
|
||||
embedding:
|
||||
provider: # 建议 dashscope | local-bge;留空则回退 .env 的 EMBEDDING_PROVIDER
|
||||
model: # 留空则回退 .env(DASHSCOPE_EMBEDDING_MODEL / LOCAL_EMBEDDING_MODEL)
|
||||
api_key_env: # 例如: DASHSCOPE_EMBEDDING_API_KEY / DASHSCOPE_API_KEY
|
||||
base_url_env: # 例如: DASHSCOPE_EMBEDDING_BASE_URL
|
||||
timeout_sec: 60
|
||||
max_attempts: 3 # 单批请求失败重试次数
|
||||
batch_limit: 10 # 单批最大条数(百炼实测上限 10,勿调大)
|
||||
@@ -0,0 +1,133 @@
|
||||
# =============================================================================
|
||||
# configs/llm_models.yaml —— 大模型使用场景配置
|
||||
#
|
||||
# 本文件集中配置本项目所有调用 AI 大模型的地方,每个场景可独立指定
|
||||
# provider(厂商/服务类型)与 model(模型名),互不影响、单独切换。
|
||||
#
|
||||
# ── 配置优先级(从高到低)──────────────────────────────────────────────────────
|
||||
# 1. 代码 / 命令行显式参数(如 --provider qwen --model qwen-plus)
|
||||
# 2. 本文件 scenes.<场景>.xxx
|
||||
# 3. 环境变量 / .env(LLM_PROVIDER、DEEPSEEK_MODEL 等,向后兼容)
|
||||
# 4. 代码内置默认值
|
||||
#
|
||||
# ── 规则 ─────────────────────────────────────────────────────────────────────
|
||||
# · provider 取值:
|
||||
# 对话大模型: deepseek | qwen(OpenAI 兼容 chat 接口)
|
||||
# 向量嵌入模型: dashscope | local-bge(仅 embedding 场景)
|
||||
# · model 留空 = 该场景不覆盖模型 → 回退 .env(如 DEEPSEEK_MODEL / QWEN_MODEL /
|
||||
# LLM_MODEL);若全部缺失则直接报错,绝不静默使用内置默认模型。
|
||||
# · api_key_env / base_url_env 为可选字段,填写存放 API Key / 服务地址的
|
||||
# 环境变量名;API Key 一律放 .env,禁止写入本文件(安全规范)。
|
||||
# · 修改后无需重启常驻服务即可生效(每次调用重新读取;如需热更新缓存可重启)。
|
||||
# =============================================================================
|
||||
|
||||
# ---- 全局默认参数(各场景可覆盖;低于 .env,高于代码内置默认)----
|
||||
defaults:
|
||||
timeout_sec: 60
|
||||
temperature: 0.1
|
||||
|
||||
scenes:
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 1: 投资事件抽取(M4 核心)
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:对每条唯一新闻调用大模型,抽取结构化投资事件
|
||||
# (stock_codes / company_names / industries / sentiment / importance /
|
||||
# event_type / summary),输出严格 JSON,经 Pydantic 校验后落盘。
|
||||
# 调用方: llm/extractor.py、scripts/run_event_extraction.py、
|
||||
# scheduler/pipeline.py 的 llm 步骤。
|
||||
# 频率:每日数百~数千篇;建议异步并发(--concurrency,默认 3)。
|
||||
# 使用方式:
|
||||
# uv run a-share events # 读本场景配置
|
||||
# uv run a-share events --provider qwen # CLI 临时覆盖 provider
|
||||
# uv run a-share events --model qwen-max # CLI 临时覆盖模型
|
||||
# 对模型的要求:
|
||||
# · 必须支持 OpenAI 兼容 chat/completions 接口;
|
||||
# · 必须支持 JSON 结构化输出(response_format=json_object,硬性要求);
|
||||
# · 上下文窗口 ≥ 16K tokens(单篇正文最多截断到 8000 字符);
|
||||
# · 中文理解能力强,能区分 A 股事件类型(业绩预告/投资并购/宏观政策等 23 类);
|
||||
# · 低 temperature(0.1)保证抽取稳定,避免字段抖动。
|
||||
# 建议模型: deepseek-v4-flash(生产实测) / deepseek-chat / qwen-plus / qwen-max
|
||||
event_extraction:
|
||||
provider: qwen # 建议 deepseek | qwen;留空则回退 .env 的 LLM_PROVIDER
|
||||
model: qwen3.7-flash # 留空则回退 .env(DEEPSEEK_MODEL → LLM_MODEL)
|
||||
api_key_env: DASHSCOPE_API_KEY # 例如: DEEPSEEK_API_KEY / QWEN_API_KEY / DASHSCOPE_API_KEY
|
||||
base_url_env: QWEN_BASE_URL # 例如: DEEPSEEK_BASE_URL / QWEN_BASE_URL
|
||||
temperature: 0.1
|
||||
timeout_sec: 60
|
||||
max_attempts: 3 # 单篇解析失败的最大重试次数
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 2: 日报 AI 摘要
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:每天汇总「新闻联播 + 过去 24h 高重要度新闻 + 近 N 日重要公告/调研」,
|
||||
# 生成 500 字以内的日报要点摘要,渲染进 HTML 日报。
|
||||
# 调用方: scheduler/reporter.py 的 _generate_ai_summary → _llm_summarize。
|
||||
# 频率:每天 1 次(07:00 定时任务,与 pipeline 同批)。
|
||||
# 使用方式:无需手动触发,定时任务自动执行;失败自动降级(日报留空,不影响入库)。
|
||||
# 对模型的要求:
|
||||
# · OpenAI 兼容 chat 接口(不需要 JSON 输出);
|
||||
# · 输出长度 ≥ 1500 tokens(max_tokens=1500,输出超长会被截断并记 WARNING);
|
||||
# · 中文摘要能力强、要点化输出稳定(每条一行,以 "- " 开头);
|
||||
# · 上下文窗口 ≥ 8K tokens(素材按 3000 字符/块分块,多块先分段再合并);
|
||||
# · temperature 0.3 左右,兼顾稳定与表达;网络失败按指数退避重试 3 次。
|
||||
# · 输出长度需求:分段摘要约 800 tokens、合并摘要约 1500 tokens(代码内置,
|
||||
# 不在本文件配置),模型应能稳定输出 1500+ tokens 的中文要点。
|
||||
# 建议模型: deepseek-v4-flash(生产实测) / deepseek-chat / qwen-plus
|
||||
daily_report:
|
||||
provider: deepseek # 建议 deepseek | qwen;留空则回退 .env 的 LLM_PROVIDER
|
||||
model: deepseek-v4-flash
|
||||
api_key_env: DEEPSEEK_API_KEY
|
||||
base_url_env: DEEPSEEK_BASE_URL
|
||||
temperature: 0.3
|
||||
timeout_sec: 60
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 3: 个股 AI 要点分析
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:针对观察清单中的单只股票,汇总其近期公告/调研/新闻/互动问答,
|
||||
# 生成 5-8 条要点分析,渲染进个股日报。
|
||||
# 调用方: scheduler/stock_reporter.py 的 _generate_ai_summary。
|
||||
# 频率:每交易日 1 次(07:30),对 watchlist 内每只股票各调用一次。
|
||||
# 使用方式:定时任务自动执行;单次失败不影响其他股票(该股显示"AI 摘要暂不可用")。
|
||||
# 对模型的要求:
|
||||
# · OpenAI 兼容 chat 接口(不需要 JSON 输出);
|
||||
# · 输出长度 ≥ 500 tokens(max_tokens=500);
|
||||
# · 中文要点分析能力,输入素材最多 3500 字符(公告+调研+新闻+互动问答);
|
||||
# · temperature 0.3 左右。
|
||||
# · 输出长度需求:约 500 tokens(代码内置,不在本文件配置)。
|
||||
# 建议模型: deepseek-v4-flash(生产实测) / deepseek-chat / qwen-plus
|
||||
stock_report:
|
||||
provider: # 建议 deepseek | qwen;留空则回退 .env 的 LLM_PROVIDER
|
||||
model:
|
||||
api_key_env:
|
||||
base_url_env:
|
||||
temperature: 0.3
|
||||
timeout_sec: 60
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 场景 4: 文本向量化 Embedding(新闻/事件入库 + 语义检索)
|
||||
# ------------------------------------------------------------------------- #
|
||||
# 用途:把新闻正文/事件文本转为向量,写入 Qdrant 知识库;检索时对查询文本
|
||||
# 同样向量化后做相似度搜索。M5 入库、MCP 检索、pipeline 均复用本场景。
|
||||
# 调用方: embedding/remote.py(远程)、embedding/local.py(本地)、
|
||||
# embedding/factory.py、scripts/run_embedding.py、mcp_server/tools.py。
|
||||
# 使用方式:
|
||||
# uv run a-share embed # 读本场景配置
|
||||
# uv run a-share embed --provider local-bge # 临时切换本地模型
|
||||
# 注意:这是「嵌入模型」而非对话大模型,二选一:
|
||||
# · provider: dashscope → 阿里百炼 text-embedding-v3(远程,需 API key);
|
||||
# · provider: local-bge → 本地 BGE-M3(离线,需 uv sync --extra
|
||||
# local-embedding,首次加载约 2.3GB)。
|
||||
# 对模型的要求:
|
||||
# · 输出固定维度向量(本项目默认 1024 维,DashScope 与本地 BGE-M3 兼容);
|
||||
# · 中文语义匹配效果好,支持 batch 输入(单批上限 batch_limit 条);
|
||||
# · 远程需 OpenAI 兼容 embeddings 接口。
|
||||
# 建议模型: text-embedding-v3(远程) / BAAI/bge-m3(本地)
|
||||
embedding:
|
||||
provider: # 建议 dashscope | local-bge;留空则回退 .env 的 EMBEDDING_PROVIDER
|
||||
model: # 留空则回退 .env(DASHSCOPE_EMBEDDING_MODEL / LOCAL_EMBEDDING_MODEL)
|
||||
api_key_env: # 例如: DASHSCOPE_EMBEDDING_API_KEY / DASHSCOPE_API_KEY
|
||||
base_url_env: # 例如: DASHSCOPE_EMBEDDING_BASE_URL
|
||||
timeout_sec: 60
|
||||
max_attempts: 3 # 单批请求失败重试次数
|
||||
batch_limit: 10 # 单批最大条数(百炼实测上限 10,勿调大)
|
||||
@@ -0,0 +1,69 @@
|
||||
"""configs/ 目录下 YAML 配置加载器。
|
||||
|
||||
目前支持加载 configs/llm_models.yaml 的场景配置(scenes.<scene>)。
|
||||
|
||||
配置优先级(从高到低):
|
||||
1. 代码 / 命令行显式参数(如 --provider qwen --model qwen-plus)
|
||||
2. 本文件 YAML 场景配置(scenes.<scene>)
|
||||
3. 环境变量 / .env(LLM_PROVIDER、DEEPSEEK_MODEL 等,向后兼容)
|
||||
4. 代码内置默认值
|
||||
|
||||
说明:API Key 一律放 .env,本文件只保存环境变量名(api_key_env),禁止写密钥。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
|
||||
from loguru import logger
|
||||
|
||||
DEFAULT_CONFIG_PATH = Path("configs/llm_models.yaml")
|
||||
|
||||
|
||||
@lru_cache(maxsize=8)
|
||||
def _load_yaml(path: Path) -> dict:
|
||||
"""读取 YAML 文件为 dict;文件缺失或解析失败返回空 dict(走兜底配置)。"""
|
||||
if not path.is_file():
|
||||
logger.debug("配置文件不存在,使用内置/环境变量兜底: {}", path)
|
||||
return {}
|
||||
try:
|
||||
import yaml
|
||||
|
||||
data = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
|
||||
except Exception as e: # noqa: BLE001 - YAML 语法错误等
|
||||
logger.error("解析 {} 失败: {}", path, e)
|
||||
return {}
|
||||
return data if isinstance(data, dict) else {}
|
||||
|
||||
|
||||
def load_scene_config(scene: str) -> dict:
|
||||
"""读取 llm_models.yaml 中 scenes.<scene> 的配置 dict。
|
||||
|
||||
场景不存在或未配置时返回空 dict(调用方回退 .env / 内置默认)。
|
||||
scene 为空字符串同样返回空 dict。
|
||||
"""
|
||||
if not scene:
|
||||
return {}
|
||||
data = _load_yaml(DEFAULT_CONFIG_PATH)
|
||||
scenes = data.get("scenes") or {}
|
||||
cfg = scenes.get(scene)
|
||||
if cfg is None:
|
||||
logger.debug("llm_models.yaml 未配置场景 {!r},使用 .env 兜底", scene)
|
||||
return {}
|
||||
if not isinstance(cfg, dict):
|
||||
logger.warning("llm_models.yaml 场景 {!r} 应为 map,已忽略", scene)
|
||||
return {}
|
||||
return cfg
|
||||
|
||||
|
||||
def load_defaults() -> dict:
|
||||
"""读取 llm_models.yaml 顶层 defaults(全局默认参数)。"""
|
||||
data = _load_yaml(DEFAULT_CONFIG_PATH)
|
||||
d = data.get("defaults") or {}
|
||||
return d if isinstance(d, dict) else {}
|
||||
|
||||
|
||||
def clear_cache() -> None:
|
||||
"""清空 YAML 缓存(测试或热更新配置时使用)。"""
|
||||
_load_yaml.cache_clear()
|
||||
@@ -0,0 +1,218 @@
|
||||
# A 股新闻源配置(M1)
|
||||
# ============================================================
|
||||
# 文档:
|
||||
# - id: 短标识,用作目录名(小写字母/数字/下划线)
|
||||
# - name: 中文名,用于日志与展示
|
||||
# - homepage: 列表/首页 URL,抓取入口
|
||||
# - article_url_pattern: 正则,从首页所有链接中筛选文章 URL
|
||||
# - article_link_selector: 可选 CSS,优先在该选择器内查链接(留空=全页)
|
||||
# - js_render: 是否需要 JS 渲染(动态站点必须 true)
|
||||
# - wait_for: 可选 CSS,等待元素出现(JS 渲染时建议设置)
|
||||
# - max_articles_per_run: 单次抓取上限,M1 阶段建议 ≤ 30
|
||||
# ============================================================
|
||||
|
||||
settings:
|
||||
concurrency: 3 # 并发抓取上限(用户决策:3)
|
||||
retry_max_attempts: 3
|
||||
retry_min_wait_sec: 1.0
|
||||
retry_max_wait_sec: 10.0
|
||||
headless: true
|
||||
output_root: data/raw
|
||||
|
||||
sources:
|
||||
# ---- 1. 财联社(深度频道)----
|
||||
- id: cls
|
||||
name: 财联社
|
||||
enabled: true
|
||||
homepage: https://www.cls.cn/depth?id=1000
|
||||
article_url_pattern: '^https?://www\.cls\.cn/detail/\d+$'
|
||||
article_link_selector: null
|
||||
js_render: true
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.cls.cn/depth?id=1003
|
||||
- https://www.cls.cn/depth?id=1007
|
||||
- https://www.cls.cn/depth?id=1035
|
||||
- https://www.cls.cn/depth?id=1032
|
||||
- https://www.cls.cn/depth?id=1005
|
||||
|
||||
# ---- 2. 东方财富(财经频道)----
|
||||
- id: eastmoney
|
||||
name: 东方财富
|
||||
enabled: true
|
||||
homepage: https://finance.eastmoney.com/
|
||||
article_url_pattern: '^https?://finance\.eastmoney\.com/a/\d+\.html$'
|
||||
article_link_selector: null
|
||||
js_render: true
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
|
||||
# ---- 3. 新浪财经 ----
|
||||
- id: sina
|
||||
name: 新浪财经
|
||||
enabled: true
|
||||
homepage: https://finance.sina.com.cn/
|
||||
# 新浪文章 URL 形如 https://finance.sina.com.cn/stock/.../doc-xxx.shtml
|
||||
article_url_pattern: '^https?://(finance|cj)\.sina\.com\.cn/.+/doc-[a-z0-9]+\.s?html$'
|
||||
article_link_selector: null
|
||||
js_render: false
|
||||
wait_for: null
|
||||
page_timeout_ms: 20000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://finance.sina.com.cn/stock/newstock/
|
||||
- https://finance.sina.com.cn/stock/
|
||||
- https://finance.sina.com.cn/forex/
|
||||
- https://finance.sina.com.cn/stock/hkstock/
|
||||
- https://finance.sina.com.cn/stock/usstock/
|
||||
|
||||
# ---- 4. 证券时报 ----
|
||||
- id: stcn
|
||||
name: 证券时报
|
||||
enabled: true
|
||||
homepage: https://www.stcn.com/article/list/yw.html
|
||||
article_url_pattern: '^https?://www\.stcn\.com/article/detail/\d+\.html$'
|
||||
article_link_selector: null
|
||||
js_render: true
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.stcn.com/article/list/xw.html
|
||||
- https://www.stcn.com/article/list/finance.html
|
||||
- https://www.stcn.com/article/list/gd.html
|
||||
|
||||
# ---- 5. 第一财经 ----
|
||||
- id: yicai
|
||||
name: 第一财经
|
||||
enabled: true
|
||||
homepage: https://www.yicai.com/news/
|
||||
article_url_pattern: '^https?://www\.yicai\.com/(news|brief)/\d+\.html$'
|
||||
article_link_selector: null
|
||||
js_render: true
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.yicai.com/brief/
|
||||
|
||||
# ---- 6. 华尔街见闻 ----
|
||||
- id: wallstreetcn
|
||||
name: 华尔街见闻
|
||||
enabled: true
|
||||
# 注意: 该站为 React SPA,js_render 触发反爬拦截(Crawl4AI 内部错误),
|
||||
# 非 JS 模式下 Crawl4AI 可抓取首页链接但文章正文提取为空。
|
||||
# TODO: 研究通过 wallstreetcn API 或 RSS 获取全文
|
||||
homepage: https://wallstreetcn.com/news/global
|
||||
article_url_pattern: '^https?://wallstreetcn\.com/(articles|livenews)/\d+'
|
||||
js_render: false
|
||||
wait_for: null
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://wallstreetcn.com/live/global
|
||||
|
||||
# ---- 7. 新华网 ----
|
||||
- id: newscn
|
||||
name: 新华网
|
||||
enabled: true
|
||||
homepage: https://www.news.cn/finance/
|
||||
article_url_pattern: '^https?://www\.news\.cn/finance/\d+'
|
||||
js_render: false
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.news.cn/money/yw/index.html
|
||||
|
||||
# ---- 8. 中国经济网 ----
|
||||
- id: cecn
|
||||
name: 中国经济网
|
||||
enabled: true
|
||||
homepage: http://finance.ce.cn/
|
||||
article_url_pattern: '^https?://[a-z0-9]+\.ce\.cn/.+/t\d{8}_\d+\.shtml$'
|
||||
js_render: false
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- http://finance.ce.cn/rolling/index.shtml
|
||||
|
||||
# ---- 9. 中新经纬 ----
|
||||
- id: jwview
|
||||
name: 中新经纬
|
||||
enabled: true
|
||||
homepage: https://www.jwview.com/jr.html
|
||||
article_url_pattern: '^https?://www\.jwview\.com/jingwei/html/\d{2}-\d{2}/\d+'
|
||||
js_render: false
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.jwview.com/kb.html
|
||||
|
||||
# ---- 10. 中国证券网 ----
|
||||
- id: cnstock
|
||||
name: 中国证券网
|
||||
enabled: true
|
||||
homepage: https://www.cnstock.com/channel/10011
|
||||
article_url_pattern: '^https?://www\.cnstock\.com/commonDetail/\d+'
|
||||
js_render: false
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.cnstock.com/fastNews/10004
|
||||
|
||||
# ---- 11. 中证券网 ----
|
||||
- id: cscn
|
||||
name: 中证券网
|
||||
enabled: true
|
||||
homepage: https://www.cs.com.cn/yaowen.html
|
||||
article_url_pattern: '^https?://www\.cs\.com\.cn/xwzx/\d{2}/\d{4}/\d{2}/\d+'
|
||||
js_render: false
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.cs.com.cn/gongsi.html
|
||||
|
||||
# ---- 12. 证券日报 ----
|
||||
- id: zqrb
|
||||
name: 证券日报
|
||||
enabled: true
|
||||
homepage: http://www.zqrb.cn/finance/index.html
|
||||
# zqrb URL 包含日期: /gscy/gongsi/2026-06-17/A1781692801973.html
|
||||
# 限制只匹配 2025 年后的文章,避免抓取到 2022 年旧闻
|
||||
article_url_pattern: '^https?://www\.zqrb\.cn/(?:gscy/gongsi|finance)/(?:202[5-9]|203\d)-\d{2}-\d{2}/'
|
||||
js_render: false
|
||||
wait_for: "css:body"
|
||||
page_timeout_ms: 30000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- http://www.zqrb.cn/finance/hongguanjingji/index.html
|
||||
- http://www.zqrb.cn/finance/guojijingji/index.html
|
||||
|
||||
# ---- 13. 经济观察网 ----
|
||||
- id: eeo
|
||||
name: 经济观察网
|
||||
enabled: true
|
||||
homepage: https://www.eeo.com.cn/
|
||||
article_url_pattern: '^https?://www\.eeo\.com\.cn/\d{4}/\d{4}/\d+\.shtml$'
|
||||
js_render: false
|
||||
page_timeout_ms: 60000
|
||||
max_articles_per_run: 20
|
||||
extra_homepages:
|
||||
- https://www.eeo.com.cn/jg/kuaixun/
|
||||
|
||||
# ---- 14. 新闻联播 (API, 不走 Playwright) ----
|
||||
- id: xwlb
|
||||
name: 新闻联播
|
||||
enabled: true
|
||||
homepage: https://api.doorcome.cn/api/xwlbFine/ # dummy, 满足模型校验
|
||||
article_url_pattern: '^xwlb://' # dummy, 不会被 crawler 处理
|
||||
js_render: false
|
||||
max_articles_per_run: 25
|
||||
@@ -0,0 +1,80 @@
|
||||
# cninfo 公告关注列表
|
||||
# code: 6 位股票代码
|
||||
# name: 公司简称
|
||||
# note: 可选备注
|
||||
# orgId: cninfo 机构 ID(从 cninfo 搜索框输入代码后 URL 中获取)
|
||||
watchlist:
|
||||
- code: "000792"
|
||||
name: "盐湖股份"
|
||||
note: "盐湖提锂"
|
||||
orgId: "gssz0000792"
|
||||
|
||||
- code: "300316"
|
||||
name: "晶盛机电"
|
||||
note: ""
|
||||
orgId: "9900022122"
|
||||
|
||||
- code: "688556"
|
||||
name: "高测股份"
|
||||
note: ""
|
||||
orgId: "gfbj0834278"
|
||||
|
||||
- code: "688005"
|
||||
name: "容百科技"
|
||||
note: ""
|
||||
orgId: "9900038937"
|
||||
|
||||
- code: "300124"
|
||||
name: "汇川技术"
|
||||
note: ""
|
||||
orgId: "9900012527"
|
||||
|
||||
- code: "002241"
|
||||
name: "歌尔股份"
|
||||
note: ""
|
||||
orgId: "9900004688"
|
||||
|
||||
- code: "600900"
|
||||
name: "长江电力"
|
||||
note: ""
|
||||
orgId: "gssh0600900"
|
||||
|
||||
- code: "601126"
|
||||
name: "四方股份"
|
||||
note: ""
|
||||
orgId: "9900016847"
|
||||
|
||||
- code: "600089"
|
||||
name: "特变电工"
|
||||
note: ""
|
||||
orgId: "gssh0600089"
|
||||
|
||||
- code: "601179"
|
||||
name: "中国西电"
|
||||
note: ""
|
||||
orgId: "9900010350"
|
||||
|
||||
- code: "688676"
|
||||
name: "金盘科技"
|
||||
note: ""
|
||||
orgId: "9900044215"
|
||||
|
||||
- code: "688469"
|
||||
name: "芯联集成"
|
||||
note: ""
|
||||
orgId: "9900053045"
|
||||
|
||||
- code: "002129"
|
||||
name: "TCL中环"
|
||||
note: ""
|
||||
orgId: "9900002703"
|
||||
|
||||
- code: "600460"
|
||||
name: "士兰微"
|
||||
note: ""
|
||||
orgId: "gssh0600460"
|
||||
|
||||
- code: "601668"
|
||||
name: "中国建筑"
|
||||
note: ""
|
||||
orgId: "9900005970"
|
||||
Reference in New Issue
Block a user