通过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
- 在
from_crawler
方法中注册信号 - 编写
item_scraped
方法, 统计所有解析出来的item - 在
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
- 当蜘蛛超过某个值时关闭蜘蛛
- 超过某个值时发送通知电子邮件
配置值:
MEMUSAGE_LIMIT_MB: 限制爬虫大小, 达到则关闭爬虫
MEMUSAGE_WARNING_MB: 警告内存大小, 达到这个峰值则发送邮件
MEMUSAGE_NOTIFY_MAIL: 通知邮件地址
MEMUSAGE_CHECK_INTERVAL_SECONDS: 检测间隔, 单位秒
5. 内存调试扩展
scrapy.extensions.memdebug.MemoryDebugger
这个扩展收集以下信息:
- python垃圾收集器未收集的对象
- 其他不应该保留的对象
配置项:
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: 邮件接收地址
原文地址:https://www.cnblogs.com/qiu-hua/p/12638732.html