想象一下有以下方法调用:
parse() -> parseProductPage() -> parseUser() (indirectly?) -> process_item()
-> parseCategory() (indirectly?) -> process_item()
-> parseProduct() (indirectly?) -> process_item()
process_item()属于某个管道类,负责将每个项目插入数据库并返回相应的ID (由MongoDB动态生成,在插入之前不存在)。所有其他方法都属于爬行器类,并以递归方式生成。
现在,我想要的是在返回的过程中访问每个ID,但问题是产生的值只对初始调用者可访问(parent?parse())。
由于process_item()可以访问调用爬行器,因此解决这个问题的一种方法是将每个ID都写入相应的成员变量,但在我看来,这是一个糟糕的设计架构,其中可能会出现很多问题。还有别的选择吗?
@Edit我想我可以将创建关系的逻辑转移到管道中,但是它真的是这样的吗?
发布于 2019-07-17 13:08:01
如果parseProduct
需要来自parseUser
的输入,或者反过来,您必须使MongoDB客户端成为爬行器的一部分,这需要一些Twisted知识,可能还需要一个基于Twisted的MongoDB客户端,以便在MongoDB请求期间不阻止Scrapy。
或者,更简单的方法是使用原始数据生成输出文件,然后编写单独的脚本来解析该文件并根据需要将数据发送到MongoDB。
https://stackoverflow.com/questions/56998686
复制相似问题