| name | cnki-crawler |
| description | Crawl CNKI journal paper metadata with the local Python crawler and save to PostgreSQL. Supports multi-sort retrieval (DFR/CF/PT/ZH) and mandatory query validation. Use when the user asks to collect CNKI papers, run the CNKI crawler, or query by CNKI field patterns. |
CNKI Crawler (v2.0)
核心改进:
- ✅ 支持 4 种排序策略(DFR/CF/PT/ZH)
- ✅ 检索式强制验证(执行前拦截错误)
- ✅ 多排序抓取 + 去重(覆盖热点 + 权威 + 最新 + 高相关)
快速启动
1. 环境准备
cd /root/.openclaw/skills/cnki-crawler
python -m pip install -r requirements.txt
cp .env.example .env
2. 检索式验证(强制)
python scripts/validate_query.py "SU=('耐心资本'+'长期资本')"
3. 单排序抓取
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field CF --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field PT --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field DFR --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field ZH --limit-pages 2
4. 多排序抓取(推荐)
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field DFR --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field CF --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field PT --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field ZH --limit-pages 2
5. 带年份范围
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field CF --limit-pages 2 --start-year 2020 --end-year 2026
CLI 参数
| 参数 | 说明 | 默认值 |
|---|
query_pattern | CNKI 专业检索式(必填) | - |
--sort-field | 排序字段:PT/CF/DFR/ZH | PT |
--sort-type | 排序方式:asc/desc | desc |
--start-year | 起始年份 | 无限制 |
--end-year | 结束年份 | 无限制 |
--limit-pages | 最多爬取页数 | 无限制 |
--validate-only | 只验证检索式,不爬取 | False |
--no-db | 不写入数据库 | False |
--print-result | 打印结果(仅小数据集) | False |
排序字段说明
| 代码 | 含义 | 适用场景 |
|---|
PT | 发表时间 | 获取最新研究 |
CF | 被引频次 | 获取权威文献 |
DFR | 下载频次 | 获取热点文献 |
ZH | 综合排序 | 获取相关度最高 |
检索式语法
基本规则
必须遵守:
- 字段代码来自官方字段表(SU/TI/KY/AB/AU 等)
- 检索值使用英文半角单引号
'...'
and/or/not 前后必须有空格
- 年份范围使用
--start-year/--end-year,不写入检索式
- 字段内多词使用
+ 号连接,不是逗号
正确示例
SU=('耐心资本'+'长期资本'+'战略性投资')
TI='生态' and KY='生态文明'
SU=('经济发展'+'可持续发展') * '转变' - '泡沫'
错误示例
# ❌ 使用逗号分隔
SU=('耐心资本,长期资本,战略性投资')
# ❌ 年份写入检索式
SU='耐心资本' and YE='2025'
# ❌ 字段代码错误
SUB='耐心资本' # 应为 SU
# ❌ 逻辑运算符缺少空格
SU='test'and KY='test2'
检索式验证器
使用方式
python scripts/validate_query.py "SU=('耐心资本'+'长期资本')"
from validate_query import validate_cnki_query
valid, errors = validate_cnki_query("SU=('耐心资本'+'长期资本')")
if not valid:
for err in errors:
print(err)
验证规则
- 字段代码验证 - 必须在官方字段表中
- 年份检查 - 不能出现在检索式中
- 引号检查 - 必须使用英文半角单引号
- 逻辑运算符格式 -
and/or/not 前后必须有空格
- 括号匹配 - 左右括号数量必须相等
- 常见错误检测 - 逗号分隔、字段代码拼写错误等
项目结构
cnki-crawler/
├── scripts/
│ ├── main.py # CLI 入口
│ ├── crawl.py # 爬虫核心逻辑
│ ├── validate_query.py # 检索式验证器 (v2.0 新增)
│ ├── cnki_db.py # PostgreSQL 持久化
│ ├── proxy_check.py # 代理验证
│ └── settings.py # 配置
├── reference/
│ └── 专业检索语法.md # 检索式语法速查
├── .env # 本地配置
├── .env.example # 配置模板
└── requirements.txt # 依赖
数据库 Schema
CREATE TABLE cnki_papers (
search_id TEXT PRIMARY KEY,
title TEXT,
authors TEXT[],
journal TEXT,
year TEXT,
issue TEXT,
publish_date TEXT,
abstract TEXT,
keywords TEXT[],
organizations TEXT[],
funds TEXT[],
cited_count TEXT,
download_count TEXT,
detail_url TEXT,
query_pattern TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
多排序抓取策略
为什么需要多排序?
单一排序可能遗漏重要文献:
- 仅按时间:错过经典高被引文献
- 仅按被引:错过最新前沿研究
- 仅按下载:错过学术深度文献
推荐策略
DFR: 下载频次 → 热点文献
CF: 被引频次 → 权威文献
PT: 发表时间 → 最新研究
ZH: 综合排序 → 高相关文献
原始数据:4 × 100 = 400 篇
去重后:约 200-300 篇高质量文献
去重逻辑
- DOI 精确去重(优先)
- 标题相似度去重(阈值 0.85)
- 保留质量更高版本(被引 + 下载更多)
常见用法
快速测试
python scripts/main.py "SU='耐心资本'" --validate-only
python scripts/main.py "SU='耐心资本'" --limit-pages 1 --print-result
生产环境
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field DFR --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field CF --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field PT --limit-pages 2
python scripts/main.py "SU=('耐心资本'+'长期资本')" --sort-field ZH --limit-pages 2
导出 JSON
python scripts/export_to_json.py /output/path/papers.json 500
python scripts/export_to_json.py /output/path/papers.json 500
故障排查
检索式验证失败
爬取结果为 0
- 检查检索式语法(使用
validate_query.py)
- 确认关键词使用
+ 号连接
- 确认代理可用(
python scripts/proxy_check.py)
数据库连接失败
- 检查
.env 中的 CNKI_DB_DSN
- 确认 PostgreSQL 服务运行
- 确认用户权限
维护
- 检索式验证规则 -
scripts/validate_query.py
- 爬虫核心逻辑 -
scripts/crawl.py
- 数据库 Schema -
scripts/cnki_db.py
- 默认参数 -
scripts/settings.py
- 检索语法参考 -
reference/专业检索语法.md
最后更新:2026-04-08 (v2.0)