跳转至

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*-fetchquery 模式现在默认 = Crossref(元数据相关性)∪ Europe PMC(预印本全文布尔 AND),按 DOI 去重。要点:

  1. 只有 query 模式走并集:--file / --doi 是按 DOI 直接抓,不涉及搜索,行为不变。
  2. 裸词 = AND:zinc finger 263zinc AND finger AND 263;写 AND/OR/NOT 就原样透传给 Europe PMC。Crossref 侧仍按原有相关性 + 本地 AND。
  3. 日期依然生效:--start-date/--end-date 同时约束两个后端;若某个日期窗口内 Europe PMC 全文无命中,结果就是 0(不是没生效)。
  4. --no-europepmc 可回退到纯 Crossref。

Europe PMC 走的是预印本全文,能补上 Crossref 只看标题摘要而漏掉的「基因缩写写法」(例:Zfp263 vs zinc finger 263)。

上面这套 Crossref ∪ Europe PMC 并集只作用于 bioRxiv / medRxivChemRxiv 是纯 Crossref 单后端(prefix 10.26434,publisher 记为 "American Chemical Society (ACS)",type posted-content),query 模式也不并入 Europe PMC

注意点

  1. bioRxiv/medRxiv 的 DOI 都是 10.1101/...,靠 6 位(bioRxiv) vs 8 位(medRxiv)accession 区分,所以 --doi 直接给 10.1101/... 即可,平台由命令本身决定。
  2. PDF 403 反爬:bioRxiv/medRxiv 对非浏览器客户端常返回 403,直连失败会自动走 CloakBrowser 回退——前提是设置 PAPER_FETCH_CLOAK=1(可选 CLOAKBROWSER_PYTHON / PAPER_FETCH_CLOAK_HEADED)。arXiv 无此问题。
  3. 推荐工作流:先 *-search(不限量拿全量清单)→ 人工筛选 → *-fetch --file(精确抓取元数据 + 下载 PDF),避免一次抓取过多。
  4. 排序说明:并集结果中,Crossref 命中(相关性排序,sort=relevance)在前,Europe PMC 新增命中按其后端顺序追加。日期只能做过滤(--start-date/--end-date),不能"按日期排序+返回全部"(Crossref 限制日期排序不能配合 cursor 深度分页)。arXiv 按提交时间倒序。
  5. ChemRxiv 检索走 Crossref,不用官方 API:ChemRxiv 的公开 API(chemrxiv.org/engage/chemrxiv/public-api/v1)对非浏览器客户端(httpx/curl)返回 Cloudflare 403,而 Crossref 侧(prefix 10.26434)是稳定、最全的元数据通道,故 chemrxiv-* 只查 Crossref(也不并入 Europe PMC)。⚠️ 代价见下(版本重复 / 新贴有入库延迟 / 只看标题摘要)。完整讨论见 README「注意点:为什么预印本检索走 Crossref 元数据」。
  6. ChemRxiv PDF 直连可下:PDF 端点固定为 https://chemrxiv.org/doi/pdf/{doi},本网络实测经 httpx 直连即返回 %PDF 字节,不需要 CloakBrowser / undetected_chromedriver 回退(与 bioRxiv/medRxiv 的 Cloudflare 403 相反)。万一某篇直连失败,--download-pdf 仍会自动走浏览器回退链。
  7. 版本重复(去重要手动):Crossref 把 ChemRxiv 每次改版都单独注册成一个 DOI work——10.26434/chemrxiv-2025-tj4pr-v2chemrxiv-2025-tj4pr10.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-dateYYYY-MM-DD 限制提交时间范围。

  • arxiv-fetch: 检索并保存每篇论文的标准化元数据(JSON),可选地下载 PDF 文件(默认开启)。

    常用选项: - --download-pdf/--no-download-pdf:是否下载 PDF(默认 --download-pdf)。 - --backendnative(默认,使用 arXiv Atom API)或 paperscraper(需安装 paperscraper 包)。 - --output-dir:指定保存结果的目录(默认使用全局存储目录)。 - --start-date / --end-date:按 YYYY-MM-DD 限制提交时间范围。

    用法示例:

    # 仅保存元数据(不下载 PDF)
    paperflow arxiv-fetch "deep learning for biology" --max-results 20 --no-download-pdf -o ./papers/arxiv
    
    # 使用 paperscraper 后端并下载 PDF
    paperflow arxiv-fetch "deep learning for biology" --max-results 20 --download-pdf --backend paperscraper -o ./papers/arxiv
    
  • 按 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_downloadedpdf_path 字段。
  • 注意事项

    • arXiv 的抓取流程只负责元数据标准化与 PDF 下载;当前仓库没有内建将 arXiv PDF 自动解析为 Markdown/结构化全文的步骤。若需后续文本解析,请在下载后接入 PDF 解析器(例如 pdfplumberminerU、或 OCR/布局解析管线),并将解析结果保存为 *_parsed.md 或结构化 JSON,以便 merge 等下游工具使用。

⚠️ 下面是 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 兼容参数保留,但当前检索路径不会使用该参数。

示例:

paperflow biorxiv-fetch "protein interaction" --max-results 50 -o ./papers/biorxiv

搜索结果会保存为 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。

示例:

paperflow medrxiv-fetch "long covid" --max-results 50 -o ./papers/medrxiv

搜索结果会保存为 searched_medrxiv_ids.txt。抓取结果会按 source/year/source_id/ 结构保存(sourcemedrxiv),包含 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):

  1. {doi}.full.pdf(无版本号)
  2. 通过 api.biorxiv.org/details/{platform}/{doi} 取精确版本号,构造 {doi}v{version}.full.pdf
  3. HighWire early 路径 /content/{platform}/early/{y}/{m}/{d}/{accession}.full.pdf
  4. 抓 landing 页的 <meta name="citation_pdf_url"> 地址
  5. (仅当 PAPER_FETCH_CLOAK=1)用 CloakBrowser 回退重试(需 cloakbrowser 环境,可选 CLOAKBROWSER_PYTHON / PAPER_FETCH_CLOAK_HEADED
  6. (仅当 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。简言之:

  1. 装 Chrome(dpkg -x 解包到用户目录,零 sudo)+ 版本匹配的 chromedriver(Chrome for Testing)
  2. pip install undetected-chromedriver(装进跑 paperflow 的那个环境)
  3. xvfb(Linux 无桌面时)
  4. 设环境变量:
    export PAPER_FETCH_UNDETECTED=1
    export UNDETECTED_CHROME_PATH="$HOME/.local/chrome/opt/google/chrome/chrome"
    export UNDETECTED_DRIVER_PATH="$HOME/.local/bin/chromedriver"
    

默认(不设 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。

示例:

paperflow chemrxiv-fetch "AI for drug design" --max-results 50 -o ./papers/chemrxiv

搜索结果会保存为 searched_chemrxiv_ids.txt。抓取结果会按 source/year/source_id/ 结构保存(sourcechemrxiv),包含 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 直连下载成功(返回 %PDF 字节),没遇到 Cloudflare 403,无需浏览器回退。

下载下来的结果可查看 chemrxiv,每篇都按 {source}/{year}/{source_id}/ 结构保存(目录名里 DOI 的 / 换成 _,如 10.26434_chemrxiv.15007590_v1/),包含 JSON 元数据以及新增下载的 PDF 文件。