scrapy 将图像存储到 Amazon S3

1 投票
3 回答
1358 浏览
提问于 2025-04-21 00:18

我把图片存储在本地服务器上,然后再上传到亚马逊的S3云存储。
现在我想直接把图片存储到亚马逊S3上。

但是出现了错误:

boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

这是我的settings.py文件

AWS_ACCESS_KEY_ID = "XXXX"
AWS_SECRET_ACCESS_KEY = "XXXX"
IMAGES_STORE = 's3://how.are.you/'

我需要添加什么吗?

我使用的Scrapy版本是:Scrapy==0.22.2

请给我一些指导,谢谢!

3 个回答

0

我觉得问题不在你的代码上,实际上问题出在权限上。请先检查一下你的凭证,确保你有权限访问和写入S3存储桶。

    import boto
    s3 = boto.connect_s3('access_key', 'secret_key')
    bucket = s3.lookup('bucket_name')
    key = bucket.new_key('testkey')
    key.set_contents_from_string('This is a test')
    key.delete()

如果测试成功了,那就去看看你的权限设置。关于如何设置权限,你可以参考一下亚马逊的配置文档

1
AWS_ACCESS_KEY_ID = "xxxxxx"
AWS_SECRET_ACCESS_KEY = "xxxxxx"
IMAGES_STORE = "s3://bucketname/virtual_path/"

how.are.you 应该是你在 S3 账户里存在的一个存储桶,它会用来存放你上传的图片。如果你想把图片放在某个 虚拟路径 下,那么你需要在你的 S3 存储桶里创建这个文件夹。

0

我发现问题的原因是上传策略。函数 Key.set_contents_from_string() 有一个参数叫policy,默认值是S3FileStore.POLICY。所以你需要修改 scrapy/contrib/pipeline/files.py 里的代码,把

 return threads.deferToThread(k.set_contents_from_string, buf.getvalue(),
                              headers=h, policy=self.POLICY)

改成

 return threads.deferToThread(k.set_contents_from_string, buf.getvalue(),
                              headers=h)

你可以试试看,然后把结果分享在这里。

撰写回答