特色的Frontera Scheduler for Scrapy

scrapy-frontera的Python项目详细描述


更灵活和特色的Frontera调度器,不强制重新实现 scrapy中已经提供了这些功能,因此它提供了:

  • 垃圾处理请求双重筛选器
  • 已废弃处理的磁盘和内存请求队列
  • 只向frontera发送标记为要由其处理的请求(使用请求元属性cf_store为true),从而避免了许多冲突。
  • 允许通过在Spider实例化后加载Frontera管理器,从Spider构造函数设置Frontera设置。
  • 通过添加统计信息管理器frontera设置,允许frontera组件访问scrapy stat manager实例
  • 更好的请求/响应转换器,与ScrapyCLOUD和Scrapy完全兼容
  • 模拟don_filter=true scrapy请求标志
  • Frontier指纹与Scrapy请求指纹相同(可以通过将'Frontier_Fingerprint'传递给请求元来覆盖)
  • 允许在实际排队之前自定义预处理或忽略来自Frontier的请求
  • 经过全面测试、使用并具有特色

结果是,使用此调度程序的爬虫程序的工作方式与不使用frontier的爬虫程序的工作方式不同,并且 为了适应边疆工作,蜘蛛的再繁殖是最小的。

版本:

在0.1.8之前,需要frontera==0.3.3和python2。版本0.2.x要求frontera==0.7.1,并且与python3兼容。

安装:

pip安装scrapy frontera

用法和功能:

注意:在这个文档的上下文中,producer spider是将请求写到frontier的spider,consumer是读取请求的spider 他们来自边境。它们可以是同一个蜘蛛,也可以是分开的蜘蛛。

在您的项目设置中。py:

SCHEDULER = 'scrapy_frontera.scheduler.FronteraScheduler'

DOWNLOADER_MIDDLEWARES = {
    'scrapy_frontera.middlewares.SchedulerDownloaderMiddleware': 0,
}

SPIDER_MIDDLEWARES = {
    'scrapy_frontera.middlewares.SchedulerSpiderMiddleware': 0,
}

# Set to True if you want start requests to be redirected to frontier
# By default they go directly to scrapy downloader
# FRONTERA_SCHEDULER_START_REQUESTS_TO_FRONTIER = False

# Allows to redirect to frontier, the requests with the given callback names
# Important: this setting doesn't affect start requests.
# FRONTERA_SCHEDULER_REQUEST_CALLBACKS_TO_FRONTIER = []

# Spider attributes that need to be passed to the requests redirected to frontier
# Some previous callbacks may have generated some state needed for following ones.
# This setting allows to transmit that state between different jobs
# FRONTERA_SCHEDULER_STATE_ATTRIBUTES = []

# map specific requests to specific slot prefix by its callback name.
# FRONTERA_SCHEDULER_CALLBACK_SLOT_PREFIX_MAP = {}

加上常见的frontera设置。例如,对于hcf-backend

BACKEND = 'hcf_backend.HCFBackend'
HCF_PROJECT_ID = 11111

(etc...)

您还可以通过spider类属性dictfrontera_settings设置特定于spider的frontera设置。例子 使用HCF后端

class MySpider(Spider):

    name = 'my-producer'

    frontera_settings = {
        'HCF_AUTH': 'xxxxxxxxxx',
        'HCF_PROJECT_ID': 11111,
        'HCF_PRODUCER_FRONTIER': 'myfrontier',
        'HCF_PRODUCER_NUMBER_OF_SLOTS': 8,
    }

scrapy frontera还接受spider属性frontera_settings_json。这对每个工作都需要的消费者特别有用 读取槽的设置。例如,您可以用这种方式配置使用者蜘蛛,以便与hcf backend

class MySpider(Spider):

    name = 'my-consumer'

    frontera_settings = {
        'HCF_AUTH': 'xxxxxxxxxx',
        'HCF_PROJECT_ID': 11111,
        'HCF_CONSUMER_FRONTIER': 'myfrontier',
    }

