2017-10-31 13 views
1

私のscrapyプロジェクトでは、現在FilesPipelineを使用しています。ダウンロードしたファイルは、ファイル名としてURLのSHA1ハッシュで保存されます。治療ファイルのダウンロード方法カスタムファイル名の使用方法

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

カスタムファイル名を使用してファイルを保存するにはどうすればよいですか?上記の例では

、私はので、私は一意に保つが、ファイル名が表示されるよう、ファイル名が「product1_0a79c461a4062ac383dc4fade7bc09f1384a3910.pdf」ているのでしょう。

私のプロジェクトのpipelines.pyを出発点として、多くの成功を収めました。私settings.py

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

でこのパラメータを含めると

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) 

similar questionが求められてきたが、それは、対象画像ではなくファイルを行います。

ご協力いただければ幸いです。

答えて

2

file_pathは、ファイルへのパスを返す必要があります。あなたのコードでfile_pathitem['name']を返し、それがファイルのパスになります。デフォルトではfile_pathcalculates SHA1 hashesです。だからあなたの方法は、このようなものでなければなりません:

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 
+1

おかげで、これは私が期待していたヘルプです - 私の文脈であなたのコードにちょっとした問題がありました。最後の例はリストを文字列に連結して、リストの最初の項目を明示的に選択しなければならなかった 'return request.meta.get( 'filename'、 '')[0] + "_" + sha1_and_extension' – Michael

0

このfile_pathメソッドを使用してみてください:

def file_path(self, request, response=None, info=None): 
    url = request if not isinstance(request, Request) else request.url 
    media_guid = hashlib.sha1(to_bytes(url)).hexdigest() 
    path, media_ext = os.path.splitext(url) 
    media_name = os.path.split(path)[1] 
    return '%s_%s%s' % (media_name, media_guid, media_ext) 

(注:これは未テストコードです)

関連する問題