技术博客
PDF文件正文抽取:学术论文与文献 PDF 批量抽取实战

PDF文件正文抽取:学术论文与文献 PDF 批量抽取实战

作者: 万维易源
2026-09-02
PDF批量抽取学术文献Python脚本限流重试
# PDF文件正文抽取:学术论文与文献 PDF 批量抽取实战 > 接口 PDF文件正文抽取(apiCode=10,接入点 10-1) · 免费服务 · 请求方式 POST · 返回格式 JSON · 适用人群 研究者、学生、文献管理员 · 阅读时间 约 6 分钟 ## 核心要点 - 批量抽取的本质是「逐份上传 PDF → 取 `text` → 落盘」,循环即可,无特殊批量接口。 - 免费服务有「使用档次限制」,批量时必须做**限流 + 重试**,否则易触发限制或超时。 - 落盘建议按原文件名生成 `.txt`,并保留 `showapi_res_id` 便于追溯。 ## Why:为什么需要批量抽取 研究生、综述写作者、图书馆馆员常年面对成百上千篇 PDF 文献:要做全文检索、做引用管理、做文本挖掘,第一步永远是把 PDF 变成可搜索的文本。手动一份份上传不现实,用脚本批量跑才是正解。本文给你一套能直接用的批量方案。 ## What:方案速览 | 项目 | 说明 | |------|------| | 核心动作 | 遍历目录 → 逐份 POST → 解析 `text` → 写 `.txt` | | 关键约束 | 免费档位限制,需限流与重试 | | 推荐语言 | Python(requests + 标准库即可) | | 并发建议 | 免费档位下建议串行 + 间隔,或极小的并发上限 | ## How:批量抽取脚本 下面脚本遍历 `papers/` 下的 PDF,逐个调用,限流为「每次间隔 1 秒 + 失败退避重试」,并把正文写入同名 `.txt`。 ```python import os, time, requests APP_KEY = "YOUR_APPKEY" # 替换为真实 AppKey IN_DIR = "papers" # 存放 PDF 的目录 OUT_DIR = "papers_txt" # 输出目录 os.makedirs(OUT_DIR, exist_ok=True) def extract(pdf_path): url = "https://route.showapi.com/10-1" for attempt in range(3): # 最多重试 3 次 try: resp = requests.post( url, params={"appKey": APP_KEY}, files={"pdf": open(pdf_path, "rb")}, timeout=15, ).json() if resp.get("showapi_res_code") != 0: raise RuntimeError(resp.get("showapi_res_error")) body = resp["showapi_res_body"] if body.get("ret_code") != "0": raise RuntimeError(body.get("remark")) return body.get("text", "") except Exception as e: if attempt == 2: return f"[ERROR] {e}" time.sleep(2 ** attempt) # 指数退避 return "[ERROR] 未知失败" for name in os.listdir(IN_DIR): if not name.lower().endswith(".pdf"): continue src = os.path.join(IN_DIR, name) text = extract(src) out = os.path.join(OUT_DIR, name[:-4] + ".txt") with open(out, "w", encoding="utf-8") as f: f.write(text) print(f"done: {name} -> {out}") time.sleep(1) # 限流:免费档位下务必加间隔 ``` ## 返回示例与解析 每份 PDF 的返回结构与单条调用一致,`text` 即该篇正文。批量场景的差异在于:你要把这些 `text` 稳定地落盘,并对失败项单独标记(如上方的 `[ERROR]` 前缀),而不是让整批中断。 ## 进阶 / 边界 - **限流是第一原则**:免费服务有使用档次限制,串行 + 1 秒间隔是最稳妥的起步配置;若需提速,先确认你的档位额度再上调并发。 - **断点续跑**:给脚本加一个「目标 `.txt` 已存在则跳过」的判断,避免重复消耗额度。 - **编码**:写文件统一用 `utf-8`,避免不同系统下的乱码。 - **空正文**:若某篇 `text` 为空但成功,按 [能力边界篇](https://www.showapi.com/guides/pdf-extract-limits-10) 排查(多为无文字层扫描件)。 ## FAQ **Q:有没有官方的「批量接口」可以一次传多份?** A:本接口文档仅提供单一接入点(10-1),为「每次上传一个 `pdf` 文件」的同步模式,没有批量上传端点。批量靠你在客户端循环调用实现。 **Q:跑几百篇会被封吗?** A:接口本身不会因数量封禁,但免费档位有调用限制;不加限流可能触发限制导致大量失败。建议限流 + 重试 + 断点续跑。 **Q:速度太慢怎么提速?** A:先到 [免费 API 档位说明](https://www.showapi.com/free-api) 确认你的额度,再在「不超额度」前提下适度提高并发或缩短间隔。 **Q:抽取正文里有页码/页眉噪声怎么办?** A:这是源 PDF 排版决定的,接口按原文字层抽取;如需清洗,在拿到 `text` 后用正则/规则做后处理即可。 ## 相关能力 / 下一步阅读 - [PDF文件正文抽取:免费档位限制与频率/成本控制](https://www.showapi.com/guides/pdf-extract-free-tier-10) - [PDF文件正文抽取:把抽取结果转存为 TXT / DOCX](https://www.showapi.com/guides/pdf-extract-export-10) - **本系列共 10 篇**:查看[PDF文件正文抽取指南总目录](https://www.showapi.com/guides/pdf-extract-guides-10)