Scrapy Image скачать как использовать пользовательское имя файла - PullRequest
14 голосов
/ 01 июня 2011

Для моего проекта scrapy я сейчас использую ImagesPipeline .Загруженные изображения хранятся с хэшем SHA1 их URL-адресов в качестве имен файлов.

Как я могу хранить файлы, используя мои собственные имена файлов?

Что, если мое имя файла должно содержать другое очищенное поле из того же элемента?например, используйте item['desc'] и имя файла для изображения с item['image_url'].Если я правильно понимаю, это потребует доступа к другим полям элементов из конвейера изображений.

Любая помощь будет оценена.

Ответы [ 6 ]

16 голосов
/ 08 марта 2014

Это просто актуализация ответа на скрап 0.24 (РЕДАКТИРОВАНИЕ), где image_key() устарела

class MyImagesPipeline(ImagesPipeline):

    #Name download version
    def file_path(self, request, response=None, info=None):
        #item=request.meta['item'] # Like this you can use all from item, not just url.
        image_guid = request.url.split('/')[-1]
        return 'full/%s' % (image_guid)

    #Name thumbnail version
    def thumb_path(self, request, thumb_id, response=None, info=None):
        image_guid = thumb_id + response.url.split('/')[-1]
        return 'thumbs/%s/%s.jpg' % (thumb_id, image_guid)

    def get_media_requests(self, item, info):
        #yield Request(item['images']) # Adding meta. Dunno how to put it in one line :-)
        for image in item['images']:
            yield Request(image)
12 голосов
/ 08 сентября 2011

В скрабе 0,12 я решил что-то вроде этого

class MyImagesPipeline(ImagesPipeline):

    #Name download version
    def image_key(self, url):
        image_guid = url.split('/')[-1]
        return 'full/%s.jpg' % (image_guid)

    #Name thumbnail version
    def thumb_key(self, url, thumb_id):
        image_guid = thumb_id + url.split('/')[-1]
        return 'thumbs/%s/%s.jpg' % (thumb_id, image_guid)

    def get_media_requests(self, item, info):
        yield Request(item['images'])
8 голосов
/ 01 июня 2011

Так я решил проблему в Scrapy 0.10. Проверьте метод persist_image для FSImagesStoreChangeableDirectory. Имя файла загруженного изображения - ключ

class FSImagesStoreChangeableDirectory(FSImagesStore):

    def persist_image(self, key, image, buf, info,append_path):

        absolute_path = self._get_filesystem_path(append_path+'/'+key)
        self._mkdir(os.path.dirname(absolute_path), info)
        image.save(absolute_path)

class ProjectPipeline(ImagesPipeline):

    def __init__(self):
        super(ImagesPipeline, self).__init__()
        store_uri = settings.IMAGES_STORE
        if not store_uri:
            raise NotConfigured
        self.store = FSImagesStoreChangeableDirectory(store_uri)
7 голосов
/ 22 января 2017

Я нашел свой путь в 2017 году, scrapy 1.1.3

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

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

, как и в приведенном выше коде, вы можете добавить имя, которое вы хотите, к мета запроса в get_media_requests(), и вернуть его обратно в file_path() по request.meta.get('yourname','').

2 голосов
/ 21 февраля 2014

Я сделал неприятный быстрый взлом для этого. В моем случае я сохранил название изображения в своих каналах. И у меня было только 1 image_urls на элемент, поэтому я написал следующий скрипт. Он в основном переименовывает файлы изображений в каталоге /images/full/ с соответствующим заголовком в фиде элементов, который я сохранил, как json.

import os
import json

img_dir = os.path.join(os.getcwd(), 'images\\full')
item_dir = os.path.join(os.getcwd(), 'data.json')

with open(item_dir, 'r') as item_json:
    items = json.load(item_json)

for item in items:
    if len(item['images']) > 0:
        cur_file = item['images'][0]['path'].split('/')[-1]
        cur_format = cur_file.split('.')[-1]
        new_title = item['title']+'.%s'%cur_format
        file_path = os.path.join(img_dir, cur_file)
        os.rename(file_path, os.path.join(img_dir, new_title))

Это противно и не рекомендуется. Но это наивный альтернативный подход.

0 голосов
/ 08 апреля 2015

Я переписываю код, меняя, в thumb_path def, «ответ». по запросу.". Если нет, это не сработает, потому что «response установлен на None».

class MyImagesPipeline(ImagesPipeline):

    #Name download version
    def file_path(self, request, response=None, info=None):
        #item=request.meta['item'] # Like this you can use all from item, not just url.
        image_guid = request.url.split('/')[-1]
        return 'full/%s' % (image_guid)

    #Name thumbnail version
    def thumb_path(self, request, thumb_id, response=None, info=None):
        image_guid = thumb_id + request.url.split('/')[-1]
        return 'thumbs/%s/%s.jpg' % (thumb_id, image_guid)

    def get_media_requests(self, item, info):
        #yield Request(item['images']) # Adding meta. Dunno how to put it in one line :-)
        for image in item['images']:
            yield Request(image)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...