5. 其他文献数据平台的处理¶
上述步骤1-4我们都是以pubmed文献平台为例进行的介绍,对于其他文献数据平台, 比如说arXiv、bioRxiv、medRxiv、chemRxiv等,处理逻辑同理。
理论上一切基于DOI出发的文献处理流程,都可以按照上文我们提到的处理逻辑进行统一:
基于doi获取pdf -> pdf初步解析 -> 内容提取与结构化处理。
⚠️
针对上述预印本平台的模块目前基本已经开发完毕,后续只对相关功能进行维护和优化, 测试细节与pubmed合并,详情见Cases
1. 命令速查 (TL;DR)¶
三个平台统一:搜索命令产出 ID 清单(txt),抓取命令既能按 query 搜,也能用 --file 承接清单或 --id/--doi 单个抓。
通用约定
- query 写法:空格 = AND(所有词都命中);
OR显式或;引号"..."短语。例:zinc finger= zinc 且 finger;zinc OR finger= 任一。 - 搜索 vs 抓取:
*-search只产出 ID 清单 txt;*-fetch抓元数据(JSON)+ 可选 PDF。 - 输出结构:
{输出目录}/{source}/{year}/{source_id}/(例:./papers/biorxiv/2023/10.1101_2023.06.22.546069/)。 - 搜索默认不限量;
--max-results限量;--start-date/--end-date限日期;三者可叠加。 - 抓取的 query 模式默认上限 100(避免一次狂下 PDF);
--file/--id/--doi天然不限量。 - PDF 默认开启下载(
--download-pdf);只想拿元数据用--no-download-pdf。
arXiv
# 搜索:返回全部命中
paperflow arxiv-search "protein folding" -o ./papers
# 限量 / 限日期
paperflow arxiv-search "protein folding" --max-results 50 -o ./papers
paperflow arxiv-search "protein folding" --start-date 2024-01-01 --end-date 2024-12-31 -o ./papers
# → ./papers/searched_arxiv_ids.txt
# 抓取:按 query(默认最多 100 条)
paperflow arxiv-fetch "protein folding" --max-results 50 -o ./papers
# 单个 ID(可重复 --id)
paperflow arxiv-fetch --id 1706.03762 --no-download-pdf -o ./papers
paperflow arxiv-fetch --id 1706.03762 --id 1602.02644 -o ./papers
# 承接搜索输出的清单文件(全部下载 PDF)
paperflow arxiv-fetch --file ./papers/searched_arxiv_ids.txt --download-pdf -o ./papers
bioRxiv
# 搜索:返回全部命中
paperflow biorxiv-search "zinc finger" -o ./papers
paperflow biorxiv-search "zinc finger" --max-results 20 -o ./papers
paperflow biorxiv-search "zinc finger" --start-date 2024-01-01 --end-date 2024-12-31 -o ./papers
# → ./papers/searched_biorxiv_ids.txt (内容是 DOI)
# 抓取:按 query
paperflow biorxiv-fetch "zinc finger" --max-results 50 -o ./papers
# 单个 DOI(可重复 --doi)
paperflow biorxiv-fetch --doi 10.1101/2023.06.22.546069 --no-download-pdf -o ./papers
# 承接搜索输出的 DOI 清单
paperflow biorxiv-fetch --file ./papers/searched_biorxiv_ids.txt --download-pdf -o ./papers
medRxiv
# 搜索:返回全部命中
paperflow medrxiv-search "vaccine efficacy" -o ./papers
paperflow medrxiv-search "vaccine efficacy" --start-date 2020-01-01 --end-date 2024-12-31 -o ./papers
# → ./papers/searched_medrxiv_ids.txt
# 抓取:按 query
paperflow medrxiv-fetch "vaccine efficacy" --max-results 50 -o ./papers
# 单个 DOI
paperflow medrxiv-fetch --doi 10.1101/2020.03.20.20039555 --no-download-pdf -o ./papers
# 承接搜索输出的 DOI 清单
paperflow medrxiv-fetch --file ./papers/searched_medrxiv_ids.txt --download-pdf -o ./papers
ChemRxiv
# 搜索:返回全部命中(单一后端 Crossref,prefix 10.26434,无 Europe PMC 并集)
paperflow chemrxiv-search "AI drug design" -o ./papers
paperflow chemrxiv-search "AI drug design" --start-date 2024-01-01 --end-date 2024-12-31 -o ./papers
# → ./papers/searched_chemrxiv_ids.txt (内容是 DOI,前缀 10.26434/...)
# 抓取:按 query(默认最多 100 条)
paperflow chemrxiv-fetch "AI drug design" --max-results 50 -o ./papers
# 单个 DOI
paperflow chemrxiv-fetch --doi 10.26434/chemrxiv.15007590/v1 --no-download-pdf -o ./papers
# 承接搜索输出的 DOI 清单
paperflow chemrxiv-fetch --file ./papers/searched_chemrxiv_ids.txt --download-pdf -o ./papers
检索并集(bioRxiv / medRxiv,默认开启)
*-search 与 *-fetch 的 query 模式现在默认 = Crossref(元数据相关性)∪ Europe PMC(预印本全文布尔 AND),按 DOI 去重。要点:
- 只有 query 模式走并集:
--file/--doi是按 DOI 直接抓,不涉及搜索,行为不变。 - 裸词 = AND:
zinc finger 263→zinc AND finger AND 263;写AND/OR/NOT就原样透传给 Europe PMC。Crossref 侧仍按原有相关性 + 本地 AND。 - 日期依然生效:
--start-date/--end-date同时约束两个后端;若某个日期窗口内 Europe PMC 全文无命中,结果就是 0(不是没生效)。 - 用
--no-europepmc可回退到纯 Crossref。
Europe PMC 走的是预印本全文,能补上 Crossref 只看标题摘要而漏掉的「基因缩写写法」(例:Zfp263 vs zinc finger 263)。
上面这套 Crossref ∪ Europe PMC 并集只作用于 bioRxiv / medRxiv。ChemRxiv 是纯 Crossref 单后端(prefix
10.26434,publisher 记为 "American Chemical Society (ACS)",typeposted-content),query 模式也不并入 Europe PMC。
注意点
- bioRxiv/medRxiv 的 DOI 都是
10.1101/...,靠 6 位(bioRxiv) vs 8 位(medRxiv)accession 区分,所以--doi直接给10.1101/...即可,平台由命令本身决定。 - PDF 403 反爬:bioRxiv/medRxiv 对非浏览器客户端常返回 403,直连失败会自动走 CloakBrowser 回退——前提是设置
PAPER_FETCH_CLOAK=1(可选CLOAKBROWSER_PYTHON/PAPER_FETCH_CLOAK_HEADED)。arXiv 无此问题。 - 推荐工作流:先
*-search(不限量拿全量清单)→ 人工筛选 →*-fetch --file(精确抓取元数据 + 下载 PDF),避免一次抓取过多。 - 排序说明:并集结果中,Crossref 命中(相关性排序,
sort=relevance)在前,Europe PMC 新增命中按其后端顺序追加。日期只能做过滤(--start-date/--end-date),不能"按日期排序+返回全部"(Crossref 限制日期排序不能配合 cursor 深度分页)。arXiv 按提交时间倒序。 - ChemRxiv 检索走 Crossref,不用官方 API:ChemRxiv 的公开 API(
chemrxiv.org/engage/chemrxiv/public-api/v1)对非浏览器客户端(httpx/curl)返回 Cloudflare 403,而 Crossref 侧(prefix10.26434)是稳定、最全的元数据通道,故chemrxiv-*只查 Crossref(也不并入 Europe PMC)。⚠️ 代价见下(版本重复 / 新贴有入库延迟 / 只看标题摘要)。完整讨论见 README「注意点:为什么预印本检索走 Crossref 元数据」。 - ChemRxiv PDF 直连可下:PDF 端点固定为
https://chemrxiv.org/doi/pdf/{doi},本网络实测经 httpx 直连即返回%PDF字节,不需要 CloakBrowser / undetected_chromedriver 回退(与 bioRxiv/medRxiv 的 Cloudflare 403 相反)。万一某篇直连失败,--download-pdf仍会自动走浏览器回退链。 - 版本重复(去重要手动):Crossref 把 ChemRxiv 每次改版都单独注册成一个 DOI work——
10.26434/chemrxiv-2025-tj4pr-v2与chemrxiv-2025-tj4pr、10.26434/chemrxiv.15007500/v2与/v1都会作为独立结果同时命中(见下方实测,3 条 DOI 实为 2 篇论文)。chemrxiv-*不去重,用--file清单抓取前可自行剔除旧版 DOI。
2. 搜索并获取 arXiv 论文¶
如果你只想先拿到 ID,可以先搜索;如果想同时获取元数据和 PDF,可以直接 fetch。
paperflow arxiv-search "deep learning for biology" --max-results 10
paperflow arxiv-fetch "deep learning for biology" --max-results 10 --download-pdf
paperflow arxiv-fetch "deep learning for biology" --max-results 10 --download-pdf --backend paperscraper
常用参数:
--start-date/--end-date:按YYYY-MM-DD格式限制日期范围。--backend:可选native(内置的 httpx 方案)或paperscraper(安装了第三方包时可用, ⚠️ 暂时未测试paperscraper)。--output-dir:把 ID 列表或抓取结果保存到其他目录。--no-download-pdf:只保存元数据,不下载 PDF。
日期过滤示例:
paperflow arxiv-fetch "protein folding" --start-date 2024-01-01 --end-date 2024-12-31 -o ./papers/arxiv
搜索结果会保存为 searched_arxiv_ids.txt。抓取结果会按 source/year/source_id/ 结构保存,包含 JSON 元数据,PDF 则按可用情况尽量下载。
arXiv 命令变体与使用示例:
-
arxiv-search: 仅检索匹配的 arXiv 记录并输出 ID 列表(不下载内容)。
用法示例:
paperflow arxiv-search "protein folding" --max-results 50 --start-date 2024-01-01 --end-date 2024-12-31 # 将会在默认存储目录下生成 searched_arxiv_ids.txt,或使用 --output-dir 指定保存位置说明:
--max-results缺省为不限量(返回该 query 全部命中),只有native后端支持不限量;--backend paperscraper需要显式指定--max-results。--start-date/--end-date按YYYY-MM-DD限制提交时间范围。 -
arxiv-fetch: 检索并保存每篇论文的标准化元数据(JSON),可选地下载 PDF 文件(默认开启)。
常用选项: -
--download-pdf/--no-download-pdf:是否下载 PDF(默认--download-pdf)。 ---backend:native(默认,使用 arXiv Atom API)或paperscraper(需安装paperscraper包)。 ---output-dir:指定保存结果的目录(默认使用全局存储目录)。 ---start-date/--end-date:按YYYY-MM-DD限制提交时间范围。用法示例:
-
按 ID / 文件抓取:
arxiv-search输出的是searched_arxiv_ids.txt(每行一个 arXiv ID),arxiv-fetch支持直接消费这些 ID,无需重新搜索。query、--file、--id三者互斥,取其一即可。# 单个 ID(可重复 --id) paperflow arxiv-fetch --id 1706.03762 --no-download-pdf -o ./papers/arxiv paperflow arxiv-fetch --id 1706.03762 --id 1602.02644 --no-download-pdf -o ./papers/arxiv # 从 arxiv-search 生成的 ID 文件抓取 paperflow arxiv-fetch --file ./searched_arxiv_ids.txt --no-download-pdf -o ./papers/arxiv -
输出与存储:
- 元数据:每篇论文保存为
{source_id}.json,包含title,authors,abstract,published_date,landing_url,pdf_url等字段(存储路径示例:{output_dir}/arxiv/2024/2301.01234v1/2301.01234v1.json)。 - PDF:如果可用且下载成功,则保存为
{source_id}.pdf,并在对应 JSON 中更新pdf_downloaded和pdf_path字段。
- 元数据:每篇论文保存为
-
注意事项:
- arXiv 的抓取流程只负责元数据标准化与 PDF 下载;当前仓库没有内建将 arXiv PDF 自动解析为 Markdown/结构化全文的步骤。若需后续文本解析,请在下载后接入 PDF 解析器(例如
pdfplumber、minerU、或 OCR/布局解析管线),并将解析结果保存为*_parsed.md或结构化 JSON,以便merge等下游工具使用。
- arXiv 的抓取流程只负责元数据标准化与 PDF 下载;当前仓库没有内建将 arXiv PDF 自动解析为 Markdown/结构化全文的步骤。若需后续文本解析,请在下载后接入 PDF 解析器(例如
⚠️ 下面是 arxiv-* 模块实测用例
❯ paperflow arxiv-search "zinc finger" --start-date 2025-01-01 --end-date 2026-12-31 -o ./test
Found 2 arXiv papers.
2507.06458v1
2502.09135v1
arXiv IDs saved to ./test/searched_arxiv_ids.txt.
此处可以查看 searched_arxiv_ids.txt
然后我们可以使用 arxiv-fetch 来抓取这些论文的元数据和 PDF:
❯ paperflow arxiv-fetch -f ./test/searched_arxiv_ids.txt -o ./test --download-pdf
Fetching 2 arXiv IDs from file /data2/pyPaperFlow/test/searched_arxiv_ids.txt.
Fetched 2 arXiv papers.
Saved to /data2/pyPaperFlow/test/arxiv
论文获取结果可以查看 arxiv,可以发现每篇论文都按 {source}/{year}/{source_id}/ 结构保存,包含 JSON 元数据和 PDF 文件。
至于pdf文件,我们可以使用 MinerU 或其他 PDF 解析工具来进一步处理,提取结构化内容或转换为 Markdown,然后可以和前面的 PMC 论文处理流程结合,进行后续分析和整理。
3. 搜索并获取 bioRxiv 论文¶
bioRxiv 的 query 检索(我们此处设计是)默认是双后端并集:Crossref(openRxiv,元数据相关性检索 + 本地 AND)∪ Europe PMC(预印本全文布尔 AND),按 DOI 去重。Europe PMC 走全文,能补上 Crossref 只看标题摘要而漏掉的「基因缩写写法」。用 --no-europepmc 可回退到纯 Crossref。若 query 本身是一个 DOI(如 10.1101/2023.06.22.546069),会直接走 /works/{doi} 精确取回该论文,不再做书目检索。
paperflow biorxiv-search "AlphaFold AND structure" --max-results 10
paperflow biorxiv-fetch "AlphaFold AND structure" --start-date 2026-01-01 --end-date 2026-01-31 --download-pdf
# 回退到纯 Crossref(不用 Europe PMC 全文)
paperflow biorxiv-search "AlphaFold AND structure" --no-europepmc -o ./papers
常用参数:
--start-date/--end-date:按YYYY-MM-DD格式限制日期范围(对两个后端都生效)。--max-results:限制返回条数;缺省为不限量(返回该 query 全部命中)。--europepmc/--no-europepmc:是否并入 Europe PMC 全文检索(默认--europepmc,开启并集)。--output-dir:把 ID 列表或抓取结果保存到其他目录。--no-download-pdf:只保存元数据,不下载 PDF。
兼容性说明:
--window-days作为 CLI 兼容参数保留,但当前检索路径不会使用该参数。
示例:
搜索结果会保存为 searched_biorxiv_ids.txt。抓取结果会按 source/year/source_id/ 结构保存,包含 JSON 元数据,并在可用时下载 PDF。
按 DOI / 文件抓取:biorxiv-search 输出的是 searched_biorxiv_ids.txt(每行一个 DOI),biorxiv-fetch 支持直接消费这些 DOI。query、--file、--doi 三者互斥,取其一即可。
# 单个 DOI(可重复 --doi)
paperflow biorxiv-fetch --doi 10.1101/2023.06.22.546069 --no-download-pdf -o ./papers/biorxiv
# 从 biorxiv-search 生成的 DOI 文件抓取
paperflow biorxiv-fetch --file ./searched_biorxiv_ids.txt --no-download-pdf -o ./papers/biorxiv
⚠️ 下面是 biorxiv-* 模块实测用例
❯ paperflow biorxiv-search "zinc finger 263 OR zfp263 OR znf263" --start-date 2026-08-01 --end-date 2026-12-31 -o ./test
Found 18 bioRxiv papers.
10.64898/2026.08.25.746729
10.64898/2026.08.26.747357
10.64898/2026.08.25.747015
10.64898/2026.08.20.744945
10.64898/2026.08.13.744650
10.64898/2026.08.28.747767
10.64898/2026.08.29.747956
10.64898/2026.07.31.742039
10.64898/2026.08.20.746118
10.64898/2026.08.19.745795
10.64898/2026.08.13.744713
10.64898/2026.08.23.746472
10.64898/2026.08.22.746471
10.64898/2026.08.12.744261
10.64898/2026.08.04.740911
10.64898/2026.08.03.742597
10.64898/2026.08.19.745709
10.64898/2026.08.20.746080
bioRxiv IDs saved to ./test/searched_biorxiv_ids.txt.
此处可以查看 searched_biorxiv_ids.txt
然后我们可以使用 biorxiv-fetch 来抓取这些论文的元数据和 PDF:
❯ paperflow biorxiv-fetch -f ./test/searched_biorxiv_ids.txt -o ./test --download-pdf
Fetching 18 bioRxiv DOIs from file /data2/pyPaperFlow/test/searched_biorxiv_ids.txt.
Fetched 18 bioRxiv papers.
Saved to /data2/pyPaperFlow/test/biorxiv
获取的论文结果可以查看 biorxiv,可以发现每篇论文都按 {source}/{year}/{source_id}/ 结构保存,包含 JSON 元数据。
🌟 bioRxiv 因为有cloudflare验证,我们无法确保能够下载到pdf文件数据(尽管我们也设置了cloakbrowser),目前测试数据一般都无法获取pdf文件。但是我们已经在 必然获取的json文件中 提供了pdf文件的url,所以
建议是人工复核下载
我们以 10.64898_2026.07.31.742039.json 为例
# 关于pdf路径的两个字段信息已经在json文件中提供了
"landing_url": "https://www.biorxiv.org/content/10.64898/2026.07.31.742039",
"pdf_url": "https://www.biorxiv.org/content/10.64898/2026.07.31.742039.full.pdf"
目前使用 --download-pdf 选项下载pdf文件,会给出终端提醒
❯ paperflow biorxiv-fetch -f ./test/searched_biorxiv_ids.txt -o ./test --download-pdf
Fetching 18 bioRxiv DOIs from file /data2/pyPaperFlow/test/searched_biorxiv_ids.txt.
Fetched 18 bioRxiv papers.
PDF download: 0/18 succeeded; 18 failed. bioRxiv serves PDFs behind Cloudflare bot protection — try a different network, or set PAPER_FETCH_CLOAK=1 (needs cloakbrowser) and retry.
Saved to /data2/pyPaperFlow/test/biorxiv
⚠️ 2026-09-02 更新: 新增了
PAPER_FETCH_UNDETECTED环境变量,用于启用undetected-chromedriver回退机制,以解决 Cloudflare 验证问题
现在命令运行如下:
# paperflow 需要在 安装 undetected-chromedriver 的环境中运行
# 以下都可以直接在 ~/.bashrc 或 ~/.zshrc 中设置,或者在终端中直接 export
export PAPER_FETCH_UNDETECTED=1
export UNDETECTED_CHROME_PATH="$HOME/.local/chrome/opt/google/chrome/chrome"
export UNDETECTED_DRIVER_PATH="$HOME/.local/bin/chromedriver"
# 然后命令依旧
# ⚠️ 注意该命令因为需要运行浏览器,所以运行时间会比较长
paperflow biorxiv-fetch -f ./test/searched_biorxiv_ids.txt -o ./test --download-pdf
现在是能够支持获取所有的biorxiv文献的pdf文件了
Fetching 18 bioRxiv DOIs from file /data2/pyPaperFlow/test/searched_biorxiv_ids.txt.
Fetched 18 bioRxiv papers.
Saved to /data2/pyPaperFlow/test/biorxiv
获取的论文结果可以查看 biorxiv,可以发现每篇论文都按 {source}/{year}/{source_id}/ 结构保存,包含 JSON 元数据以及新增下载的 PDF 文件。
另外一个biorxiv文献抓取示例,参考2026年8-9月期间一个月的base-editing关键词文献
4. 搜索并获取 medRxiv 论文¶
medRxiv 与 bioRxiv 共用同一套检索:默认是 Crossref(openRxiv,元数据相关性检索)∪ Europe PMC(预印本全文布尔 AND)的并集,按 DOI 去重;通过 DOI accession 位数(medRxiv 8 位 vs bioRxiv 6 位)区分平台,Europe PMC 结果同样按此过滤。query 为 DOI 时直接精确取回该论文。
paperflow medrxiv-search "vaccine AND efficacy" --max-results 10
paperflow medrxiv-fetch "vaccine AND efficacy" --start-date 2024-01-01 --end-date 2024-12-31 --download-pdf
# 回退到纯 Crossref(不用 Europe PMC 全文)
paperflow medrxiv-search "vaccine AND efficacy" --no-europepmc -o ./papers
常用参数:
--start-date/--end-date:按YYYY-MM-DD格式限制日期范围(medRxiv 最早日期为 2019-06-01;对两个后端都生效)。--max-results:限制返回条数;缺省为不限量(返回该 query 全部命中)。--europepmc/--no-europepmc:是否并入 Europe PMC 全文检索(默认--europepmc,开启并集)。--output-dir:把 ID 列表或抓取结果保存到其他目录。--no-download-pdf:只保存元数据,不下载 PDF。
示例:
搜索结果会保存为 searched_medrxiv_ids.txt。抓取结果会按 source/year/source_id/ 结构保存(source 为 medrxiv),包含 JSON 元数据,并在可用时下载 PDF。
按 DOI / 文件抓取:medrxiv-search 输出的是 searched_medrxiv_ids.txt(每行一个 DOI),medrxiv-fetch 支持直接消费这些 DOI。query、--file、--doi 三者互斥,取其一即可。
# 单个 DOI(可重复 --doi)
paperflow medrxiv-fetch --doi 10.1101/2023.06.22.546069 --no-download-pdf -o ./papers/medrxiv
# 从 medrxiv-search 生成的 DOI 文件抓取
paperflow medrxiv-fetch --file ./searched_medrxiv_ids.txt --no-download-pdf -o ./papers/medrxiv
⚠️ 下面是 medrxiv-* 模块实测用例
❯ paperflow medrxiv-search "base editing" --start-date 2026-08-01 --end-date 2026-12-31 -o ./test/base_editing
Found 9 medRxiv papers.
10.64898/2026.08.11.26360004
10.64898/2026.08.20.26360670
10.64898/2026.08.24.26361180
10.64898/2026.08.11.26360205
10.64898/2026.07.30.26358885
10.64898/2026.08.05.26359678
10.64898/2026.08.03.26359558
10.64898/2026.08.11.26360119
10.64898/2026.08.10.26359569
medRxiv IDs saved to ./test/base_editing/searched_medrxiv_ids.txt.
可以看到,基本上在这过去的一个月中,medRxiv 上关于 base editing 的预印本论文数量不多,只有 9 篇。
我们紧接着进行抓取这些论文的元数据和 PDF:
❯ paperflow medrxiv-fetch -f ./test/base_editing/searched_medrxiv_ids.txt -o ./test/base_editing --download-pdf
Fetching 9 medRxiv DOIs from file /data2/pyPaperFlow/test/base_editing/searched_medrxiv_ids.txt.
Fetched 9 medRxiv papers.
Saved to /data2/pyPaperFlow/test/base_editing/medrxiv
对于下载下来的论文结果,可以查看 medrxiv,可以发现每篇论文都按 {source}/{year}/{source_id}/ 结构保存,包含 JSON 元数据以及新增下载的 PDF 文件。
⚠️ 注意:bioRxiv / medRxiv 的 PDF 由
www.biorxiv.org/www.medrxiv.org提供,其 PDF 端点走 Cloudflare 反爬——非浏览器客户端(curl / httpx / requests 等)或数据中心 IP 会拿到 403 挑战页或 429,而不是 PDF 字节;换用 curl 也一样,因为 Cloudflare 校验的是浏览器 TLS 指纹 + JS 挑战执行,跟用哪个 HTTP 客户端无关。
--download-pdf 会按顺序尝试以下回退链(实现见 biorxiv_fetcher.py::_download_pdf):
{doi}.full.pdf(无版本号)- 通过
api.biorxiv.org/details/{platform}/{doi}取精确版本号,构造{doi}v{version}.full.pdf - HighWire
early路径/content/{platform}/early/{y}/{m}/{d}/{accession}.full.pdf - 抓 landing 页的
<meta name="citation_pdf_url">地址 - (仅当
PAPER_FETCH_CLOAK=1)用 CloakBrowser 回退重试(需cloakbrowser环境,可选CLOAKBROWSER_PYTHON/PAPER_FETCH_CLOAK_HEADED) - (仅当
PAPER_FETCH_UNDETECTED=1)用 undetected_chromedriver + Xvfb 有头 Chrome 回退,能真正解掉 Cloudflare 挑战并拿到 PDF 字节
从被 Cloudflare 标记的 IP 出发,前 5 步(含 CloakBrowser 无头/有头)都可能拿到 403/429 或卡 "Just a moment…"。第 6 步是唯一经实测能稳定下载到 PDF 字节的解法,但需要额外装 Chrome + chromedriver + undetected-chromedriver + Xvfb。
换机器 / 别人要用 biorxiv 或 medRxiv 的 PDF 下载,按这个做:完整安装步骤、环境变量、以及调试手册见 undetected_fallback.md。简言之:
- 装 Chrome(
dpkg -x解包到用户目录,零 sudo)+ 版本匹配的 chromedriver(Chrome for Testing)pip install undetected-chromedriver(装进跑paperflow的那个环境)- 装
xvfb(Linux 无桌面时)- 设环境变量:
默认(不设
PAPER_FETCH_UNDETECTED)时,biorxiv/medrxiv 命令的行为与此功能加入前完全一致,无任何影响。
5. 搜索并获取 ChemRxiv 论文¶
ChemRxiv 挂在 Cambridge "engage" 平台,官方有公开 API,但它的 endpoint(chemrxiv.org/engage/chemrxiv/public-api/v1/items)对非浏览器客户端是 Cloudflare 403 墙,httpx/curl 直接访问拿不到数据。ChemRxiv 的元数据会沉积到 Crossref(prefix 10.26434,publisher 记为 "American Chemical Society (ACS)",type posted-content),所以 chemrxiv-* 走单一后端 = Crossref(元数据 relevance 检索,sort=relevance + 本地布尔 AND),不并入 Europe PMC。query 为 DOI 时直接精确取回该论文。为什么用 Crossref 而不是官方 API,见 README「注意点」。
paperflow chemrxiv-search "base editing"
paperflow chemrxiv-fetch "base editing" --start-date 2026-08-01 --end-date 2026-12-31 --download-pdf
常用参数:
--start-date/--end-date:按YYYY-MM-DD格式限制日期范围(ChemRxiv 最早日期为 2017-08-01)。--max-results:限制返回条数;缺省为不限量(返回该 query 全部命中)。--output-dir:把 ID 列表或抓取结果保存到其他目录。--no-download-pdf:只保存元数据,不下载 PDF。
示例:
搜索结果会保存为 searched_chemrxiv_ids.txt。抓取结果会按 source/year/source_id/ 结构保存(source 为 chemrxiv),包含 JSON 元数据,并在可用时下载 PDF。
按 DOI / 文件抓取:chemrxiv-search 输出的是 searched_chemrxiv_ids.txt(每行一个 DOI,前缀 10.26434/...),chemrxiv-fetch 支持直接消费这些 DOI。query、--file、--doi 三者互斥,取其一即可。
# 单个 DOI(可重复 --doi)
paperflow chemrxiv-fetch --doi 10.26434/chemrxiv.15007590/v1 --no-download-pdf -o ./papers/chemrxiv
# 从 chemrxiv-search 生成的 DOI 文件抓取
paperflow chemrxiv-fetch --file ./searched_chemrxiv_ids.txt --download-pdf -o ./papers/chemrxiv
⚠️ 下面是 chemrxiv-* 模块实测用例
❯ paperflow chemrxiv-search "base editing" --start-date 2026-08-01 --end-date 2026-12-31 -o ./test/base_editing
Found 3 ChemRxiv papers.
10.26434/chemrxiv.15007500/v1
10.26434/chemrxiv.15007500/v2
10.26434/chemrxiv.15007590/v1
ChemRxiv IDs saved to ./test/base_editing/searched_chemrxiv_ids.txt.
可以看到,过去一个多月 ChemRxiv 上 "base editing" 的命中很少——但这 3 条 DOI 实际只有 2 篇论文:
10.26434/chemrxiv.15007500/v1(2026-08-17)与/v2(2026-08-19)是同一篇 Phenonium-Ion-Mediated Skeletal Editing of Paracyclophanes(作者更新后重新提交,Crossref 把 v1/v2 各自注册成独立的 DOI work);10.26434/chemrxiv.15007590/v1(2026-08-18)是另一篇 Multicomponent Molecular Editing of Polybutadiene: From Design Space to Battery Function。
这就是上面注意点第 7 条说的版本重复:抓取前若只想留最新版,需自行剔除旧版 DOI。
紧接着抓取这些论文的元数据和 PDF:
❯ paperflow chemrxiv-fetch -f ./test/base_editing/searched_chemrxiv_ids.txt -o ./test/base_editing --download-pdf
Fetching 3 ChemRxiv DOIs from file /data2/pyPaperFlow/test/base_editing/searched_chemrxiv_ids.txt.
Fetched 3 ChemRxiv papers.
Saved to /data2/pyPaperFlow/test/base_editing/chemrxiv
✅ 与 bioRxiv/medRxiv 不同,这次 3 份 PDF 全部经
chemrxiv.org/doi/pdf/{doi}httpx 直连下载成功(返回
下载下来的结果可查看 chemrxiv,每篇都按 {source}/{year}/{source_id}/ 结构保存(目录名里 DOI 的 / 换成 _,如 10.26434_chemrxiv.15007590_v1/),包含 JSON 元数据以及新增下载的 PDF 文件。