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