特色的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_FRONTIER和FRONTERA_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