我有一个嵌套的刮板物品。
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
,那么我再递归...
当函数返回时,它们返回一个ID值,因此我知道已完成操作。例如,经过处理后,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进行哈希处理并与文件名等进行比较。它可能会变得混乱...
有什么想法吗?
谢谢!