如何访问 Scrapy 项目管道中的所有抓取项目



我有一个项目有一个排名字段,必须通过分析其他项目类来构建。我不想使用数据库或其他后端来存储它们 - 我只需要访问所有当前抓取的项目并对它们做一些迭代工具魔法 - 如何在 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 中启用扩展。

最新更新