xulei-shl

lis-journals-fetcher

0
0
# Install this skill:
npx skills add xulei-shl/cnki-journal-fetcher --skill "lis-journals-fetcher"

Install specific skill from multi-skill repository

# Description

面向图书馆学领域的多源期刊论文追踪工具,支持 CNKI、人大报刊复印资料、独立网站期刊。自动获取、筛选、总结论文数据。触发方式:说'获取期刊论文'、期刊名+年期、或 /lis-journals-fetcher

# SKILL.md


name: lis-journals-fetcher
description: "面向图书馆学领域的多源期刊论文追踪工具,支持 CNKI、人大报刊复印资料、独立网站期刊。自动获取、筛选、总结论文数据。触发方式:说'获取期刊论文'、期刊名+年期、或 /lis-journals-fetcher"
allowed-tools: "Read, Edit, Write, Bash, Glob, Grep, AskUserQuestion, Task"


多源期刊论文获取工具

支持 CNKI、人大报刊复印资料、独立网站期刊的统一论文获取工具。

概述

读取期刊类型配置,通过 Grep 动态搜索确定期刊类型和来源,根据发行周期和上次获取记录计算目标年期,调用对应的爬虫 Subagent 获取论文数据,自动更新状态。

支持的期刊类型

类型标识 名称 期刊数量 爬虫方式
cnki CNKI 期刊 15 种 cnki-spider-agent
rdfybk 人大报刊复印资料 3 种 rdfybk-spider-agent
lis 独立网站期刊 1 种 lis-spider-agent

📖 详细的类型配置和 URL 规则,请参见 reference/journal-types-config.md

触发识别

自然语言触发模式

当用户输入包含以下模式时,自动触发本 skill:

模式类型 触发条件 示例
通用关键词 包含"获取期刊论文"、"下载最新期刊"、"爬取期刊" "获取期刊论文"
期刊名 + 动作 期刊名 + "论文/期刊"相关词 "中国图书馆学报最新论文"、"图书情报工作第5期"
年期指定 期刊名 + "最新X期"/"第X期"/"202X年第X期" "获取图书馆学情报学第5期"

📖 详细的期刊匹配规则和类型识别流程,请参见 步骤 2:期刊类型识别与选择

命令触发模式

直接调用命令:

/cnki-journals-fetcher

快速开始

使用示例

命令触发:

/cnki-journals-fetcher

自然语言触发:

获取中国图书馆学报最新论文
图书情报工作第10期
帮我下载图书馆学情报学最新2期

执行流程

触发(命令/自然语言)
  ↓
解析期刊名和年期参数
  ↓
┌─────────────────────────────────────────┐
│  期刊类型识别 → Grep 搜索所有期刊信息文件  │
│                 → 0个: 显示类型选择       │
│                 → 1个: 直接选中           │
│                 → 多个: 显示列表选择       │
└─────────────────────────────────────────┘
  ↓
┌─────────────────────────────────────────┐
│  年期解析 → 已指定: 使用指定年期         │
│           → 未指定: 智能推荐年期         │
└─────────────────────────────────────────┘
  ↓
显示爬取计划(包含推荐理由)
  ↓
用户确认(单次交互)
  ↓
前置检查并创建输出目录
  ↓
调用爬虫 Subagent 执行爬取 ⭐
  ↓
自动调用 paper-filter subagent 过滤论文
  ↓
人工修改确认(可选)
  ↓
调用 filter_papers.py 生成筛选文件
  ↓
自动调用 paper-summarizer subagent 生成总结报告
  ↓
MEMORY.md 更新(条件触发)
  ↓
更新状态 + 显示结果总结

工作流程

步骤 1:读取期刊类型配置

