Загрузка структурированного изображения в конвейере

РЕДАКТИРОВАТЬ:
Это не дубликат старой версии scrapy. Scrapy недавно изменился за последние годы, и текущая версия составляет 0,24

За несколько лет развития Scrapy значительно изменилась. Большая часть ответа от stackru относительно scrapy устарела.

Я использую scrapy 0.24.4 и хочу загружать изображения отдельно для каждой ссылки. Прямо сейчас, используя документацию scrapy, я могу загрузить изображения, но они находятся только в одной папке.

Я использую приведенный ниже код, поэтому он сохраняется в отдельной папке для каждого URL-адреса, но не может его достичь. Этот код даже не запускается, он находится в pipelines.py. Выполняется только поведение конвейера изображений по умолчанию, т.е. он загружает каждый URL в элементе ['image_urls'].

pipelines.py

import scrapy
from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
import urlparse 
import urllib

class RecursiveScrapPipeline(object):

    """Custom Image to save in Structured folder """

    def process_item(self, item, spider):
        #item currently is image name
        image_guid =  item

        return "%s/full/%s.jpg"% (id,image_guid)
    #this should work , exactly as per documentation 



    def get_media_requests(self, item, info):

        for image_url in item['image_urls']:
            yield scrapy.Request(image_url,meta={'id':item['Property_name']})

Я на правильном пути? Какое может быть решение?

1 ответ

Я не совсем уверен, что вы пытаетесь сделать в этом конвейере, но что-то кажется очень неправильным. Вполне возможно, что я полностью неправильно понял, что вы пытались сделать, поэтому в этом случае, пожалуйста, уточните подробности вашей реализации.

А пока вот несколько вещей, которые могут быть проблематичными:

  1. Вы должны наследовать от ImagesPipeline, если ваша цель - изменить поведение по умолчанию для этого конвейера. Вы также должны убедиться, что ваш конвейер включен в settings.py,

  2. Метод process_item() должен вернуть объект Item() или поднять DropItem() исключение, но вы возвращаете строку? И что еще хуже, это строка, созданная путем неявного приведения объекта объекта в строку? Это не имеет смысла в этом контексте. Даже меньше, если вы считаете, что вы не должны переопределять этот метод в ImagesPipeline.

  3. У вас нет реализации, если item_completed(), это метод, который вызывается, когда все запросы изображений для одного элемента завершены (либо завершилась загрузка, либо произошел сбой по какой-либо причине). Оттуда вы можете увидеть путь, по которому загружено изображение, и переместить его, если необходимо.

Пожалуйста, ознакомьтесь с официальной документацией для загрузки изображений предметов на официальной документации для дальнейшего уточнения.

Другие вопросы по тегам