Scrapy文件下载如何使用自定义文件名

2024-05-02

For my scrapy http://doc.scrapy.org/index.html我目前正在使用的项目文件管道 https://doc.scrapy.org/en/latest/topics/media-pipeline.html#scrapy.pipelines.files.FilesPipeline。下载的文件以其 URL 的 SHA1 哈希值作为文件名进行存储。

[(True,
  {'checksum': '2b00042f7481c7b056c4b410d28f33cf',
   'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
   'url': 'http://www.example.com/files/product1.pdf'}),
 (False,
  Failure(...))]

如何使用自定义文件名来存储文件?

在上面的例子中,我希望文件名是“产品1_0a79c461a4062ac383dc4fade7bc09f1384a3910.pdf”所以我保持唯一性但使文件名可见。

作为起点,我探索了pipelines.py我的项目没有取得太大成功。

import scrapy
from scrapy.pipelines.images import FilesPipeline
from scrapy.exceptions import DropItem

class MyFilesPipeline(FilesPipeline):

    def file_path(self, request, response=None, info=None):
        return request.meta.get('filename','')

    def get_media_requests(self, item, info):
        file_url = item['file_url']
        meta = {'filename': item['name']}
        yield Request(url=file_url, meta=meta)

将此参数包含在我的settings.py

ITEM_PIPELINES = {
    #'scrapy.pipelines.files.FilesPipeline': 300
    'io_spider.pipelines.MyFilesPipeline': 200
}

A 类似的问题 https://stackoverflow.com/questions/6194041/scrapy-image-download-how-to-use-custom-filename/22263951已被询问,但它确实针对图像而不是文件。

任何帮助将不胜感激。


file_path应该返回您的文件的路径。在你的代码中,file_path回报item['name']这将是你的文件的路径。请注意,默认情况下file_path 计算 SHA1 哈希值 https://github.com/scrapy/scrapy/blob/master/scrapy/pipelines/files.py#L464。所以你的方法应该是这样的:

def file_path(self, request, response=None, info=None):
    original_path = super(MyFilesPipeline, self).file_path(request, response=None, info=None)
    sha1_and_extension = original_path.split('/')[1] # delete 'full/' from the path
    return request.meta.get('filename','') + "_" + sha1_and_extension
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy文件下载如何使用自定义文件名 的相关文章

随机推荐