# Daily Papers Fetch

> 论文抓取（3 步流水线的第 1 步）。根据 Claude 生成的多样化关键词，执行多源检索、 规范化、去重、排序和基础富化，输出 candidates/source_diagnostics/dedup_stats 供后续 skill 使用。 触发词："论文抓取"、"跑一下论文抓取" 支持多天模式："过去3天论文推荐"、"过去一周论文推荐"、"过去一周的论文"、"抓 3 天的论文"、"最近5天"

- Skill: `chb-learner/daily-papers-fetch` (Agent Skill)
- Install (CLI): `npx skillmds@latest add chb-learner/daily-papers-fetch`
- Raw SKILL.md: https://api.skillmd.com/api/skills/chb-learner/daily-papers-fetch/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: CHB-learner (https://skillmd.com/u/chb-learner)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/chb-learner/daily-papers-fetch

---


> **开始前**: 先说一声 "开始抓取论文 🐕" 并告知今天日期。如果是多天模式，告知抓取范围。

# 论文抓取 (Multi-source Fetch + Dedup + Enrich)

你是 用户的论文抓取系统（3 步流水线的第 1 步）。抓取最新论文 → 打分筛选 → 富化信息 → 保存到临时文件。

## Step 0: 读取共享配置

先读取 `../_shared/user-config.json`，如果 `../_shared/user-config.local.json` 存在，再用它覆盖默认值。

显式生成并在后续统一使用这些变量：

- `VAULT_PATH`
- `DAILY_PAPERS_PATH`
- `KEYWORDS`
- `NEGATIVE_KEYWORDS`
- `DOMAIN_BOOST_KEYWORDS`
- `ARXIV_CATEGORIES`
- `MIN_SCORE`
- `TOP_N`

其中：

- `DAILY_PAPERS_PATH = {VAULT_PATH}/{daily_papers_folder}`
- `DAILY_RUN_DIR = {DAILY_PAPERS_PATH}/{YYYY-MM-DD}`，例如 `Dailypaper/2026-05-20`
- 所有关键词、分类、阈值都以共享配置为准

后续统一以共享配置和上面的变量为准。

## 路径契约（必须）

每日抓取只能写入：

```text
{DAILY_PAPERS_PATH}/{YYYY-MM-DD}/_meta/
```

执行前必须设置：

```bash
DATE_DIR="$(date +%F)"
DAILY_RUN_DIR="{DAILY_PAPERS_PATH}/$DATE_DIR"
META_DIR="$DAILY_RUN_DIR/_meta"
```

禁止创建或写入：

- `{DAILY_PAPERS_PATH}/{月份}/{DD}/_meta`
- `{DAILY_PAPERS_PATH}/{月份}/{MMDD}/_meta`
- 任何 `5月/0520`、`5月/520` 这类目录

如果旧式月份目录已经存在，不要继续写入。若同一天目标目录不存在，先迁移旧目录到 `{DAILY_PAPERS_PATH}/{YYYY-MM-DD}/`；若目标目录已存在，只使用目标目录。

## 解析天数

从用户输入中解析 `--days N` 参数。匹配规则：
- "过去一周"、"最近7天"、"一周的论文" → `--days 7`
- "过去3天"、"最近三天"、"抓3天" → `--days 3`
- "过去两周" → `--days 14`
- 无特殊指定 / "跑一下论文抓取" → 不加 `--days`（默认当天）

将解析出的天数存为变量 `DAYS_ARG`，在后续脚本调用中使用。

## 配置来源

- 默认配置在 `../_shared/user-config.json`
- 个人覆盖配置放在 `../_shared/user-config.local.json`
- 如果两者都存在，以 `local` 为准

## 工作流程

### Phase 1: 多源抓取 + 规范化 + 去重（纯 Python 脚本）

用 `multi_source_fetch.py` 一步完成免费核心源抓取、统一 Paper schema、强 ID 去重、标题相似度去重、排序和诊断。**零 token 消耗。**

