当上传到S3时,如何为一个项目中的多个文件url定制一个路径?

2024-10-02 00:43:18 发布

您现在位置:Python中文网/ 问答频道 /正文

从我的理解是,为了让我使用文件管道,我需要包括这些到设置.py公司名称:

AWS_ACCESS_KEY_ID = 'access key'
AWS_SECRET_ACCESS_KEY= 'secret'
FILES_STORE = 's3://bucket/'

我需要将这些添加到我的Item对象中

^{pr2}$

结果是这样的:

{'file_urls': ['http://i.stack.imgur.com/tKsDb.png',
                'http://i.stack.imgur.com/NAGkl.png'],
 'files': [{'checksum': 'b0974ea6c88740bed353206b279e0827',
             'path': 'full/762f5682798c5854833316fa171c71166e284630.jpg',
             'url': 'http://i.stack.imgur.com/tKsDb.png'},
            {'checksum': '9a42f7bd1dc45840312fd49cd08e6a5c',
             'path': 'full/615eabb7b61e79b96ea1ddb34a2ef55c8e0f7ec3.jpg',
             'url': 'http://i.stack.imgur.com/NAGkl.png'}]}

据我所知,文件管道将自动填充images字段。在

我的问题是,有没有必要更改图像字段中的“路径”值?在我的例子中,我想在不同的子目录下存储许多不同的条目,它们都是由同一个spider抓取的,有没有一种方法可以做到这一点,例如创建和扩展我自己的文件管道?如果是这样,我该如何处理?在

我还需要提到,我传递2个不同的网址与1个项目,我想他们是在不同的目录

(也是的,我知道它们是图像,我只是用它作为例子,因为它们是我最先发现的)


Tags: 文件pathkeycomawshttp管道access
1条回答
网友
1楼 · 发布于 2024-10-02 00:43:18

是的,如果您查看scrapy files管道here的源代码,这是可能的

您将看到它有一些可以重写的方法,其中之一是file_path方法,您可以通过将其添加到管道类中来覆盖它,如下所示

    def file_path(self, request, response=None, info=None):
    # start of deprecation warning block (can be removed in the future)
        def _warn():
            from scrapy.exceptions import ScrapyDeprecationWarning
            import warnings
            warnings.warn('FilesPipeline.file_key(url) method is deprecated,\
            please use file_path(request, response=None, info=None) instead',
                      category=ScrapyDeprecationWarning, stacklevel=1)

    # check if called from file_key with url as first argument
    if not isinstance(request, Request):
        _warn()
        url = request
    else:
        url = request.url

    # detect if file_key() method has been overridden
    if not hasattr(self.file_key, '_base'):
        _warn()
        return self.file_key(url)
    # end of deprecation warning block

    # Modify the file path HERE to your own custom path 
    filename = request.meta['filename']
    media_ext = 'jpg'
    return '%s/%s/%s.%s' % \
        (request.meta['image_category'],
            request.meta['image_month'],
            filename, media_ext)

其结果将是一个目录,如:

^{pr2}$

如果您查看代码的最后几行[这是我添加的唯一代码,其余的代码是因为该方法来自于蹩脚的源代码]

    # Modify the file path HERE to your own custom path 
    filename = request.meta['filename']
    media_ext = 'jpg'
    return '%s/%s/%s.%s' % \
        (request.meta['image_category'],
            request.meta['image_month'],
            filename, media_ext)

返回自定义路径 现在这个路径依赖于一些东西,在spider上,您可以收集图像元字段,如图像名的文件名、图像类别和其他任何图像拍摄日期等,并在管道中使用它来创建一个自定义目录

相关问题 更多 >

    热门问题