我有一个项目有一个排名字段,必须通过分析其他项目类来构建。我不想使用数据库或其他后端来存储它们 - 我只需要访问所有当前抓取的项目并对它们做一些迭代工具魔法 - 如何在 spider 完成后但在我们导出数据之前执行此操作(因此排名字段不会为空)?
我认为信号可能会有所帮助。 我在这里做了类似的事情
https://github.com/dm03514/CraigslistGigs/blob/master/craigslist_gigs/pipelines.py
这似乎有点笨拙,但是在您的蜘蛛中,您可以创建一个属性来存储所有抓取的项目。 在你的管道中,你可以注册一个方法,在蜘蛛关闭信号上调用。 此方法将爬虫实例作为参数。 然后,您可以访问包含所有抓取项目的 spider 属性
此管道将确保所有项目都有一个排名。
class MyPipeline(object):
def process_item(self, item, spider):
item['rank'] = item.get('rank') or '1'
return item
您可以使用扩展和信号收集所有抓取的项目。
from scrapy import signals
class ItemCollectorExtension:
def __init__(self):
self.items = []
@classmethod
def from_crawler(cls, crawler):
extension = cls()
crawler.signals.connect(extension.add_item, signal=signals.item_scraped)
crawler.signals.connect(extension.spider_closed, signal=signals.spider_closed)
return extension
def spider_closed(self):
print(self.items) # Replace with your code
def add_item(self, item):
self.items.append(item)
现在,每次成功抓取新项目时,它都会添加到 self.items
.当收集完所有物品并且蜘蛛关闭时,将调用spider_closed
函数。在这里,您可以访问所有收集的项目。
不要忘记在 settings.py
中启用扩展。