求助:基于Kaggle的arXiv数据集批量PDF下载方案及代码实现
实现从Kaggle arXiv镜像批量下载指定学科PDF的方案
前置准备
- 安装依赖包:
pip install kaggle pandas requests - 配置Kaggle API:
- 登录Kaggle账号,进入「My Account」页面,点击「Create New API Token」下载
kaggle.json - 将
kaggle.json放到对应目录:- Linux/macOS:
~/.kaggle/kaggle.json - Windows:
C:\Users\<你的用户名>\.kaggle\kaggle.json
- Linux/macOS:
- 给文件设置权限(Linux/macOS):
chmod 600 ~/.kaggle/kaggle.json
- 登录Kaggle账号,进入「My Account」页面,点击「Create New API Token」下载
核心实现步骤
- 下载arXiv元数据文件,筛选指定学科的论文ID
- 根据筛选出的ID,批量下载对应PDF文件
完整代码
import os import json import pandas as pd import kaggle from tqdm import tqdm def download_arxiv_pdfs(subject_name, download_count, save_dir="./arxiv_pdfs"): # 定义学科对应的arXiv分类标签(可根据需求扩展) subject_tags = { "Machine Learning": ["cs.LG", "stat.ML"], "Computer Vision": ["cs.CV"], "Natural Language Processing": ["cs.CL"] # 可添加其他学科映射 } # 验证输入学科是否支持 if subject_name not in subject_tags: print(f"不支持的学科:{subject_name},请添加对应分类标签后重试") return # 创建保存目录 os.makedirs(save_dir, exist_ok=True) # 下载arXiv元数据(仅第一次运行需要,后续可注释跳过) print("正在下载元数据文件...") kaggle.api.dataset_download_files("Cornell-University/arxiv", files=["arxiv-metadata-oai-snapshot.json"], unzip=True) # 加载元数据并筛选目标学科论文 print("正在筛选目标学科论文...") metadata_path = "arxiv-metadata-oai-snapshot.json" filtered_ids = [] with open(metadata_path, "r", encoding="utf-8") as f: for line in tqdm(f, total=2400000): # 元数据约240万条 paper = json.loads(line) # 检查论文分类是否包含目标学科标签 for tag in subject_tags[subject_name]: if tag in paper["categories"]: filtered_ids.append(paper["id"]) if len(filtered_ids) >= download_count: break if len(filtered_ids) >= download_count: break if not filtered_ids: print(f"未找到{subject_name}学科的论文") return # 批量下载PDF print(f"开始下载{len(filtered_ids)}份{subject_name}学科PDF...") dataset_name = "Cornell-University/arxiv" pdf_base_path = "pdf/" for paper_id in tqdm(filtered_ids): pdf_file = f"{pdf_base_path}{paper_id}.pdf" try: # 下载单个PDF文件到指定目录 kaggle.api.dataset_download_files( dataset_name, files=[pdf_file], path=save_dir, unzip=True ) # 移除下载的zip文件(因为Kaggle会把单个文件打包成zip) zip_file = os.path.join(save_dir, f"{paper_id}.pdf.zip") if os.path.exists(zip_file): os.remove(zip_file) except Exception as e: print(f"下载{paper_id}.pdf失败: {str(e)}") # 示例调用 if __name__ == "__main__": target_subject = "Machine Learning" target_count = 200 download_arxiv_pdfs(target_subject, target_count)
注意事项
- 元数据文件较大(约2GB),第一次下载耗时较长,后续可注释掉元数据下载代码直接复用本地文件
- Kaggle API有速率限制,批量下载时不要过于频繁,代码中已用
tqdm显示进度 - 部分论文可能没有对应PDF(极少数情况),代码会捕获错误并跳过
- 学科分类标签可根据arXiv官方分类扩展,比如Physics对应的
physics.*等
内容的提问来源于stack exchange,提问作者Syed Siddiq
相关产品推荐
相关产品推荐

