You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于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):chmod 600 ~/.kaggle/kaggle.json

核心实现步骤

  1. 下载arXiv元数据文件,筛选指定学科的论文ID
  2. 根据筛选出的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:19