爬虫对象与蜘蛛和管道对象之间的关系是什么?

时间:2017-12-25 23:24:04

标签: python scrapy

enter image description here

我正在使用scrapy。我的pipieline开头是:

class DynamicSQLlitePipeline(object):

    @classmethod
    def from_crawler(cls, crawler):
        # Here, you get whatever value was passed through the "table" parameter
        table = getattr(crawler.spider, "table")
        return cls(table)

    def __init__(self,table):
        try:
            db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
            db = dataset.connect(db_path)
            table_name = table[0:3]  # FIRST 3 LETTERS
            self.my_table = db[table_name]

我一直在阅读https://doc.scrapy.org/en/latest/topics/api.html#crawler-api,其中包含:

  

Scrapy API的主要入口点是Crawler对象,通过from_crawler类方法传递给扩展。此对象提供对所有Scrapy核心组件的访问,这是扩展访问它们并将其功能挂钩到Scrapy的唯一方法。

但仍然不了解from_crawler方法和crawler对象。爬虫对象与蜘蛛和管道对象之间的关系是什么?如何以及何时实例化爬虫?蜘蛛是爬虫的子类吗?我问Passing scrapy instance (not class) attribute to pipeline,但我不明白这些部分是如何组合在一起的。

1 个答案:

答案 0 :(得分:2)

Crawler实际上是Scrapy架构中最重要的对象之一。它是爬行执行逻辑的核心部分,它将许多其他部分“粘合”在一起:

  

Scrapy API的主要入口点是传递给的Crawler对象   通过from_crawler类方法扩展。这个对象提供   访问所有Scrapy核心组件,这是唯一的方法   访问它们并将其功能挂钩到Scrapy的扩展。

抓取工具或多个抓取工具由CrawlerRunnerCrawlerProcess实例控制。

现在,许多Scrapy组件上可用的from_crawler方法只是这些组件可以访问运行此特定组件的crawler实例的一种方式。

另外,请查看Crawler, CrawlerRunner and CrawlerProcess actual implementations

而且,我个人认为有助于更好地理解Scrapy内部如何工作的是从脚本运行蜘蛛 - check out these detailed step-by-step instructions