【问题标题】:What is crawler and how does it make a difference in the whole scrapy project?什么是爬虫,它对整个scrapy项目有何影响?
【发布时间】:2017-08-28 04:04:56
【问题描述】:

https://docs.scrapy.org/en/latest/topics/item-pipeline.html#from_crawler https://docs.scrapy.org/en/latest/topics/api.html#crawler-api

看了官方文档,我还是有问题理解crawler。我很清楚其他组件(spideritem&its loaderpipelinesettings)。

但是crawler 如何以及何时影响整个过程? crawler 如何使其可扩展?

例如:我编写了一个项目管道,以便将数据填充到 MongoDB。

import pymongo
class MyPipeline(object):
    collection_name = "mydb"

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.get("MONGO_URI", "mongodb://test/"), crawler.settings.get("MONGO_DATABASE", "mydb"))

    def open_spider(self, spider):
        self.client_connection = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client_connection[self.mongo_db]

    def close_spider(self, spider):
        self.client_connection.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item

似乎pipeline 可以通过from_crawler 方法访问crawlerfrom_crawler 方法返回一个带有设置的初始化 pipeline 实例。

为什么不直接从scrapy.settings 导入我的自定义设置,而不是使用crawler

请原谅我问了太多问题:)

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    文档states

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

    at the code 来看,我会将Crawler 描述为“围绕用户特定蜘蛛并与其他核心组件进行通信的核心组件”,因为Crawler 可以访问SpiderEngine.

    您不希望直接从scrapy.settings 导入设置,因为这些设置不会根据设置优先级包含所有正确设置。在scrapy中有几个地方可以用specific precedence进行设置:

    1. 命令行选项(最高优先级)
    2. 按蜘蛛设置
    3. 项目设置模块
    4. 每个命令的默认设置
    5. 默认全局设置(优先级较低)

    如果使用scrapy.settings.default_settings,则只能获得最低级别的优先级。项目特定设置(已与较低优先级 4 和 5 结合)例如将使用scrapy.utils.project.get_project_settings 检索。如您所见,这不再是scrapy.settings 的一部分。

    现在,您问题的有趣部分是蜘蛛特定设置(第 2 级)。这些完全添加在class Crawler

    self.spidercls.update_settings(self.settings)
    

    我们也可以看看BaseSpider,看看update_settings的实现:

    @classmethod
    def update_settings(cls, settings):
        settings.setdict(cls.custom_settings or {}, priority='spider')
    

    在这里我们看到设置确实被添加到传递的参数(这是来自CrawlerSettings 对象),优先级为spider。它不会被返回,因为settings 是一个对象,因此是通过引用传递的。

    我希望这会进入您问题的正确方向,如果没有添加评论并稍微改进原始问题。然后我会完善我的答案。

    【讨论】:

    • 太棒了!这是否意味着如果我不编写from_crawl 方法,使用默认配置创建的itempipeline 实例,并且如果我编写from_crawl 方法返回一个“自定义”管道实例,其中指定部分如设置或通过唯一条目挂钩的信号 - --- 类爬虫?
    • 如果您不编写from_crawler 方法,您是否有权访问设置?当然,您可以从scrapy.utils.project.get_project_settings 获得它们,但这只是项目设置,不包括蜘蛛或命令行设置。另一方面,如果您通过def from_crawler(cls, crawler) 然后访问crawler.settings,您会从所有优先级中获​​得完全应用的设置。
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2019-06-24
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多