特色的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中模拟按键?   尽管元素存在,但HtmlUnit中的java ElementNotFoundException   在Java中,长双精度并发写入不是原子的吗?   java如何在另一个对象数组中打印对象的int值?   java在显示或更改视图后执行一些代码   java JFR:读取时发生OutOfMemoryError。jfr文件   java Android助手检查是否购买   java这种设计模式的好处是什么?   Weblogic 10.3中针对托管服务器的java部署问题   java如何获取字符串。在编译时投诉的格式   声明字符串数组时发生java错误   java JPA在多个并行线程中从表中删除时发生死锁   java Android:在按钮动画之后启动活动   java并发与JMS主题在春季   使用Lucene spatial search/DateRangePrefixTree进行java日期范围查询?   java可选接口问题   JavaDbUnit没有在每个方法之后清洗和插入数据库,所以测试不是独立的   java在IAIK PKCS11包装器中一对私钥和证书如何匹配?