通过scrapy提供的扩展功能, 我们可以编写一些自定义的功能, 插入到scrapy的机制中

一、编写一个简单的扩展

我们现在编写一个扩展, 统计一共获取到的item的条数
我们可以新建一个extensions.py

# extendsions.py
# -*- coding: utf-8-*-
from scrapy import signals
from scrapy.exceptions import NotConfigured class StatsItemCount(object):
def __init__(self):
self.item_count = 0 @classmethod
def from_crawler(cls, crawler):
# instantiate the extension object
ext = cls() # connect the extension object to signals
crawler.signals.connect(ext.spider_opened,
signal=signals.spider_opened)
crawler.signals.connect(ext.spider_closed,
signal=signals.spider_closed)
crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped) # return the extension object
return ext def spider_opened(self, spider):
spider.logger.info("-----------opened spider %s", spider.name) def spider_closed(self, spider):
spider.logger.info("------------closed spider %s", spider.name)
spider.logger.info("一共获取到{}条数据".format(self.item_count)) def item_scraped(self, item, spider):
self.item_count += 1
  1. from_crawler方法中注册信号
  2. 编写item_scraped方法, 统计所有解析出来的item
  3. spider_closed中输出抓取到的数据

开启扩展:

# settings.py
EXTENSIONS = {
'ccidcom.extensions.StatsItemCount': 999,
}

运行爬虫
scrapy crawl ccidcomSpider

...
2019-11-21 16:53:23 [ccidcomSpider] INFO: -----------opened spider ccidcomSpider
2019-11-21 16:53:23 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2019-11-21 16:53:23 [scrapy.core.engine] INFO: Closing spider (finished)
2019-11-21 16:53:23 [ccidcomSpider] INFO: ------------closed spider ccidcomSpider
2019-11-21 16:53:23 [ccidcomSpider] INFO: 一共获取到10条数据
...

很明显可以看出来, 编写扩展而不是在spider、中间件中编写, 整个项目更加的不乱, 可扩展性好

二、scrapy内置的扩展

1. 统计信息记录扩展

scrapy.extensions.logstats.LogStats
记录统计信息

2. 核心信息统计扩展

scrapy.extensions.corestats.CoreStats
核心统计信息统计, 必须开启LogStats,这个扩展才有效

3. telnet调试扩展

scrapy.extensions.telnet.TelnetConsole
提供telnet调试爬虫, 这个在之后的调试爬虫会详细讲

4. 内存使用监控扩展

scrapy.extensions.memusage.MemoryUsage
内存使用监控扩展, 这个扩展不支持windows

  1. 当蜘蛛超过某个值时关闭蜘蛛
  2. 超过某个值时发送通知电子邮件

配置值:
MEMUSAGE_LIMIT_MB: 限制爬虫大小, 达到则关闭爬虫
MEMUSAGE_WARNING_MB: 警告内存大小, 达到这个峰值则发送邮件
MEMUSAGE_NOTIFY_MAIL: 通知邮件地址
MEMUSAGE_CHECK_INTERVAL_SECONDS: 检测间隔, 单位秒

5. 内存调试扩展

scrapy.extensions.memdebug.MemoryDebugger
这个扩展收集以下信息:

  1. python垃圾收集器未收集的对象
  2. 其他不应该保留的对象

配置项:
MEMDEBUG_ENABLED: 开启后内存信息会记录在统计信息中

6. 自动关闭蜘蛛扩展

scrapy.extensions.closespider.CloseSpider
达到指定条件则关闭爬虫

配置项:
CLOSESPIDER_TIMEOUT: 蜘蛛运行达到一定时间则自动关闭, 默认0, 不关闭
CLOSESPIDER_ITEMCOUNT: 爬虫抓取的item达到指定的数量, 则关闭爬虫, 默认是0, 不关闭
CLOSESPIDER_PAGECOUNT: 爬虫爬取页数, 达到指定数则关闭, 默认是0, 不关闭
CLOSESPIDER_ERRORCOUNT: 如果爬虫运行期间发生的错误达到一定数量, 则关闭爬虫, 默认是0, 不关闭