并通过:

scrapy crawl my-consumer -a frontera_settings_json='{"HCF_CONSUMER_SLOT": "0"}'

通过frontera_settings_json提供的设置将重写使用frontera_settings提供的设置,而这些设置反过来将重写 项目设置.py文件。

只有当值为true的标志cf_store包含在请求元中时,请求才会通过frontera管道。如果cf_store不存在 或者为false,请求将作为普通的scrapy请求处理。除了cf_store标记之外,还有一种可选的设置FRONTERA_SCHEDULER_START_REQUESTS_TO_FRONTIERFRONTERA_SCHEDULER_REQUEST_CALLBACKS_TO_FRONTIER(请参阅上面关于这些设置的用法)

从边界读取的请求直接由调度程序排队。这意味着它们不是由spider中间件处理的。他们的 处理入口点是下载中间件process_request()管道。但是如果你需要预处理来自边境的请求 在spider中,可以定义spider方法preprocess_request_from_frontier(request: scrapy.Request)。如果定义了,调度程序将调用 在实际排队之前。此方法必须返回none或一个请求(与调用相同,或另一个)。这个返回值是 将实际进入队列,因此如果没有,则跳过请求(不进入队列)。

如果从frontier读取的请求尚未定义errback,则调度程序将自动分配使用者spidererrback方法, 如果存在,对他们来说。当消费者蜘蛛和生产者蜘蛛不同时,这一点特别有用。

另一个有用的设置是FRONTERA_SCHEDULER_CALLBACK_SLOT_PREFIX_MAP。这是一个dict,它允许将具有特定回调的请求映射到特定的槽前缀,或者可以选择映射到多个槽,不同于frontera后端分配的默认槽(这个您将使用的特定frontera后端必须支持nature,hcf后端的最新版本确实支持它)。例如:

class MySpider(Spider):

    name = 'my-producer'

    frontera_settings = {
        'HCF_AUTH': 'xxxxxxxxxx',
        'HCF_PROJECT_ID': 11111,
        'HCF_PRODUCER_FRONTIER': 'myfrontier',
        'HCF_PRODUCER_SLOT_PREFIX': 'my-consumer'
        'HCF_PRODUCER_NUMBER_OF_SLOTS': 8,
    }

    custom_settings = {
        'FRONTERA_SCHEDULER_CALLBACK_SLOT_PREFIX_MAP': {'parse': 'my-producer/4'},
        'FRONTERA_SCHEDULER_REQUEST_CALLBACKS_TO_FRONTIER': ['parse', 'parse_consumer']
    }

    def parse_consumer(self, response):
        assert False

    def parse(self, response):
        (...)

在此配置下,回调parse()的请求将保存在前缀为my-producer的4个插槽中,而回调parse_consumer()的请求将使用hcf设置中的配置,即前缀为my-consumer的8个插槽。

综合教程可在shub-workflow Tutorial

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何修改打印板?   java Spring批处理JdbcCursorItemReader还是RepositoryItemReader?   java如何在JTable Swing中增加标题列的字体?   java在数组方面遇到问题,导致表达式非法启动   java如何为maven pom的某些部分关闭Eclipse代码格式化程序。xml   java Dropwizard登录代码   java Jersey 2.22:客户端的默认连接超时是多少?   java无法自动连接字段:javax。sql。数据来源   如何从java中的行列表中获取单词列表?   java JDBC批量更新和处理异常?   计算大根:bigdecimal/java   java如何在JavaCC语法中提到trycatch块   javasocket。getInetAddress()不返回任何内容   oracle SQL开发人员错误无法找到Java虚拟机   java我如何计算和显示未来5年每一年的投资价值   java如何关闭浏览器选项卡?   java如何在showMessageDialog中打印双2D数组?   java从站点抓取播放列表URL?   selenium中的java点击css按钮