当前位置: 首页 > article >正文

【scrapy】信号量—扩展随笔

信号

在 Scrapy 中,信号(signals)是一种用于在框架的不同组件之间传递事件和信息的机制。Scrapy 提供了多种内置信号,允许开发者在爬虫运行的不同阶段插入自定义的代码来扩展其功能。比如当爬虫开启时或当item被抓取时。
代码示例:

class HooksasyncExtension(object):
    @classmethod
    def from_crawler(cls, crawler):
        logger.info("HooksasyncExtension from_crawler")
        return cls(crawler)

    def __init__(self, crawler):
        logger.info("HooksasyncExtension Constructor called")

        # connect the extension object to signals
        cs = crawler.signals.connect
        cs(self.engine_started, signal=signals.engine_started)
        cs(self.engine_stopped, signal=signals.engine_stopped)
        cs(self.spider_opened, signal=signals.spider_opened)
        cs(self.spider_idle, signal=signals.spider_idle)
        cs(self.spider_closed, signal=signals.spider_closed)
        cs(self.spider_error, signal=signals.spider_error)
        cs(self.request_scheduled, signal=signals.request_scheduled)
        cs(self.response_received, signal=signals.response_received)
        cs(self.response_downloaded, signal=signals.response_downloaded)
        cs(self.item_scraped, signal=signals.item_scraped)
        cs(self.item_dropped, signal=signals.item_dropped)

    def engine_started(self):
        logger.info("HooksasyncExtension, signals.engine_started fired")

    def engine_stopped(self):
        logger.info("spider 关闭信号量")

    def spider_opened(self, spider):
        logger.info("spider 启动信号量")

    def spider_idle(self, spider):
        logger.info("HooksasyncExtension, signals.spider_idle fired")

    def spider_closed(self, spider, reason):
        logger.info("HooksasyncExtension, signals.spider_closed fired")

    def spider_error(self, failure, response, spider):
        logger.info("HooksasyncExtension, signals.spider_error fired")

    def request_scheduled(self, request, spider):
        logger.info("HooksasyncExtension, signals.request_scheduled fired")

    def response_received(self, response, request, spider):
        logger.info("HooksasyncExtension, signals.response_received fired")

    def response_downloaded(self, response, request, spider):
        logger.info("HooksasyncExtension, signals.response_downloaded fired")

    def item_scraped(self, item, response, spider):
        logger.info("HooksasyncExtension, signals.item_scraped fired")

    def item_dropped(self, item, spider, exception):
        logger.info("HooksasyncExtension, signals.item_dropped fired")

信号的使用 crawler.signals.connect

使用 crawler.signals.connect 方法 将信号和回调函数进行绑定

cs = crawler.signals.connect
cs(self.engine_started, signal=signals.engine_started)
cs(self.engine_stopped, signal=signals.engine_stopped)
cs(self.spider_opened, signal=signals.spider_opened)
cs(self.spider_idle, signal=signals.spider_idle)
cs(self.spider_closed, signal=signals.spider_closed)
cs(self.spider_error, signal=signals.spider_error)
cs(self.request_scheduled, signal=signals.request_scheduled)
cs(self.response_received, signal=signals.response_received)
cs(self.response_downloaded, signal=signals.response_downloaded)
cs(self.item_scraped, signal=signals.item_scraped)
cs(self.item_dropped, signal=signals.item_dropped)

crawler.signals.connect 接受两个参数 signal和sender。
sender:回调函数
signal:信号量

信号的分类

信号触发时机
engine_startedScrapy 引擎启动时
engine_stoppedScrapy 引擎停止时
spider_opened爬虫(spider)打开并准备开始爬取时
spider_idle爬虫在等待新的请求时
spider_closed爬虫关闭时,通常在爬取完成后
spider_error爬虫遇到错误时
request_scheduled请求被调度到下载器时
request_dropped请求被丢弃时,可能是因为重复或过滤
request_reached_downloader请求到达下载器,准备下载时
request_left_downloader请求离开下载器,下载完成时
response_received响应被接收时,表示数据已下载但尚未处理
response_downloaded响应数据已下载到本地存储时(如果使用了下载中间件中的相关设置)
headers_received响应头被接收时
bytes_received数据块被接收时,用于跟踪下载进度
item_scraped项目(Item)被成功提取时
item_dropped项目被丢弃时,可能是因为重复或过滤
item_error项目处理过程中出现错误时

信号的调用

在配置文件 settings.py 中 设置 EXTENSIONS 和ITEM_PIPELINES的设置方法一样 scrapy在触发某一信号量后 会自动的去调用这个信号绑定的回调方法 而不需要我们在代码中显式的调用


http://www.kler.cn/a/510099.html

相关文章:

  • Flink开发中的优化方案
  • MongoDB 学习指南与资料分享
  • 从零开始:Gitee 仓库创建与 Git 配置指南
  • 【21】Word:德国旅游业务❗
  • Linux 管道操作
  • SpringMVC 实战指南:打造高效 Web 应用的秘籍
  • 利用@WebMvcTest测试Spring MVC应用
  • MySQL、HBase、ES的特点和区别
  • 初学stm32 --- flash模仿eeprom
  • AI-Talk开发板之替换唤醒词
  • K8S中Pod控制器之Deployment(Deploy)控制器
  • Prompt-人工智能领域的核心技术与创新理念
  • 设置 Git 默认推送不需要输入账号和密码【Ubuntu】
  • 使用libwebsocket技术总结
  • 音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现
  • Web自动化测试平台设计与落地
  • 2025.1.15——五、时间盲注
  • 音乐播放器实现:前端HTML,CSS,JavaScript综合大项目
  • Python----Python高级(模块与包,Python基本库)
  • java权限修饰符
  • 线上工单引发的思考:Spring Boot 中 @Autowired 与 @Resource 的区别
  • YOLOv10-1.1部分代码阅读笔记-ops.py
  • 【HarmonyOS NAPI 深度探索9】发布到 npm 并管理版本
  • kubuntu24.04配置vmware17.5.1
  • 【Office学习】PPT中的图片如何放清晰地放到论文中
  • 深度学习J9周:Inception v3算法实战与解析