我在询问scrapy框架。
我在抓一个商业页面。首先我添加带有商业名称的品牌项目(我有品牌表),然后我想添加几个商业地点(BusinessLocations表)但我需要数据库BrandId将业务地点插入数据库。然后我添加了几个关于每个业务位置的部门的记录,我再次需要数据库BusinessLocationId来插入每个部门。
假设我将项目插入管道中的数据库。
我可以简单地假设之前处理过的项目已经离开了管道并且在数据库中吗?在这种情况下,我可以使用通过元数据传递的一些文本唯一字段从数据库中选择所需的Id。
但是我认为可能存在竞争条件,因为scrapy同时处理多个请求。根据竞争条件,我的意思是在将适当的Brand插入数据库之前添加BusinessLocation项。 是否存在这种竞争条件的风险?
答案 0 :(得分:1)
我可以简单地假设先前处理的项目已经离开管道并且在数据库中吗?
一般来说,没有。
高度重视您在管道中的工作。例如,如果您使用图像管道,那么带有图像的项目将由图像管道保持,直到检索到所有图像,同时没有图像或极少数图像的项目将传递到前一项目之前的下一个管道。 / p>
您可以收集主项目对象中的子项目,将项目传递给子请求,但是您必须关心是否处理错误以避免丢失不完整的项目。另一种方法是将项目存储在临时数据库中,然后合并查找孤立记录。
答案 1 :(得分:1)
我找到了解决方法如何等待,直到所有数据都被抓取 - 在关闭蜘蛛之后调用管道的close_spider方法。
class BlsPipeline100(object):
def __init__(self):
self.items = []
def process_item(self, item, spider):
self.items.append(item)
return item
def close_spider(self, spider):
processAllItems()
现在我可以创建可以访问所有项目的层次结构。