# lis-journals-fetcher > 面向图书馆学领域的多源期刊论文追踪工具,支持 CNKI、人大报刊复印资料、独立网站期刊。自动获取、筛选、总结论文数据。触发方式:说'获取期刊论文'、期刊名+年期、或 /lis-journals-fetcher - Author: xulei-shl - Repository: xulei-shl/lis-scholar-skill-toolkit - Version: 20260209113801 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-09 - Source: https://github.com/xulei-shl/lis-scholar-skill-toolkit - Web: https://mule.run/skillshub/@@xulei-shl/lis-scholar-skill-toolkit~lis-journals-fetcher:20260209113801 --- --- name: lis-journals-fetcher description: "面向图书馆学领域的多源期刊论文追踪工具,支持 CNKI、人大报刊复印资料、独立网站期刊。自动获取、筛选、总结论文数据。触发方式:说'获取期刊论文'、期刊名+年期、或 /lis-journals-fetcher" allowed-tools: "Read, Edit, Write, Bash, Glob, Grep, AskUserQuestion, Task" --- # 多源期刊论文获取工具 支持 CNKI、人大报刊复印资料、独立网站期刊的统一论文获取工具。 ## 概述 读取期刊类型配置,通过 Grep 动态搜索确定期刊类型和来源,根据发行周期和上次获取记录计算目标年期,调用对应的爬虫 Subagent 获取论文数据,自动更新状态。 ## 通用原则 ### 异步并行执行原则 **适用场景**:当任务涉及多个独立操作时(如多期爬取、多期过滤、多期总结),必须使用异步并行执行以提升效率。 **实现方式**:在单条响应消息中发送多个独立的工具调用(Task/Bash),而非顺序发送。 **示例**: ```python # ✅ 正确:单消息并行调用 Task(subagent_type="paper-filter", description="标注2025-11期", ...) Task(subagent_type="paper-filter", description="标注2025-12期", ...) # ❌ 错误:顺序调用(低效) ``` **并行操作清单**: | 步骤 | 操作 | 支持并行 | |------|------|---------| | 步骤 6 | 调用爬虫 Subagent | ✅ 多期并行 | | 步骤 9 | 调用 paper-filter | ✅ 多期并行 | | 步骤 9.2 | 人工修改确认 | ❌ 必须同步(交互式) | | 步骤 9.5 | filter_papers.py | ✅ 多期并行 | | 步骤 10 | paper-summarizer | ✅ 多期并行 | ## 支持的期刊类型 | 类型标识 | 名称 | 期刊数量 | 爬虫方式 | |---------|------|---------|---------| | cnki | CNKI 期刊 | 15 种 | cnki-spider-agent | | rdfybk | 人大报刊复印资料 | 3 种 | rdfybk-spider-agent | | lis | 独立网站期刊 | 1 种 | lis-spider-agent | > 📖 详细的类型配置和 URL 规则,请参见 [reference/journal-types-config.md](reference/journal-types-config.md) ## 触发识别 ### 自然语言触发模式 | 模式类型 | 触发条件 | 示例 | |---------|---------|------| | 通用关键词 | 包含"获取期刊论文"、"下载最新期刊"、"爬取期刊" | "获取期刊论文" | | 期刊名 + 动作 | 期刊名 + "论文/期刊"相关词 | "中国图书馆学报最新论文" | | 年期指定 | 期刊名 + "最新X期"/"第X期"/"202X年第X期" | "图书情报工作第5期" | ### 命令触发模式 ``` /lis-journals-fetcher ``` ## 快速开始 ### 执行流程 ``` 触发(命令/自然语言) ↓ 解析期刊名和年期参数 ↓ 期刊类型识别 → Grep 搜索所有期刊信息文件 ↓ 年期解析 → 已指定: 使用指定年期 / 未指定: 智能推荐年期 ↓ 显示爬取计划(包含推荐理由) ↓ 用户确认 ↓ 前置检查并创建输出目录 ↓ 调用爬虫 Subagent 执行爬取(多期并行) ↓ 自动调用 paper-filter subagent 过滤论文(多期并行) ↓ 人工修改确认(可选) ↓ 调用 filter_papers.py 生成筛选文件(多期并行) ↓ 自动调用 paper-summarizer subagent 生成总结报告(多期并行) ↓ MEMORY.md 更新(条件触发) ↓ 更新状态 + 显示结果总结 ``` ## 工作流程 ### 步骤 1-2:期刊类型识别与选择 #### 步骤 1:读取期刊类型配置 读取 `{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md` #### 步骤 2:期刊类型识别与选择 **使用 Grep 动态搜索所有期刊信息文件**: ```python Grep( pattern=期刊名, path="{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journals-list", glob="*.md", output_mode="files_with_matches" ) ``` **处理结果**: | 匹配数 | 处理方式 | |--------|----------| | 0 个 | 显示完整期刊列表(按类型分组) | | 1 个 | 直接使用该类型 | | 多个 | 显示匹配项,让用户选择类型 | **未指定期刊名时**:使用 `AskUserQuestion` 显示类型选择菜单。 **期刊列表显示**:按发行周期分组,显示"上次获取年期"状态。 ### 步骤 2.5:年期解析 | 输入模式 | 解析逻辑 | 示例 | |---------|---------|------| | "最新X期" | 从当前年倒推X期 | "最新2期" → 2025-5, 2025-6 | | "YYYY年第X期" / "YYYY-X" | 指定年期 | "2025-5" | | "第X期" / "X期" | 当前年份 + 期号 | "第5期" → 2025-5 | | 无年期参数 | 进入步骤3自动计算 | - | ### 步骤 3:智能计算目标年期 根据发行周期、上次获取记录、当前日期智能推荐目标年期。 **核心策略**: | 场景 | 推荐策略 | |------|---------| | 年初(1-2月) | 推荐上年最后一期 | | 月初(1-7号) | 推荐上一期 | | 有上次记录 | 增量推荐 | | 首次爬取 | 推荐上一期 | > 📖 详细推荐策略和算法,请参见 [reference/period-recommendation.md](reference/period-recommendation.md) ### 步骤 4:显示爬取计划 **检查已爬取年期**:在显示计划前,先检查目标年期的 JSON 文件是否已存在。 **核心逻辑**: 1. 遍历目标年期,检查 `outputs/{期刊名}/{年-期}.json` 是否存在 2. 存在时读取文件获取论文数量 3. 显示爬取计划,标注已存在的年期 4. 提供选项:确认执行(覆盖)/ 仅爬取未存在的 / 修改参数 / 取消 **处理选项**: | 选项 | 行为 | |------|------| | 确认执行 | 爬取所有目标年期,覆盖已存在的文件 | | 仅爬取未存在的 | 从目标列表中移除已存在的年期 | | 修改参数 | 返回年期选择步骤 | | 取消 | 取消本次任务 | 使用 `AskUserQuestion` 工具确认。先询问是否获取摘要,再询问是否执行。 ### 步骤 5:前置目录检查 **在执行爬虫前**:检查并创建输出目录。 ```bash [ -d "outputs/{期刊名}" ] || mkdir -p "outputs/{期刊名}" ``` ### 步骤 6:调用爬虫 Subagent 根据期刊类型调用对应的爬虫 Subagent,**直接构造命令而非传递自然语言参数**: ```python # CNKI 期刊 Task(subagent_type="cnki-spider-agent", ...) # 人大报刊复印资料 Task(subagent_type="rdfybk-spider-agent", ...) # 独立网站期刊 Task(subagent_type="lis-spider-agent", ...) ``` **多期并行调用**:在单条消息中并行发送多个 Task 调用。 > 📖 各爬虫 Subagent 详细说明: > - CNKI: [.claude/agents/cnki-spider-agent.md](../../../agents/cnki-spider-agent.md) > - 独立网站: [.claude/agents/lis-spider-agent.md](../../../agents/lis-spider-agent.md) > - 人大报刊: [.claude/agents/rdfybk-spider-agent.md](../../../agents/rdfybk-spider-agent.md) **处理爬取结果**: - 成功:记录成功年期和论文数量 - 空结果:进入回退流程 - 错误:显示错误信息,询问是否继续 ### 步骤 7:回退机制 当目标年期爬取不到(空结果)时,提供选项: - 尝试回退到上一期 - 手动输入年期 - 跳过此期 使用 `AskUserQuestion` 工具交互式处理。 ### 步骤 8:更新状态 爬取成功后,使用 `Edit` 工具更新对应的期刊信息文件中的"上一次获取年期"列。 ### 步骤 9:自动论文过滤 爬取成功后,自动调用 paper-filter subagent 对获取的论文进行智能过滤标注。 ```python Task( subagent_type="paper-filter", description="过滤标注论文", prompt="直接执行论文标注,跳过确认步骤..." ) ``` > 📖 paper-filter subagent 详细说明:参见 [.claude/agents/paper-filter.md](../../../agents/paper-filter.md) ### 步骤 9.2:人工修改确认 > **注意**:此步骤涉及交互式用户输入循环,**不适合并行执行**,必须保持同步等待用户响应。 **数据处理要求**: 1. 使用 Read 工具读取完整的 JSON 文件 2. 解析每篇论文的实际状态(interest_match、match_reasons、relevance_score) 3. 动态生成过滤结果列表(按相关度排序) 4. 正确的编号映射(通过 title 或 pages 定位论文) **核心流程**: ``` 1. 读取 JSON 文件 2. 解析论文状态,按相关度分组排序 3. 显示过滤结果: - 相关论文(按相关度排序) - 不相关论文(按相关度排序) 4. 批量收集用户输入 5. 一次性读写执行批量修改 6. 重新显示修改后结果 ``` **批量修改逻辑**: ```python if titles_to_modify: papers = read_json(file_path) for title in titles_to_modify: paper = find_paper_by_title(papers, title) paper['interest_match'] = not paper['interest_match'] write_json(file_path, papers) ``` **错误处理**: - 标题匹配不到:提示"未找到匹配的论文" - 匹配多篇:提示"请输入更具体的标题" - JSON 格式损坏:提示错误并跳过 ### 步骤 9.5:生成筛选文件 调用 filter_papers.py 脚本生成独立的筛选文件。 ```bash python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/filter_papers.py \ -i outputs/{期刊名}/{年-期}.json ``` **多期并行执行**:在单条消息中并行执行多个 Bash 调用。 ### 步骤 10:自动生成论文总结 筛选文件生成后,自动调用 paper-summarizer subagent 生成结构化的 Markdown 总结报告。 ```python Task( subagent_type="paper-summarizer", description="生成论文总结报告", prompt="读取 outputs/{期刊名}/{年-期}-filtered.json,生成论文总结报告..." ) ``` > 📖 paper-summarizer subagent 详细说明:参见 [.claude/agents/paper-summarizer.md](../../../agents/paper-summarizer.md) ### 步骤 10.2:MEMORY.md 更新(条件触发) **触发条件**:仅当 `user_modified = true` 时执行(即用户在步骤 9.2 中选择了修改过滤标签) **双向检测逻辑**: 检测用户修改类型,分别触发对应的更新模式: ```python # 检测用户修改类型(需要对比修改前后的状态) # 伪代码逻辑: papers_before = load_json(file_path) # paper-filter 标注后的状态 # ... 用户人工修改 ... papers_after = load_json(file_path) # 用户修改后的状态 # 检测"从相关改为不相关"的论文(AI 误判) false_positives = [ p for p_before, p_after in zip(papers_before, papers_after) if p_before['interest_match'] == True and p_after['interest_match'] == False ] # 检测"从不相关改为相关"的论文(AI 漏判) false_negatives = [ p for p_before, p_after in zip(papers_before, papers_after) if p_before['interest_match'] == False and p_after['interest_match'] == True ] ``` **处理策略**: | 检测结果 | 触发操作 | |---------|---------| | 存在误判论文(false_positives) | 调用 memory-updater-agent 模式 D(提取排除关键词) | | 存在漏判论文(false_negatives) | 调用 memory-updater-agent 模式 C(更新关注主题词) | | 两者都存在 | 依次调用模式 D 和模式 C | **调用示例**: ```python # 模式 D:提取排除关键词 Task( subagent_type="memory-updater-agent", description="提取排除关键词", prompt="使用模式 D,从 {期刊名} {年-期}.json 中提取排除关键词并更新 MEMORY.md" ) # 模式 C:更新关注主题词 Task( subagent_type="memory-updater-agent", description="更新 MEMORY.md 研究关键词", prompt="使用模式 C,从 {期刊名} {年-期}.json 中提取关键词并更新 MEMORY.md" ) ``` > 📖 memory-updater skill 详见:[.claude/skills/memory-updater/SKILL.md](../../../skills/memory-updater/SKILL.md) ### 步骤 11:显示结果总结 显示任务统计、论文过滤结果、已保存文件列表。 ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅ 爬取任务完成 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📊 任务统计 ┌─────────────────────────────────────┐ │ 期刊名称 │ 中国图书馆学报 │ │ 类型 │ CNKI │ │ 成功获取 │ 2025-5 (12篇) │ └─────────────────────────────────────┘ 🔍 论文过滤结果 ┌─────────────────────────────────────┐ │ 总论文数 │ 12 篇 │ │ 相关论文 │ 5 篇 ⭐ │ └─────────────────────────────────────┘ 📁 已保存文件: • outputs/中国图书馆学报/2025-5.json (已标注) • outputs/中国图书馆学报/2025-5-filtered.json (筛选后) • outputs/中国图书馆学报/2025-5-summary.md (总结报告) ``` ## 输出格式 **JSON 结果文件** (`outputs/{期刊名}/{年-期}.json`): ```json [ { "year": 2025, "issue": 6, "title": "论文标题", "author": "作者1; 作者2", "pages": "1-10", "abstract_url": "https://...", "abstract": "论文摘要内容..." } ] ``` **paper-filter 添加的字段**: | 字段 | 类型 | 说明 | |------|------|------| | `interest_match` | boolean | 论文是否与用户兴趣相关 | | `match_reasons` | string[] | 匹配的关键词列表 | | `relevance_score` | float | 相关度分数 (0-1) | | `excluded` | boolean | 论文是否因排除规则被过滤(可选) | | `exclude_reasons` | string[] | 触发的排除关键词列表(可选) | ## 错误处理 | 错误类型 | 处理方式 | |----------|----------| | 期刊类型配置文件不存在 | 提示检查路径 `{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md` | | 期刊信息文件不存在 | 提示检查对应的期刊信息文件路径 | | Subagent 执行失败 | 显示错误信息,询问是否继续 | | 网络超时 | 重试 1 次,仍失败则跳过并记录 | | 年期格式解析错误 | 提示检查"上一次获取年期"格式 | ## 常量定义 | 常量 | 值 | |------|-----| | 类型配置路径 | `{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md` | | 期刊信息目录 | `{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journals-list/` | | 年期推荐策略 | `{baseDir}/.claude/skills/cnki-journals-fetcher/reference/period-recommendation.md` | | 筛选脚本路径 | `{baseDir}/.claude/skills/cnki-journals-fetcher/scripts/filter_papers.py` | | 结果输出路径 | `{baseDir}/outputs/{期刊名}/{年-期}.json` | | 超时时间 | 120000ms (2分钟) | ## 扩展性 添加新期刊类型只需 3 步,无需修改主 Skill: 1. **创建期刊信息文件**:`reference/journals-list/{类型}-期刊信息.md` 2. **创建爬虫 Subagent**:`.claude/agents/{类型}-spider-agent.md` 3. **在 journal-types-config.md 添加一行配置** > 📖 详细的扩展步骤,请参见 [reference/journal-types-config.md](reference/journal-types-config.md)