Scrapy вложенный элемент изображения конвейера - PullRequest
0 голосов
/ 13 мая 2019

У меня есть вложенный элемент скрапа.

class MyItem(scrapy.Item):
    name= scrapy.Field()
    sub_item_id = scrapy.Field()
    sub_item = scrapy.Field() # Another MyItem()
    image_urls = scrapy.Field()
    image_paths = scrapy.Field()

Я написал свой конвейер, поэтому, если MyItem() имеет parent_item, тогда я повторяю и обрабатываю сначала parent_item, а если parent_item имеет собственный parent_item затем я повторяю снова ...

Когда функции возвращаются назад, они возвращают значение идентификатора, поэтому я знаю, что было сделано.Например, после обработки item1->item2->item3 может иметь вид:

item1['name'] = 'item1'
item1['sub_item_id'] = 10
item1['sub_item'] = item2

item2['name'] = 'item2'
item2['parent_item_id'] = 15
item2['parent_item'] = item3

item3['name'] = 'item3'
item3['parent_item_id'] = None
item3['parent_item'] = None

Поэтому в моей базе данных есть поля id, parent_id, name, и при вводе элементов я могу ввести правильные parent_id

Это прекрасно работает для обычных конвейеров предметов.Но сейчас я пытаюсь сделать то же самое, используя ImagesPipeline Но ImagesPipeline выполняет get_media_requests(), а затем возвращает результаты в item_completed().С другими конвейерами я могу вызывать внутренние методы, чтобы углубиться во вложенную Item структуру.Таким образом, вопрос заключается в том, как я могу работать с вложенными Item с, начиная с депеша, начиная с ImagesPipeline?

. Как я себе представляю, мне нужно будет набрать get_media_requests() и отправить parent_itemImagesPipeline еще раз и дождитесь, пока он вернет товар.Но я не уверен, как именно это сделать.В обычном конвейере я просто вызываю методы рекурсивно, но теперь мне нужно вручную передать parent_item классу конвейера и дождаться его возврата?

Если я извлечу все URL-адреса изображений из вложенных элементов и проанализирую все в одномиди, тогда мне позже нужно будет выяснить, какое изображение было с какого предмета и т. д. Я не уверен, будет ли это легко.Вероятно, потребуется хэшировать все URL-адреса и сравнить с именами файлов и т. Д. Это может стать грязным ...

Есть идеи?

Спасибо!

...