📚 Documents: paperdl.readthedocs.io 🎉 What's New 2026-05-31: Paperdl has received a major upgrade: all code has been rewritten to be asynchronous, with support for paper search and download across seven major platforms, including arXiv, OpenReview, ACL Anthology, bioRxiv, medRxiv, PMLR, and PMC OA. The documentation has also been comprehensively optimized. 🧠 Introduction A simple and extensible toolkit for…
Paperdl: A Unified Asynchronous Framework for Scholarly Paper Search and Download. (轻量级论文下载器:支持Arxiv,Scihub,OpenReview,ACL Anthology,bioRxiv,medRxiv,PMLR,PMC等平台)
2026-05-31: Paperdl has received a major upgrade: all code has been rewritten to be asynchronous, with support for paper search and download across seven major platforms, including arXiv, OpenReview, ACL Anthology, bioRxiv, medRxiv, PMLR, and PMC OA. The documentation has also been comprehensively optimized.
🧠 Introduction
A simple and extensible toolkit for searching, organizing, and downloading academic papers from specific websites.
If this project helps your research workflow, please consider giving it a star ⭐. Your support helps more people discover the project and motivates future improvements.
🛡️ Project Disclaimer
This repository is intended for lawful, educational, academic, and research-related purposes only, such as learning Python, exploring academic paper search workflows, and assisting non-profit research or study.
Users are solely responsible for ensuring that their use of this project complies with applicable laws, website terms of service, copyright rules, publisher policies, institutional requirements, and third-party rights. This project must not be used for illegal purposes, copyright infringement, unauthorized access, abusive downloading, or any activity that may harm authors, publishers, platforms, or institutions.
This project is released under the Apache License 2.0. The authors and contributors provide no warranty, commercial authorization, indemnity, or liability commitment beyond the license terms, and are not responsible for any misuse or consequences arising from the use, modification, redistribution, or commercial application of this project.
Most paper clients work without browser dependencies. However, some bioRxiv / medRxiv PDF downloads may require the optional Playwright-based browser fallback.
When using -c all, client-specific search parameters may be required. For example, OpenReview needs a search scope such as venue_id, while clients such as bioRxiv, medRxiv, and PMLR may need scan limits to keep the search fast.
Comma-separated client names, or all. Default: arxiv.
-n, --total-results
Default number of results per client.
--output-json
Save search results to a JSON file.
--input-json
Load paper records from JSON when running download.
--format
Output format: table, json, or jsonl.
--select
Download selection, such as all, top10, or 1,3-5.
-o, --output-dir
Output directory for PDFs.
--overwrite
Overwrite existing PDF files.
--no-dedupe
Disable cross-client deduplication.
--quiet
Disable verbose logs and progress output where possible.
--search-concurrency
Number of clients searched concurrently.
--init-param / --search-param
Constructor or search parameter applied to all clients.
--client-init-param / --client-search-param
Constructor or search parameter applied to one client.
--init-kwargs / --search-kwargs
JSON object applied to all clients.
--client-init-kwargs / --client-search-kwargs
JSON object keyed by client name.
Python Package Usage
(1) Minimal Search Example
import asyncio
from paperdl import PaperClient
async def main():
async with PaperClient(["arxiv"], default_init_kwargs={"verbose": False}) as client:
papers = await client.search("diffusion model", total_results=5)
for paper in papers:
print(paper.title, paper.article_url, paper.download_url)
asyncio.run(main())
client.search(...) returns a list of PaperInfo objects. Common fields include title, abstract, authors, article_url, download_url, doi, arxiv_id, venue, published_at, and source.
(2) Search Multiple Sources
import asyncio
from paperdl import PaperClient
async def main():
async with PaperClient(["arxiv", "pmlr", "acl_anthology"]) as client:
papers = await client.search("large language model", total_results=5)
print(f"found {len(papers)} papers")
asyncio.run(main())
import asyncio
from paperdl import PaperClient
async def main():
async with PaperClient(["arxiv"]) as client:
papers = await client.search("attention is all you need", total_results=1)
paths = await client.download(papers, output_dir="papers")
print(paths)
asyncio.run(main())
评论