2

我有一个项目,它有一个排名字段,必须通过分析其他项目类来构建。我不想使用数据库或其他后端来存储它们——我只需要访问所有当前抓取的项目并对它们做一些 itertools 魔法——在蜘蛛完成之后但在我们导出数据之前我怎么能做到这一点(所以排名字段赢了'不是空的)?

4

3 回答 3

4

我认为信号可能会有所帮助。我在这里做了类似的事情

https://github.com/dm03514/CraigslistGigs/blob/master/craigslist_gigs/pipelines.py

这似乎有点 hacky,但在你的蜘蛛中,你可以创建一个属性来存储你所有的 Scraped 项目。在您的管道中,您可以注册一个在蜘蛛关闭信号上调用的方法。此方法将蜘蛛实例作为参数。然后,您可以访问包含所有已抓取项目的蜘蛛属性

于 2012-10-07T13:50:01.937 回答
1

此管道将确保所有项目都有一个等级。

class MyPipeline(object):

    def process_item(self, item, spider):
        item['rank'] = item.get('rank') or '1'
        return item
于 2012-10-13T02:30:51.517 回答
0

您可以使用ExtensionsSignals收集所有抓取的项目。

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.

于 2021-08-29T22:19:22.037 回答