```bash
DATE_DIR="$(date +%F)"
DAILY_RUN_DIR="{DAILY_PAPERS_PATH}/$DATE_DIR"
META_DIR="$DAILY_RUN_DIR/_meta"
mkdir -p "$META_DIR"
python3 ~/.claude/skills/daily-papers/multi_source_fetch.py \
  --topic "每日论文" \
  --queries-json '["{Claude生成的英文检索词1}", "{Claude生成的英文检索词2}"]' \
  --since-year {年份下限} \
  --max-results 100 \
  --sources auto \
  --output "$META_DIR/candidates.json"
```

脚本自动完成：
- 查询 arXiv、Semantic Scholar、OpenAlex、Crossref、OpenReview、PubMed、Europe PMC、bioRxiv、medRxiv
- 将来源字段统一为 `Paper` schema
- 按 DOI / arXiv ID / OpenReview ID / PMID / PMCID 合并
- 无强 ID 时按规范化标题、年份接近、作者重叠合并
- 输出 rank_score 排序后的候选

输出文件：
- `$META_DIR/candidates.json`
- `$META_DIR/source_diagnostics.json`
- `$META_DIR/dedup_stats.json`
- `$META_DIR/plan.json`

**检查输出**：确认 `$META_DIR/candidates.json` 存在且包含有效 JSON 数组。如果为空数组或文件不存在，检查 `source_diagnostics.json` 诊断问题。

### Phase 2: 批量富化（enrich_papers.py 脚本）

用 `enrich_papers.py` 脚本一次性富化所有论文。脚本使用 `asyncio` + `curl` 子进程并发请求，纯 regex 解析 HTML，无需 WebFetch。

将候选文件复制/传入富化脚本：

```bash
python3 ~/.claude/skills/daily-papers/enrich_papers.py \
  "$META_DIR/candidates.json" \
  "$META_DIR/enriched.json"
```

注意：使用**文件路径参数**（而非 stdout 重定向），避免 sandbox 环境下 stdout/stderr 混淆。

脚本自动完成以下工作（Semaphore(10) 限制并发，单篇超时 30 秒）：
- 并行抓取 HTML 页面 + PDF 页面
- 从 HTML 提取：figure_url、authors、affiliations、section_headers、captions、has_real_world、method_names、method_summary
- 从 PDF 提取：affiliations（通过 `pdftotext | extract_affiliations.py`）
- 如果 HTML authors 为空，fallback 到 abs 页面 `<meta>` 标签提取 authors/affiliations
- 合并优先级（脚本内部处理）：
  - figure_url: HTML curl
  - affiliations: PDF > HTML > abs fallback > Phase 1 data
  - authors: HTML > abs fallback > Phase 1 data
  - 其他字段: HTML regex 提取

**输出格式**：与输入相同的 JSON 数组，每篇论文增加以下字段：
- `figure_url` (string): 首图 URL
- `affiliations` (string): 机构列表，逗号分隔
- `authors` (string): 作者列表（可能被更完整的来源覆盖）
- `section_headers` (array): 章节标题
- `captions` (array): 图表标题
- `has_real_world` (bool): 是否包含真实实验
- `method_names` (array): 方法名列表
- `method_summary` (string): 方法描述（300-500 字）

## 输出

完成后检查 `$META_DIR/enriched.json` 存在且包含有效 JSON 数组。告知用户：
- 抓取了多少篇论文
- 富化成功多少篇
- 提示运行下一步：`跑一下论文点评`

## 注意事项

- Phase 1 使用 `multi_source_fetch.py` 脚本，**不启动 Task Agent**，零 token 消耗
- Phase 2 使用 `enrich_papers.py` 脚本，同样不启动 Task Agent
- 如果脚本执行失败，检查 stderr 输出诊断问题
- 如果某个来源抓取失败，脚本会在 `source_diagnostics.json` 记录错误并继续处理其他来源
- 如果总论文数不足 20 篇，有多少处理多少
- **不做 git 操作**，不生成推荐文件，只输出 `_meta` JSON

