scrapy 基础组件专题(四):信号运用
一、scrapy信号使用的简单实例
import scrapy from scrapy import signals from ccidcom.items import CcidcomItem class CcidcomSpider(scrapy.Spider): name = 'ccidcomSpider' start_urls = ['http://www.ccidcom.com/yaowen/index.html'] item_count = 0 @classmethod def from_crawler(cls, crawler, *args, **kwargs): spider = super(CcidcomSpider, cls).from_crawler(crawler, *args, **kwargs) crawler.signals.connect(spider.item_scraped, signal=signals.item_scraped) crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed) return spider def parse(self, response): lists = response.css('div.article-item div.title a::attr("href")') for info in lists: item = CcidcomItem() item['url'] = info.get() yield item def item_scraped(self, item, response, spider): if item: self.item_count += 1 self.logger.info('--------item_scraped') def spider_closed(self, spider, reason): spider.logger.info('一共抓取到了{}个item'.format(self.item_count))
运行爬虫scrapy crawl ccidcomSpider
2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped 2019-11-20 13:14:11 [scrapy.core.engine] INFO: Closing spider (finished) 2019-11-20 13:14:11 [ccidcomSpider] INFO: 一共抓取到了10个item
from_crawler
是在爬虫被初始化时执行的入口方法 spider = super(CcidcomSpider, cls).from_crawler(crawler, *args, **kwargs)
是调用父类的方法, 获取到实例化的爬虫 crawler.signals.connect(spider.item_scraped, signal=signals.item_scraped)
是将爬虫的spider.item_scraped
方法注入到signals.item_scraped
信号的位置上 当我们yield
返回一个item时, 就会调用我们自己写的item_scraped
方法, 将item的数量+1
我们也注册了一个spider_closed
的信号, 在爬虫结束以后, 输出我们一共抓取到了多少个item
这就是scrapy信号的简单的例子, 而且这个例子可以写在很多地方(扩展、中间件、pipeline...)
二、scrapy内置的信号
以上就是scrapy所有内置的信号列表, 这些信号的最大功能就是用来做统计, 或者别的一些处理
1. 统计被Drop的item
2. 统计被Drop的请求
3. 监控爬虫的空闲状态(实现调试爬虫)
4. 统计pipeline或爬虫中的异常发生情况
本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/12638683.html