У меня есть вложенный элемент скрапа.
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_item
ImagesPipeline
еще раз и дождитесь, пока он вернет товар.Но я не уверен, как именно это сделать.В обычном конвейере я просто вызываю методы рекурсивно, но теперь мне нужно вручную передать parent_item
классу конвейера и дождаться его возврата?
Если я извлечу все URL-адреса изображений из вложенных элементов и проанализирую все в одномиди, тогда мне позже нужно будет выяснить, какое изображение было с какого предмета и т. д. Я не уверен, будет ли это легко.Вероятно, потребуется хэшировать все URL-адреса и сравнить с именами файлов и т. Д. Это может стать грязным ...
Есть идеи?
Спасибо!