Загрузка структурированного изображения в конвейере
РЕДАКТИРОВАТЬ:
Это не дубликат старой версии 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 ответ
Я не совсем уверен, что вы пытаетесь сделать в этом конвейере, но что-то кажется очень неправильным. Вполне возможно, что я полностью неправильно понял, что вы пытались сделать, поэтому в этом случае, пожалуйста, уточните подробности вашей реализации.
А пока вот несколько вещей, которые могут быть проблематичными:
Вы должны наследовать от ImagesPipeline, если ваша цель - изменить поведение по умолчанию для этого конвейера. Вы также должны убедиться, что ваш конвейер включен в
settings.py
,Метод
process_item()
должен вернуть объект Item() или поднятьDropItem()
исключение, но вы возвращаете строку? И что еще хуже, это строка, созданная путем неявного приведения объекта объекта в строку? Это не имеет смысла в этом контексте. Даже меньше, если вы считаете, что вы не должны переопределять этот метод в ImagesPipeline.У вас нет реализации, если
item_completed()
, это метод, который вызывается, когда все запросы изображений для одного элемента завершены (либо завершилась загрузка, либо произошел сбой по какой-либо причине). Оттуда вы можете увидеть путь, по которому загружено изображение, и переместить его, если необходимо.
Пожалуйста, ознакомьтесь с официальной документацией для загрузки изображений предметов на официальной документации для дальнейшего уточнения.