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,
}
scrapy的扩展件extensions的更多相关文章
- XAML实例教程系列 - 标记扩展(Markup Extensions) 六
XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...
- nginx+php+扩展件安装实践版
一.安装各种软件包 yum -y install wget git vim lrzsz unzip zip gcc make gd-devel bzip2 bzip2-devel libcurl li ...
- swift学习笔记之-扩展(Extensions)
//扩展(Extensions) import UIKit /*扩展(Extensions):扩展 就是为一个已有的类.结构体.枚举类型或者协议类型添加新功能.这包括在没有权限获取原始源代码的情况下扩 ...
- 16.AutoMapper 之可查询扩展(Queryable Extensions)
https://www.jianshu.com/p/4b23e94a7825 可查询扩展(Queryable Extensions) 当在像NHibernate或者Entity Framework之类 ...
- MySQL索引扩展(Index Extensions)学习总结
MySQL InnoDB的二级索引(Secondary Index)会自动补齐主键,将主键列追加到二级索引列后面.详细一点来说,InnoDB的二级索引(Secondary Index)除了存储索引列k ...
- Welcome-to-Swift-20扩展(Extensions)
扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类(cate ...
- 类别(Category)与扩展(Extensions)
一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继 ...
- 97、爬虫框架scrapy
本篇导航: 介绍与安装 命令行工具 项目结构以及爬虫应用简介 Spiders 其它介绍 爬取亚马逊商品信息 一.介绍与安装 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
随机推荐
- 瑞星:以虚拟化安全“Hold住”企业用户
自从云计算的概念诞生的哪一天起,就吸引了无数人的目光.自从2006年开始,云计算经过了雾里看花的朦胧.众说纷纭的迷茫,到现在各类应用与服务呈现出了百花齐放的姿态,引领着信息科技迈入了新纪元,而服务器虚 ...
- spring和mybatis整合报错:org.springframework.beans.MethodInvocationException: Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyExceptio ...
- vivado操作基本问题
1.zynq开发板的构造以及推崇的设计理念 设计推崇的理念是设计有知识产权的可重用的IP模块. 2.操作过程中遇到的问题以及解决方法 (1)综合速度慢解决方案: 我们都知道Vivado编译起来相当的慢 ...
- Python 项目结构
Python 项目结构 实验准备 我们的实验项目名为 factorial. 12 $ mkdir factorial$ cd factorial/ 主代码 我们给将要创建的 Python 模块取名为 ...
- web虚拟主机的三种配置方法
- [转载] 自定义标签,jsp调用java类
自己懒得做笔记,借用一下. 之前例子已经写好了,由于时间关系一直没有发布,这次带来的是关于taglib中的<tag>的基本功能已经介绍完毕了,在taglib中我们发现有一个标签叫做< ...
- the way of hardware design study
1.器件 主要分类 1.MCU2.DSP3.FPGA4.Embedded5.System on Chip MCU MCU俗称单片机,通常无操作系统,用于简单的控制,如电梯,空调等. DSP DSP叫做 ...
- annoy超平面多维近似向量查找工具
需求:有800万的中文词向量,要查询其中任意一个词向量对应的k个与其最邻近的向量.通常情况下如果向量集比较小的话,几十万个向量(几个G这种),我们都可以用gensim的word2vec来查找,但是88 ...
- ActiveMQ学习总结(一)
自己写的网上商城项目中使用了ActiveMQ,虽然相比于RabbitMQ,kafka,RocketMQ等相比,ActiveMQ可能性能方面不是最好的选择,不过消息队列其实原理区别不大,这里对学过的关于 ...
- 《AndroidStudio导入安卓源码-idegen》---可方便查看安卓源代码
idegen是Android源码中的一个模块,需要编译一下.生成一个jar包.然后再进行构建生成AndroidStudio配置相关文件. > 什么是idegen 要将Android系统源代码工程 ...