diff --git a/configs/system.yaml b/configs/system.yaml index 94aeb2c..7ca77ae 100644 --- a/configs/system.yaml +++ b/configs/system.yaml @@ -23,6 +23,8 @@ crawler: source_timeout_sec: 7200 # 单源超时秒数(2h) article_delay_sec: 3.0 # 文章间冷却间隔 page_timeout_sec: 45 # 单页加载超时 + http_timeout_sec: 30 # 轻量 HTTP 抓全文单页超时(秒) + http_min_html_len: 2000 # 判定 HTTP 拿到正文的最小 HTML 长度 viewport_width: 1024 viewport_height: 768 user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" @@ -45,7 +47,7 @@ dedup: llm: provider: "deepseek" deepseek_model: "deepseek-v4-flash" - qwen_model: "qwen-plus" + qwen_model: "qwen3.7-flash" timeout_sec: 60 max_attempts: 3 # 单篇总尝试次数(含首次),失败后指数退避重试 max_tokens: 8192 @@ -58,8 +60,9 @@ llm: llm_scenes: translation: # M4:全文英译中 + 投资事件抽取(单次 LLM 调用合并输出) - provider: "deepseek" - model: "deepseek-v4-flash" + #provider: "deepseek" + provider: "dashscope" + model: "qwen3.7-flash" temperature: 0.1 max_tokens: 8192 description: | diff --git a/scheduler/reporter.py b/scheduler/reporter.py index 48c0885..b08f80a 100644 --- a/scheduler/reporter.py +++ b/scheduler/reporter.py @@ -243,7 +243,17 @@ def _load_events_window(now: datetime) -> list[dict]: continue if pt < cutoff: - continue + # publish_time 质量兜底:部分源(zerohedge/cnbc 等)publish_time + # 仅日期(按 00:00 UTC 处理)或美式日期错位(如 09/05 → 5 月 9 日)。 + # 这类文章在报告非 07:00 运行时易被 25h 窗口误伤。若事件文件本身 + # 是窗口内新生成的(mtime ≥ cutoff,即本次管道刚翻译),予以保留。 + # (2026-09-06 空日报事故教训:窗口 articles=0 → AI 摘要为空) + try: + mtime = datetime.fromtimestamp(fp.stat().st_mtime, tz=UTC) + except OSError: + mtime = None + if mtime is None or mtime < cutoff: + continue articles.append(data) except (json.JSONDecodeError, OSError): pass diff --git a/scripts/domestic_crawl_8g.sh b/scripts/domestic_crawl_8g.sh index a8aae9b..79e1763 100755 --- a/scripts/domestic_crawl_8g.sh +++ b/scripts/domestic_crawl_8g.sh @@ -9,7 +9,7 @@ # # 前置条件: # sudo apt install xvfb -# Xvfb :99 -screen 0 1280x1024x24 & # 首次启动 +# Xvfb :99 -screen 0 1280x1024x24 > logs/xvfb.log 2>&1 & # 首次启动 # HTTP 代理 127.0.0.1:3128 已运行(privoxy) # # 用法: @@ -40,9 +40,16 @@ if [ -f .env ]; then fi # ── 启动 Xvfb(如果尚未运行)── +# ⚠️ Xvfb 的 stdin/stdout/stderr 必须脱离本脚本的 fd 并重定向到日志文件: +# 本脚本常被 `bash xx.sh | tee` 管道包裹调用(domestic_full.sh),而 Xvfb +# 是常驻进程(设计为跨运行复用)。若它继承了管道写端,抓取脚本退出后 +# tee 仍永远收不到 EOF → domestic_full.sh 卡在 M1 → [2/2] 管道与日报 +# 永不执行(2026-09-06 早报缺失事故根因)。 if ! pgrep -x "Xvfb" > /dev/null; then LOG "启动 Xvfb 虚拟显示器 :99 ..." - Xvfb :99 -screen 0 1280x1024x24 -ac +extension RANDR & + mkdir -p logs + Xvfb :99 -screen 0 1280x1024x24 -ac +extension RANDR > logs/xvfb.log 2>&1 & + disown 2>/dev/null || true sleep 1 LOG "Xvfb 已启动 (PID: $(pgrep -x Xvfb))" else