我已经挣扎了大约一个星期来下载这里提到的arXiv文章:http://arxiv.org/help/bulk_data_s3#src。
我尝试了很多东西:s3Browser
,s3cmd
。我能够登录我的存储桶,但我无法从arXiv存储桶下载数据。
我试过了:
s3cmd get s3://arxiv/pdf/arXiv_pdf_1001_001.tar
请参阅:
$ s3cmd get s3://arxiv/pdf/arXiv_pdf_1001_001.tar
s3://arxiv/pdf/arXiv_pdf_1001_001.tar -> ./arXiv_pdf_1001_001.tar [1 of 1]
s3://arxiv/pdf/arXiv_pdf_1001_001.tar -> ./arXiv_pdf_1001_001.tar [1 of 1]
ERROR: S3 error: Unknown error
s3cmd get
与x-amz-request-payer:requester
它再次给了我同样的错误:
$ s3cmd get --add-header="x-amz-request-payer:requester" s3://arxiv/pdf/arXiv_pdf_manifest.xml
s3://arxiv/pdf/arXiv_pdf_manifest.xml -> ./arXiv_pdf_manifest.xml [1 of 1]
s3://arxiv/pdf/arXiv_pdf_manifest.xml -> ./arXiv_pdf_manifest.xml [1 of 1]
ERROR: S3 error: Unknown error
我也尝试过复制该文件夹中的文件。
$ aws s3 cp s3://arxiv/pdf/arXiv_pdf_1001_001.tar .
A client error (403) occurred when calling the HeadObject operation: Forbidden
Completed 1 part(s) with ... file(s) remaining
这可能意味着我犯了一个错误。问题是我不知道如何以及添加什么会传达我的下载付费许可。
我无法弄清楚如何从S3下载数据。我在AWS网站上已经阅读了很多内容,但我无处可以找到解决问题的方法。
如何批量下载arXiv数据?
答案 0 :(得分:12)
尝试下载s3cmd
版本1.6.0
:http://sourceforge.net/projects/s3tools/files/s3cmd/
$ s3cmd --configure
输入您在Amazon AWS网站界面的帐户管理标签中找到的凭据。
$ s3cmd get --recursive --skip-existing s3://arxiv/src/ --requester-pays
答案 1 :(得分:3)
请求者付款是Amazon S3存储桶上的一项功能,需要存储桶用户支付与访问数据相关的数据传输费用。
通常,S3存储桶的所有者支付数据传输费用,但这对于免费/开源项目来说可能很昂贵。因此,水桶所有者可以激活请求者支付以减少他们将被收取的部分费用。
因此,在访问Requester Pays存储桶时,您需要对自己进行身份验证,以便S3知道要收费的人。
我建议使用官方的 AWS Command-Line Interface (CLI) 来访问AWS服务。您可以通过以下方式提供您的凭据:
aws configure
然后通过以下方式查看存储桶:
aws s3 ls s3://arxiv/pdf/
并通过以下方式下载:
aws s3 cp s3://arxiv/pdf/arXiv_pdf_1001_001.tar .
更新:我刚尝试了上述内容,并收到Access Denied
错误消息(桶列表和下载命令)。使用s3cmd
时,会显示ERROR: S3 error: Access Denied
。 看来存储桶上的权限不再允许访问。您应该与存储桶的所有者联系以请求访问。
答案 2 :(得分:2)
在this page的底部,arXiv解释说s3cmd被拒绝,因为它不支持访问请求者付费桶作为非所有者,并且您必须将补丁应用于s3cmd的源代码。但是,他们使用的s3cmd版本已过时,补丁不适用于最新版本的s3cmd。
基本上你需要允许s3cmd添加" x-amz-request-payer"标头为其对桶的HTTP请求。以下是如何解决它:
在__init__
函数的底部添加以下两行代码:
if self.s3.config.extra_headers:
self.headers.update(self.s3.config.extra_headers)
答案 3 :(得分:1)
对我来说问题是我的IAM用户没有足够的权限。
设置AmazonS3FullAccess
是我的解决方案。
希望它能节省时间给某人
答案 4 :(得分:1)
不想抢风头,但 OttoV 的评论实际上给出了对我有用的正确命令。
aws s3 ls --request-payer requester s3://arxiv/src/
我的 EC2 位于区域 us-east-2,但 arXiv s3 存储桶位于区域 us-east-1,所以我认为这就是需要 --request-payer requester
的原因。
来自https://aws.amazon.com/s3/pricing/?nc=sn&loc=4:
<块引用>您为进出 Amazon S3 的所有带宽付费,以下情况除外:
• 从互联网传输的数据。
• 数据传出到 Amazon Elastic Compute Cloud (Amazon EC2) 实例,当该实例与 S3 存储桶位于同一 AWS 区域时(包括传输到同一 AWS 区域中的不同账户)。
• 数据传出到 Amazon CloudFront (CloudFront)。