假设有以下方法调用:
parse() -> parseProductPage() -> parseUser() (indirectly?) -> process_item()
-> parseCategory() (indirectly?) -> process_item()
-> parseProduct() (indirectly?) -> process_item()
process_item()属于某个管道类,负责将每个项目插入数据库并返回相应的ID(由MongoDB动态生成,在插入之前不存在)。所有其他方法都属于蜘蛛类,并且递归产生。
现在,我想要的是访问返回路径上的每个ID,但是问题在于,产生的值只能由初始调用方(parse()的父级)访问。
由于process_item()可以访问调用程序蜘蛛,因此解决此问题的一种方法是将每个ID写入相应的成员变量,但是在我看来,这就像一个糟糕的设计体系结构,其中很多事情可能出错。有其他选择吗?
@Edit我想我可以将关系创建逻辑转移到管道中,但这真的意味着那样吗?
答案 0 :(得分:0)
如果parseProduct
要求parseUser
或其他方式的输入,则必须使MongoDB客户端成为蜘蛛的一部分,这需要一些Twisted知识,并且可能需要基于Twisted的MongoDB客户端才能阻止在MongoDB请求期间进行抓取。
或者,简单地用原始数据生成输出文件并编写一个单独的脚本来解析该文件,然后根据需要将数据发送到MongoDB可能会更容易。