scrapy专题:自定义扩展

Posted qiu-hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy专题:自定义扩展相关的知识,希望对你有一定的参考价值。

通过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专题:自定义扩展的主要内容,如果未能解决你的问题,请参考以下文章

VSCode创建自定义用户片段

VS中添加自定义代码片段——偷懒小技巧

VSCode插件开发全攻略代码片段设置自定义欢迎页

Hive 编程专题之 - 自定义函数 Java 篇

VSCode自定义代码片段——CSS选择器

JMeter 扩展开发:自定义 JMeter 插件的调试