如何通过Amazon S3批量下载ArXiv文件及处理请求付费存储桶
解决ArXiv请求付费S3存储桶的文件列表获取与下载问题
1. 获取ArXiv请求付费存储桶中的文件列表
ArXiv的公开S3存储桶名为arxiv,属于请求付费(Requester Pays)类型。要获取其中的文件列表(如src/ArXiv_src_manifest.xml),需通过boto3调用S3接口时指定RequestPayer='requester'参数,否则会返回权限错误。
示例代码:
import boto3 # 初始化S3客户端 s3 = boto3.client('s3') bucket_name = 'arxiv' # 目标前缀,比如只查看src目录下的文件 prefix = 'src/' # 列出前缀下的所有对象 response = s3.list_objects_v2( Bucket=bucket_name, Prefix=prefix, RequestPayer='requester' ) # 输出文件键名 for obj in response.get('Contents', []): print(obj['Key']) # 验证特定文件是否存在 target_key = 'src/ArXiv_src_manifest.xml' try: s3.head_object( Bucket=bucket_name, Key=target_key, RequestPayer='requester' ) print(f"文件 {target_key} 存在") except s3.exceptions.ClientError as e: print(f"文件 {target_key} 不存在或无法访问: {e}")
说明:
- 需提前配置AWS凭证(通过
~/.aws/credentials文件或环境变量),请求费用会计入你的AWS账号。 - 若文件数量过多,
list_objects_v2会分页返回,需通过NextContinuationToken遍历所有结果。
2. 使用boto3下载存储桶中的文件并设置请求付费参数
下载操作同样需要携带RequestPayer='requester'参数,以下两种方式均可实现:
方法一:直接下载到本地文件
import boto3 s3 = boto3.client('s3') bucket_name = 'arxiv' file_key = 'src/arXiv_src_1001_001.tar' local_save_path = './arXiv_src_1001_001.tar' # 下载并保存到本地 s3.download_file( Bucket=bucket_name, Key=file_key, Filename=local_save_path, ExtraArgs={'RequestPayer': 'requester'} )
方法二:读取文件内容到内存再写入本地
import boto3 s3 = boto3.client('s3') bucket_name = 'arxiv' file_key = 'src/arXiv_src_1001_001.tar' # 获取文件内容 response = s3.get_object( Bucket=bucket_name, Key=file_key, RequestPayer='requester' ) # 将内容写入本地文件 with open('./arXiv_src_1001_001.tar', 'wb') as f: f.write(response['Body'].read())
关键注意事项:
- 确保AWS账号有足够权限访问请求付费存储桶。
- 所有操作产生的请求费用、流量费用均由你的账号承担,批量操作前建议确认定价。
内容的提问来源于stack exchange,提问作者ShoutOutAndCalculate
相关产品推荐
相关产品推荐