读取 {baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md,解析类型定义。

提取信息:
- 类型标识、名称、期刊信息文件、爬虫 Subagent、URL 列名

步骤 2:期刊类型识别与选择

2.1 用户已指定期刊名

使用 Grep 动态搜索所有期刊信息文件

Grep(
    pattern=期刊名,
    path="{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journals-list",
    glob="*.md",
    output_mode="files_with_matches"
)

处理结果

匹配数 处理方式
0 个 显示完整期刊列表(按类型分组)
1 个 直接使用该类型,进入期刊选择
多个 显示匹配项,让用户选择类型

多类型匹配示例

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔍 期刊类型识别
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

找到 "图书情报" 相关期刊:

  [1] CNKI 期刊 - 图书情报知识 (cnki-期刊信息.md)
  [2] 独立网站期刊 - 图书情报工作 (独立网站-期刊信息.md)

请选择期刊类型 [1-2]:

2.2 用户未指定期刊名

显示类型选择菜单

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📚 多源期刊论文获取工具
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

请选择期刊类型:
  [1] CNKI 期刊 (15 种)
  [2] 人大报刊复印资料 (3 种)
  [3] 独立网站期刊 (1 种)

请选择 [1-3]:

使用 AskUserQuestion 工具确认。

2.3 期刊选择

确定类型后,读取对应的期刊信息文件:
- CNKI → journals-list/cnki-期刊信息.md
- 人大报刊 → journals-list/人大报刊-期刊信息.md
- 独立网站 → journals-list/独立网站-期刊信息.md

期刊列表显示

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📚 CNKI 期刊列表 (共 15 种)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

双月刊 (9 种):
  [1] 中国图书馆学报      上次获取: 2025-6 ✓
  [2] 图书情报知识        上次获取: 2025-6 ✓
  ...

月刊 (6 种):
  [4] 图书馆论坛          上次获取: 2025-12 ✓
  ...

请选择期刊 (输入编号或期刊名称):

显示逻辑
- 按发行周期分组显示
- 使用数据文件中的原始编号
- 显示"上一次获取年期"状态,已获取的标注 ✓

步骤 2.5:年期解析

解析用户输入中的年期参数:

输入模式 解析逻辑 示例
"最新X期" 从当前年倒推X期 "最新2期" → 2025-5, 2025-6
"YYYY年第X期" / "YYYY-X" 指定年期 "2025-5" → 2025年5期
"第X期" / "X期" 当前年份 + 期号 "第5期" → 2025-5
无年期参数 进入步骤3自动计算 -

步骤 3:智能计算目标年期

当用户未指定年期时,根据发行周期、上次获取记录、当前日期智能推荐目标年期。

详细推荐策略、算法实现、展示格式:参见 reference/period-recommendation.md

核心策略
1. 年初(1-2月)→ 推荐上年最后一期
2. 月初(1-7号)→ 推荐上一期
3. 有上次记录 → 增量推荐
4. 首次爬取 → 推荐上一期

支持的发行周期:月刊、双月刊、季刊、半月刊

步骤 4:显示爬取计划

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 爬取任务确认
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

期刊: 中国图书馆学报 (CNKI, 双月刊)
网址: navi.cnki.net/knavi/journals/ZGTS/detail
上次获取: 2025-4
本次爬取: 2025-5, 2025-6
预计保存: outputs/中国图书馆学报/2025-5.json, 2025-6.json

是否获取论文摘要?
  [1] 仅论文列表 (推荐,快速) ⭐
  [2] 包含摘要详情 (较慢)

确认执行?
  [3] 确认执行
  [4] 修改参数
  [5] 取消

使用 AskUserQuestion 工具确认。先询问是否获取摘要,再询问是否执行。

步骤 5:前置目录检查

在执行爬虫前,先检查目录是否存在,不存在则创建

[ -d "outputs/{期刊名}" ] || mkdir -p "outputs/{期刊名}"

重要:此步骤必须在执行爬虫之前完成,避免因目录不存在导致爬虫执行失败后重试。

步骤 6:调用爬虫 Subagent

根据期刊类型调用对应的爬虫 Subagent,直接构造命令而非传递自然语言参数

# 构造命令参数
details_flag = "-d" if get_details else "--no-details"

# CNKI 期刊
Task(
    subagent_type="cnki-spider-agent",
    description="执行CNKI期刊爬取",
    prompt=f"""
请执行以下爬虫命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/cnki_spider.py \
  -u "{url}" \
  -y {year} -i {issue} {details_flag} \
  -o outputs/{期刊名}/{年-期}.json
"""
)

# 人大报刊复印资料
Task(
    subagent_type="rdfybk-spider-agent",
    description="执行人大报刊复印资料爬取",
    prompt=f"""
请执行以下爬虫命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/rdfybk_spider.py \
  -j {code} -y {year} -i {issue} {details_flag} \
  -o outputs/{期刊名}/{年-期}.json
"""
)

# 独立网站期刊 (图书情报工作)
Task(
    subagent_type="lis-spider-agent",
    description="执行独立网站期刊爬取",
    prompt=f"""
请执行以下爬虫命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/lis_spider.py \
  -j {期刊代码} -y {year} -i {issue} -v {volume} {details_flag} \
  -o outputs/{期刊名}/{年-期}.json
"""
)

📖 各爬虫 Subagent 详细说明:
- CNKI: .claude/agents/cnki-spider-agent.md
- 独立网站: .claude/agents/lis-spider-agent.md
- 人大报刊: .claude/agents/rdfybk-spider-agent.md

处理爬取结果
- 成功:记录成功年期和论文数量
- 空结果:进入回退流程
- 错误:显示错误信息,询问是否继续

步骤 7:回退机制

当目标年期爬取不到(空结果)时:

⚠️ 2026-1 期爬取失败(可能尚未发布)

可用操作:
  [1] 尝试回退到上一期
  [2] 手动输入年期
  [3] 跳过此期

请选择 [1-3]:

使用 AskUserQuestion 工具交互式处理。

步骤 8:更新状态

爬取成功后,使用 Edit 工具更新对应的期刊信息文件。

找到对应期刊行,更新"上一次获取年期"列:

| 中国图书馆学报 | https://... | 双月 | 1-6 | 2025-6 |

步骤 9:自动论文过滤

爬取成功后,自动调用 paper-filter subagent 对获取的论文进行智能过滤标注。

调用格式

Task(
    subagent_type="paper-filter",
    description="过滤标注论文",
    prompt="直接执行论文标注,跳过确认步骤。读取 {baseDir}/MEMORY.md 获取用户研究兴趣,然后对 outputs/{期刊名}/{年-期}.json 中的论文进行过滤标注,添加 interest_match、match_reasons、relevance_score 字段,并直接保存回原文件。"
)

📖 paper-filter subagent 详细说明:参见 .claude/agents/paper-filter.md

错误处理
- 如果 paper-filter 执行失败,显示警告但继续完成主流程
- 如果 MEMORY.md 不存在或配置不完整,提示用户先配置研究兴趣

步骤 9.2:人工修改确认

在 paper-filter 完成后,生成筛选文件前,提供人工修改选项。

⚠️ 重要:此步骤严禁使用 AskUserQuestion 工具!

数据处理要求(必须执行)

  1. 首先使用 Read 工具读取完整的 JSON 文件
    python # 读取实际数据文件 papers_json = read("outputs/{期刊名}/{年-期}.json")

  2. 解析每篇论文的实际状态

  3. interest_match:布尔值,是否相关
  4. match_reasons:数组,匹配的关键词
  5. relevance_score:浮点数,相关度

  6. 动态生成过滤结果列表
    ```python
    # 伪代码 - 按相关度排序
    related = [p for p in papers if p['interest_match'] == true]
    unrelated = [p for p in papers if p['interest_match'] == false]
    related.sort(key=lambda x: x['relevance_score'], reverse=True)
    unrelated.sort(key=lambda x: x['relevance_score'], reverse=True)

# 动态输出列表(基于实际数据,不要依赖 paper-filter 的摘要报告)
for i, paper in enumerate(related, 1):
print(f"[{i}] {paper['title']}")
print(f" 匹配: {', '.join(paper['match_reasons'])}")
print(f" 相关度: {paper['relevance_score']}")
```

  1. 正确的编号映射
  2. 显示的编号是显示顺序(1, 2, 3...)
  3. 切换时需要通过 JSON 中的 titlepages 定位论文
  4. 不要假设"数组索引 = 编号 - 1",因为列表是排序后的

输出格式

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 论文过滤结果
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📊 过滤统计
┌─────────────────────────────────────┐
│ 总论文数    │ 12 篇                  │
│ 相关论文    │ 9 篇 ⭐ (75%)          │
│ 匹配关键词  │ AI应用、知识组织、对话式搜索 │
└─────────────────────────────────────┘

✅ 相关论文 (9篇,按相关度排序):
  [1] 面向科技实体抽取任务的大小模型少样本数据协同训练研究
      匹配: 大模型、大小模型协同、AI应用研究、实体抽取-知识组织相关
      相关度: 0.85

  [2] AIGC环境下对话式搜索与传统搜索的用户行为及学习效果比较研究
      匹配: AIGC、AI应用研究、生成式AI
      相关度: 0.80

  ... (继续列出所有相关论文)

❌ 不相关论文 (3篇,按相关度排序):
  [1] 1974—2024年全球信息素养教育研究主题的识别、演进与展望
      原因: 信息素养教育-非核心关注
      相关度: 0.10

  ... (继续列出所有不相关论文)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
修改命令 (直接输入):
  直接继续    - 跳过修改,使用自动过滤结果
  完成        - 结束修改,进入下一步
  论文标题    - 切换指定论文的相关状态 (可输入部分标题匹配)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

请输入命令:

处理逻辑(循环等待用户输入)

  1. 显示结果后,直接等待用户输入(不使用任何工具,暂停等待)

  2. 根据用户输入执行

用户输入 处理方式
直接继续 设置 user_modified = false,直接进入步骤 9.5
完成 设置 user_modified = true,进入步骤 9.5
论文标题(部分匹配) 读取 JSON,切换对应论文的相关状态,刷新显示后继续等待输入
  1. 论文切换逻辑
  2. 使用 Read 读取 JSON 文件
  3. 通过标题匹配定位论文(支持部分匹配)
  4. 切换 interest_match 状态(true ↔ false)
  5. 如果设为 true,根据论文内容设置 match_reasonsrelevance_score
  6. 如果设为 false,清空 match_reasons 并将 relevance_score 设为 0
  7. 使用 Write 更新文件
  8. 重新读取 JSON 并刷新显示当前状态
  9. 继续等待用户输入

错误处理
- 如果标题匹配不到论文,提示"未找到匹配的论文,请重新输入"
- 如果匹配到多篇论文,提示"匹配到多篇论文,请输入更具体的标题"
- 如果 JSON 文件格式损坏,提示错误并跳过修改步骤

步骤 9.5:生成筛选文件

论文过滤完成后,调用 filter_papers.py 脚本生成独立的筛选文件。

执行命令

python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/filter_papers.py \
  -i outputs/{期刊名}/{年-期}.json

步骤 10:自动生成论文总结

筛选文件生成后,自动调用 paper-summarizer subagent 生成结构化的 Markdown 总结报告。

调用格式

Task(
    subagent_type="paper-summarizer",
    description="生成论文总结报告",
    prompt="读取 outputs/{期刊名}/{年-期}-filtered.json,生成论文总结报告并保存到 outputs/{期刊名}/{年-期}-summary.md"
)

📖 paper-summarizer subagent 详细说明:参见 .claude/agents/paper-summarizer.md

步骤 10.2:MEMORY.md 更新(条件触发)

触发条件:仅当 user_modified = true 时执行(即用户在步骤 9.2 中选择了修改过滤标签)

调用 memory-updater-agent,使用模式 C(指定期刊年期)执行更新。

📖 memory-updater skill 详见:.claude/skills/memory-updater/SKILL.md

步骤 11:显示结果总结

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 爬取任务完成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📊 任务统计
┌─────────────────────────────────────┐
│ 期刊名称    │ 中国图书馆学报          │
│ 类型        │ CNKI                    │
│ 发行周期    │ 双月刊                   │
│ 计划爬取    │ 2025-5, 2025-6          │
│ 成功获取    │ 2025-5 (12篇)           │
│ 失败        │ 2025-6 (未发布)         │
├─────────────────────────────────────┤
│ 状态已更新  │ 上次获取: 2025-4 → 2025-5│
│ 结果保存    │ outputs/中国图书馆学报/  │
└─────────────────────────────────────┘

🔍 论文过滤结果
┌─────────────────────────────────────┐
│ 总论文数    │ 12 篇                  │
│ 相关论文    │ 5 篇 ⭐                │
│ 匹配关键词  │ 知识组织、元数据、...   │
└─────────────────────────────────────┘

📁 已保存文件:
  • outputs/中国图书馆学报/2025-5.json (已标注)
  • outputs/中国图书馆学报/2025-5-filtered.json (筛选后)
  • outputs/中国图书馆学报/2025-5-summary.md (总结报告)

输出格式

JSON 结果文件 (outputs/{期刊名}/{年-期}.json):

[
  {
    "year": 2025,
    "issue": 6,
    "title": "论文标题",
    "author": "作者1; 作者2",
    "pages": "1-10",
    "abstract_url": "https://...",
    "abstract": "论文摘要内容..."
  }
]

错误处理

错误类型 处理方式
期刊类型配置文件不存在 提示检查路径 {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

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.