Загрузка скрап-файла как использовать пользовательское имя файла
Для моего проекта scrapy я в настоящее время использую FilesPipeline. Загруженные файлы хранятся с хэшем SHA1 их URL-адресов в качестве имен файлов.
[(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
}
Был задананалогичный вопрос , но он нацелен на изображения, а не на файлы.
Любая помощь будет оценена по достоинству.2 ответа:
file_path
следует вернуть путь к вашему файлу. В кодеfile_path
возвращаетitem['name']
, и это будет путь к вашему файлу. Обратите внимание, что по умолчаниюfile_path
вычисляет хэши SHA1 . Поэтому ваш метод должен быть примерно таким: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
Попробуйте использовать этот метод
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)
(Примечание: это непроверенный код)