2017-10-31 10 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를 탐험했다. 이 매개 변수의 포함과

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 
} 

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) 

(참고 :이 테스트되지 않은 코드)