7. StatsMailer扩展

scrapy.extensions.statsmailer.StatsMailer
在抓取完成后发送邮件、包括收集到的统计信息

配置项:
STATSMAILER_RCPTS: 邮件接收地址

scrapy 基础组件专题(五):自定义扩展的更多相关文章

  1. scrapy 基础组件专题(八):scrapy-redis 框架分析

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  2. scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器

    一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...

  3. scrapy 基础组件专题(六):自定义命令

    写好自己的爬虫项目之后,可以自己定制爬虫运行的命令. 一.单爬虫 在项目的根目录下新建一个py文件,如命名为start.py,写入如下代码: from scrapy.cmdline import ex ...

  4. scrapy 基础组件专题(二):下载中间件

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 1.激活Downloader Mi ...

  5. scrapy 基础组件专题(十二):scrapy 模拟登录

    1. scrapy有三种方法模拟登陆 1.1直接携带cookies 1.2找url地址,发送post请求存储cookie 1.3找到对应的form表单,自动解析input标签,自动解析post请求的u ...

  6. scrapy 基础组件专题(四):信号运用

    一.scrapy信号使用的简单实例 import scrapy from scrapy import signals from ccidcom.items import CcidcomItem cla ...

  7. scrapy 基础组件专题(一):scrapy框架中各组件的工作流程

    Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): Scrapy主要包括了以下组件: 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事 ...

  8. scrapy 基础组件专题(十四):scrapy CookiesMiddleware源码

    一 Scrapy框架--cookie的获取/传递/本地保存 1. 完成模拟登陆2. 登陆成功后提取出cookie,然后保存到本地cookie.txt文件中3. 再次使用时从本地的cookie.txt中 ...

  9. scrapy 基础组件专题(九):scrapy-redis 源码分析

    下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...

随机推荐

  1. ping外网:unknown host www.baidu.comc排查

    ping 百度出现:(ping www.baidu.com) "ping: unknown host www.baidu.com"    1.ping 网关确定是否连接上路由器,并 ...

  2. grafana 如何对数据进行切分

    也就是如何增加筛选,根据想要的条件筛选不同的内容,数据源是prometheus 效果 设置variable 正则表达式 匹配url中IP和端口 切片进阶 根据前一个切片 再过滤 含义说明 instan ...

  3. 怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏

    这么说吧,在我眼里,Java 就是最流行的编程语言,没有之一(PHP 往一边站).不仅岗位多,容易找到工作,关键是薪资水平也到位,不学 Java 亏得慌,对吧? 那可能零基础学编程的小伙伴就会头疼了, ...

  4. @bzoj - 3148@ 没头脑和不高兴

    目录 @description@ @solution@ @part 1:期望@ @part 2:方差@ @accepted code@ @details@ @description@ 没头脑和不高兴是 ...

  5. PowerApps Component Framework PCF 部署

    PowerApps PCF 可以满足复杂的功能, 我们可以使用PCF来创建复杂的PowerApps. 这里附上微软的package code componet 教程(https://docs.micr ...

  6. range用法(倒序取值)

    range(4,-1,-1) #倒数取值 ''' start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但 ...

  7. python工业互联网应用实战2—从需求开始

    前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...

  8. css 那些使用小技巧(兼容性)

    1. inline-block 的兼容性问题 display:inline-block; *display:inline; *zoom:1; 2. Microsoft Edge 自动给数字加下划线 在 ...

  9. 《Java并发编程的艺术》第6/7/8章 Java并发容器与框架/13个原子操作/并发工具类

    第6章 Java并发容器和框架 6.1  ConcurrentHashMap(线程安全的HashMap.锁分段技术) 6.1.1 为什么要使用ConcurrentHashMap 在并发编程中使用Has ...

  10. C# CLosedXML四句代码搞定DataTable数据导出到Excel

    最近用到DataTable导出到Excel,网上看了一下,都不怎么好使,逛了下GitHub一下完美解决了 用到的.net库CLosedXML,这个库用于读取,处理和写入Excel 2007+(.xls ...