17.爬虫:scrapy信号

一.概述

scrapy信号就是我们事先指定在什么条件下,要调用什么方法。当条件被触发时,方法就会被执行。

所谓:摔杯为号,刀斧手出动,当然这是需要事先跟手下讲明的

第1步:摔杯为号

我们一般会在spider的__init__()中来指定信号,也可以重写from_crawler()这个方法来指定信号----->跟手下讲明这是鸿门宴,摔杯是要砍对方主公的

实现方式1:from_crawler方法中crawler.signals.connect(spider.item_scraped,signal=signals.item_scraped)

实现方式2:在__init__()方法中dispatcher.connect(self.handle_spider_closed,signals.spider_closed)

分析源码可以看到,这两方法本质上是相同的

alt
alt
第2步:调用指定方法

这一步其实就是一个要被调用的自定义方法

二.scrapy的内置信号

alt
alt
alt

文档链接:https://docs.scrapy.org/en/latest/topics/signals.html

ps: 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))

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...)

相应的视频教程在这里 https://mp.weixin.qq.com/s/DG-T965Y9yKLwNYPus2cXA

本文由 mdnice 多平台发布

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值