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 ...
随机推荐
- springboot学习笔记:4.logback日志配置
springboot中日志组件推荐使用logback: 由于springboot内置了logback,所以可以直接在application.properties中配置:如果要功能丰富些,则配置下log ...
- windows server 2008 r2配置NTP时间服务器
windows server 2008做NTP服务器与H3C网络设备组网首先WINDOWS SERVER 2008默认是关闭NTP服务的,需要通过修改注册表开启方法如下:--------------- ...
- vue-cli3初始化项目
1 npm install -g @vue/cli 创建配置 创建 1 vue create vue-app 选择配置 1234 ? Please pick a preset: (Use arrow ...
- mongodb Map/reduce测试代码
private void AccountInfo() { ls.Clear(); DateTime dt = DateTime.Now.Date; IMongoQuery query = Query& ...
- 一些JavaScript中原理的简单实现
实现一个双向数据绑定 Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象.通过这个属性可以实现简单的双向数据绑定,当前版 ...
- Typescript - 类型断言
原文:TypeScript基本知识点整理 零.序言 类型断言,可以用来手动指定一个值的类型. 给我的感觉,和 java 中的强制类型转换很像. 常常和联合类型配合使用,如: // 错误示例 funct ...
- [洛谷P2785] 物理1(phsic1)-磁通量
随便翻到的一道题...... 题目传送门 这道题是用向量叉积求多边形面积. 首先讲一下向量叉积(也叫外积). 设两个向量的坐标表示为(x1,y1).(x2,y2). 那么它们的叉积为x1*y2-x2* ...
- javaSE复习之——线程
线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CP ...
- Proto3:Techniques
本文描述处理Protocol Buffer常用到的一些设计模式.你也可以给Protocol Buffers discussion group发送设计或使用问题. 流式多条消息 如果你想将多个消息写入到 ...
- jQuery2.0.0版本以后不再支持ie8的原因
在引用jQuery时,引用高版本的Jq会在IE8下报错,在网上查了一下,jq在2.0+的版本就已经放弃对ie8的支持了.之前没有仔细研究过jq版本,借此机会去看了一下jq版本的知识.一.如何查看jq的 ...