scrapy的扩展件extensions

extensions.py文件

# -*- coding: utf-8 -*-
# 该扩展会在以下事件时记录一条日志:
# spider被打开
# spider被关闭
# 爬取了特定数量的条目(items)

import logging
from collections import defaultdict
from scrapy import signals
from scrapy.exceptions import NotConfigured
from datetime import datetime

logger = logging.getLogger(__name__)

class SpiderOpenCloseLogging(object):

    def __init__(self, item_count):
        self.item_count = item_count
        self.items_scraped = 0
        self.items_dropped = 0
        self.stats = defaultdict(int)  # 默认是0   正常状态
        self.err_stats = defaultdict(int)  # 默认是0
        print("=="*20, ‘Extension object created 扩展对象被创建‘)

    @classmethod
    def from_crawler(cls, crawler):
        # first check if the extension should be enabled and raise

        # NotConfigured otherwise
        # 关键:这里如果是False就直接放弃对象的创建了,在settings中写一个MYEXT_ENABLED,设置为True
        if not crawler.settings.getbool(‘MYEXT_ENABLED‘):
            raise NotConfigured

        # get the number of items from settings
        # 默认每爬1000条才记录一次log,可以在settings中设置这个MYEXT_ITEMCOUNT数字
        item_count = crawler.settings.getint(‘MYEXT_ITEMCOUNT‘, 1000)

        # instantiate the extension object

        ext = cls(item_count)

        # connect the extension object to signals
        # 把ext.spider_opened这个函数绑定到signal=signals.spider_opened这个信号上,
        # 每当一个item对象被yield出来的时候,这个信号就会产生
        crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)

        crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)

        # signals.item_scraped这个是主要的信号,前提是一个item被爬之后,并通过所有的Pipeline没有被drop掉
        crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped)

        # 注册一个item_dropped信号,当item被drop之后这个信号会触发
        crawler.signals.connect(ext.item_dropped, signal=signals.item_dropped)

        # 注册一个ext.response_received
        crawler.signals.connect(ext.response_received, signal=signals.response_received)

        # return the extension object

        return ext

    def spider_opened(self, spider):
        # spider.log("opened spider %s" % spider.name)
        # 可以把spider.log替换成print
        print("opened spider %s" % spider.name)

    def spider_closed(self, spider):
        # spider.log("closed spider %s" % spider.name)
        # 可以把spider.log替换成print
        print("closed spider %s" % spider.name)

    def item_scraped(self, item, spider):
        self.items_scraped += 1
        if self.items_scraped % self.item_count == 0:
            # spider.log("scraped %d items" % self.items_scraped)
            # 可以把spider.log替换成print
            print("scraped %d items" % self.items_scraped)

    def item_dropped(self, item, spider, response, exception):
        self.items_dropped += 1
        if self.items_dropped % self.item_count == 0:
            # spider.log("scraped %d items" % self.items_scraped)
            print("dropped %d items" % self.items_dropped)

    def response_received(self, response, request, spider):  # 监控爬虫的健康情况
        # 统计当前这一分钟正确状态和错误状态的数量
        now = datetime.now().strftime(‘%Y%m%d%H%M‘)
        self.stats[now] += 1  # 正常状态+!
        if response.status in [401, 403, 404, 500, 501, 502]:
            self.err_stats[now] += 1  # 错误状态+1
        if self.err_stats[now] / float(self.stats[now]) > 0.2:  # 占比
            # 一般线上部署有warning信息会发邮件,有err信息会发短信
            # warning级别比err低,但是比info高
            logger.warning(f‘received {self.stats[now]} response and {self.err_stats[now]} of them is not 200,{now}‘)
settings中配置文件

# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
MYEXT_ENABLED = True  # 使用自定义插件
MYEXT_ITEMCOUNT = 10  # 每爬10条打印一次或者记录一次日志
EXTENSIONS = {
   # ‘scrapy.extensions.telnet.TelnetConsole‘: None,
   ‘qianmu.extensions.SpiderOpenCloseLogging‘: 1,
}


原文地址:https://www.cnblogs.com/kenD/p/12248037.html

时间: 2024-10-29 23:18:36

scrapy的扩展件extensions的相关文章

Mozilla Firefox扩展(Extensions)开发——XPCOM&XUL(二)

上节我们做了一个hello world,然而并没有什么卵用.这节我们实现一个具有实用功能的扩展吧! 创建我们的扩展开发目录,其结构如下: sessionstore |--content |             |--overlay.js |               | --overlay.xul |                 | --prefs.xul |--defaults |                  |--preferences |                  

Scrapy框架扩展

在指定信号上注册操作 from scrapy import signals class MyExtend: def __init__(self,crawler): self.crawler = crawler # 钩子上挂障碍物 # 在指定信号上注册操作 crawler.signals.connect(self.start, signals.engine_started) crawler.signals.connect(self.close, signals.spider_closed) @cl

透视图扩展 Perspective Extensions

eclipse中的一些元素如图所示: 透视图? 透视图 是一系列Views和Editors等元素的 可视化容器.透视图 定义了  Workbench Page 中 Window action bars(menu and toolbar) 的初始化内容 和  包含的视图(views)与它们的布局方式. WorkbenchWindow是书本的话,Perspective就是其中的一页,并且同一时刻只显示一页.一个Perspective所包含的Views,Editors等元素不与其它Perspectiv

Swift 扩展(Extensions)(十四)

可以为类添加新功能 UIViewController extension UIViewController { // 为 UIViewController 添加的新功能写到这里 } Double extension Double { var km: Double { return self * 1_000.0 } var m : Double { return self } var cm: Double { return self / 100.0 } var mm: Double { retur

Mozilla Firefox扩展(Extensions)开发——xulrunner

XULRunner is a Mozilla runtime package that can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird. It provides mechanisms for installing, upgrading, and uninstalling these applications. XULRunner also provides li

类别(Category)与扩展(Extensions)

一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继承. 注:继承(inheritance)无法为一个类簇创建子类.类别不能添加实例变量. 1. 创建类别 1.1 声明类别 类别的声明和类的声明格式相似: @interface ClassName(CategoryName) //method declarations @end//CategoryNa

十九、扩展 Extensions

1. 概述 扩展用于给已经存在的类.枚举.结构体添加新的功能.Swift中的扩展(extensions)与Objective-C中的分类(categories)的类似,但不同点在于,扩展没有名字. 扩展有如下功能: 1)增加 computed属性和静态的computed属性 2)定义实例方法 instance methods 和 类型方法type methods(比如类方法) 3)提供新的构造器 4)定义下标 5)定义和使用新的嵌套类型 6)使某个已存在的类型符合某个协议( 原话:Make an

scrapy爬虫框架介绍

一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用于如数据挖掘.监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫. Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架.因此Scrapy使用了一

爬虫----Scrapy框架

一.介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用于如数据挖掘.监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫. Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架.因此Scrapy使用了一