【Python】如何编写一个Scrapy扩展(Scrapy Extension)


曾经在幽幽暗暗
反反复复中追问
才知道平平淡淡
从从容容才是真
再回首恍然如梦
再回首我心依旧
只有那无尽的长路伴着我
                     🎵 姜育恒《再回首》


Scrapy是一个强大的爬虫框架,它不仅易于使用,而且具有高度的可扩展性。Scrapy的扩展机制允许开发者在爬虫的不同阶段插入自定义的功能,以实现特定的需求。本文将介绍如何编写一个Scrapy扩展,并展示一个实际的例子。

什么是Scrapy扩展

Scrapy扩展是一些可以插入到Scrapy的执行流程中的插件,用于在特定的时机执行自定义代码。这些时机包括引擎启动和停止、调度器事件、下载器事件以及爬虫的各种信号。

创建Scrapy扩展的步骤

  • 编写扩展类
  • 注册扩展
  • 配置Scrapy使用扩展

步骤1:编写扩展类

首先,我们需要创建一个扩展类,这个类将包含我们希望在特定时机执行的代码。以下是一个简单的扩展示例,它在爬虫开始和结束时打印日志信息。

import logging
from scrapy import signalsclass MyCustomExtension:def __init__(self, stats):self.stats = statsself.logger = logging.getLogger(__name__)@classmethoddef from_crawler(cls, crawler):ext = cls(crawler.stats)crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)return extdef spider_opened(self, spider):self.logger.info(f"Spider {spider.name} opened: {spider}")def spider_closed(self, spider):self.logger.info(f"Spider {spider.name} closed: {spider}")

在这个扩展中,我们定义了两个方法 spider_opened 和 spider_closed,它们分别在爬虫开启和关闭时被调用。通过 signals.connect 方法,我们将这两个方法与 Scrapy 的 spider_opened 和 spider_closed 信号连接起来。

步骤2:注册扩展

接下来,我们需要在 settings.py 文件中注册我们的扩展。

EXTENSIONS = {'my_project.extensions.MyCustomExtension': 500,
}

这里的 500 是扩展的优先级,数值越小优先级越高。

步骤3:配置Scrapy使用扩展

在 settings.py 文件中,还需要确保我们的扩展能够被 Scrapy 识别和使用。如果没有特殊需求,已经完成的注册步骤即可使扩展生效。

完整示例

为了更好地理解整个过程,我们将创建一个完整的 Scrapy 项目,并添加我们的自定义扩展。

创建Scrapy项目
scrapy startproject my_project
创建扩展文件

在 my_project/my_project/extensions 目录下创建一个 init.py 文件,并添加以下代码:

# my_project/my_project/extensions/__init__.pyimport logging
from scrapy import signalsclass MyCustomExtension:def __init__(self, stats):self.stats = statsself.logger = logging.getLogger(__name__)@classmethoddef from_crawler(cls, crawler):ext = cls(crawler.stats)crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)return extdef spider_opened(self, spider):self.logger.info(f"Spider {spider.name} opened: {spider}")def spider_closed(self, spider):self.logger.info(f"Spider {spider.name} closed: {spider}")
配置settings.py

在 my_project/my_project/settings.py 中添加扩展配置:

EXTENSIONS = {'my_project.extensions.MyCustomExtension': 500,
}
编写爬虫

创建一个简单的爬虫,在 my_project/my_project/spiders 目录下创建一个 example.py 文件,并添加以下代码:

import scrapyclass ExampleSpider(scrapy.Spider):name = "example"start_urls = ['http://quotes.toscrape.com/']def parse(self, response):for quote in response.css('div.quote'):yield {'text': quote.css('span.text::text').get(),'author': quote.css('small.author::text').get(),}
运行爬虫

在终端中运行以下命令,查看扩展的日志输出:

scrapy crawl example

你将看到类似以下的输出:

2024-07-26 12:00:00 [my_project.extensions] INFO: Spider example opened: <ExampleSpider 'example' at 0x10b2c4f70>
2024-07-26 12:00:10 [my_project.extensions] INFO: Spider example closed: <ExampleSpider 'example' at 0x10b2c4f70>

总结

本文介绍了如何编写和使用一个Scrapy扩展。通过扩展机制,我们可以在Scrapy的执行过程中插入自定义的逻辑,满足各种特定需求。希望这个示例能帮助你更好地理解和使用Scrapy扩展。如果你有任何问题或建议,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress原创插件:自定义文章标题颜色

插件设置截图 文章编辑时&#xff0c;右边会出现一个标题颜色设置&#xff0c;可以设置为任何颜色 更新记录&#xff1a;从输入颜色css代码&#xff0c;改为颜色选择器&#xff0c;更方便&#xff01; 插件免费下载 https://download.csdn.net/download/huayula/89585192…

【一图流】Git下载与安装教程

下载Git Git官网&#xff1a;https://git-scm.com/?hlzh-cn 安装Git

UE5 C++跑酷练习(Part2)

一.首先GameMode里有Actor数组&#xff0c;组装直线路&#xff0c;和左右路 #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "RunGANGameMode.generated.h"UCLASS(minimalapi) class ARunGANGameMode : public AG…

揭秘企业为何钟情定制红酒:品牌形象与不同的礼品的双重魅力

在商务世界的广阔天地里&#xff0c;红酒不仅仅是一种饮品&#xff0c;更是一种传递情感、展示品味的不同媒介。近年来&#xff0c;越来越多的企业开始钟情于定制红酒&#xff0c;其中洒派红酒&#xff08;Bold & Generous&#xff09;通过其品质和个性化的定制服务&#x…

网络访问(Socket/WebSocket/HTTP)

概述 HarmonyOS为用户提供了网络连接功能&#xff0c;具体由网络管理模块负责。通过该模块&#xff0c;用户可以进行Socket网络通滚、WebSocket连接、HTTP数据请求等网络通信服务。 Socket网络通信&#xff1a;通过Socket(嵌套字)进行数据通信&#xff0c;支持的协议包括UDP核…

《追问试面试》系列开篇

我们不管做任何事情&#xff0c;都是需要个理由&#xff0c;而不是盲目去做。 为什么写这个专栏&#xff1f; 就像我们被面试八股文时&#xff0c;市面上有很多面试八股文&#xff0c;随便一个八股文都是500&#xff0c;甚至1000面试题。诸多面试题&#xff0c;难道我们需要一…

基于微信小程序+SpringBoot+Vue的资料分享系统(带1w+文档)

基于微信小程序SpringBootVue的资料分享系统(带1w文档) 基于微信小程序SpringBootVue的资料分享系统(带1w文档) 校园资料分享微信小程序可以实现论坛管理&#xff0c;教师管理&#xff0c;公告信息管理&#xff0c;文件信息管理&#xff0c;文件收藏管理等功能。该系统采用了Sp…

vue3中element tabs标签页 tab-click事件无法拿到最新值

element tabs标签页有2个常用的事件方法&#xff0c;tab-click 和 tab-change tab-click事件 tab-click事件&#xff1a;当用户点击Tab标签时触发&#xff0c;有2个返回参数&#xff0c; (pane: TabsPaneContext, ev: Event) pane.props.name 中可以获取到最新的tab页签绑定值 …

jenkins参数化构建在UI中定义脚本中使用

先看配置&#xff1a; 流水线脚本&#xff1a; pipeline {agent {//label "${server}"label "${28}"}stages {stage(Hello) {steps {echo "--------------------------"// 只有这个可以输出变量echo "${character_argument}"echo &q…

网络通信---TCP协议1

今日内容 三次握手: 指建立tcp连接时&#xff0c;需要客户端和服务端总共发送三次报文确认连接。 四次挥手&#xff1a; 断开一个tcp连接&#xff0c;需要客户端和服务端发送四个报文以确认断开。 编程模型 TCP报文 客户端 服务端

E21.“详解函数递归”文中的趣味练习的答案

详解函数递归原文 高考标答&#xff1a; 思路&#xff1a; 代码实现&#xff1a; //这里取αn1 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> double function(double n) {if (1 n){return 2;}else{return 1 1.0 / (function(n - 1));} } int main() {int n …

大自然的传奇——龙宫

我们1小时后就到了龙宫&#xff0c;导游给我们买票去了&#xff0c;让我们去观景台上&#xff0c;看游客中心后面“龙”字草书。龙字田采用两种农作物套种&#xff0c;按季节区分&#xff0c;春天由油菜花和蚕豆进行套种&#xff0c;秋天由黑糯米和一般水稻进行套种。我们来的夏…

【NPU 系列专栏 2.4 -- 高速互连 NVLink 详细介绍】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVLink 简介NVLink 主要特点NVLink 应用场景NVLink 工作原理NVLink 实例介绍DL 中使用 NVLinkHPC 中使用 NVLinkSummaryNVLink 简介 NVLink 是 NVIDIA 开发的一种高速互连技术,旨在提升 GPU 与 GPU 之间以及 GPU 与 CPU 之间的…

帕金森病(PD)诊断:三种基于语音的深度学习方法

帕金森病&#xff08;Parkinson’s disease, PD&#xff09;是世界上第二大流行的神经退行性疾病&#xff0c;全球影响着超过1000万人&#xff0c;仅次于阿尔茨海默症。人们通常在65岁左右被诊断出患有此病。PD的一些症状包括震颤、肌肉僵硬和运动迟缓。这些症状往往出现在较晚…

在线教育数仓项目(数据采集部分1)

文章目录 数据仓库概念项目需求及架构设计项目需求分析系统数据流程设计框架版本选型集群规模估算集群资源规划设计 数据生成模块目标数据页面事件曝光启动播放错误 数据埋点主流埋点方式&#xff08;了解&#xff09;埋点数据上报时机埋点数据日志结构 服务器和JDK准备服务器准…

白鲸开源CEO郭炜荣获「2024中国数智化转型升级先锋人物」称号

2024年7月24日&#xff0c;由数据猿主办&#xff0c;IDC协办&#xff0c;新华社中国经济信息社、上海大数据联盟、上海市数商协会、上海超级计算中心作为支持单位&#xff0c;举办“数智新质力拓未来 2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”数据猿“年中特别策…

探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

指针的面试题

这里写目录标题 判断链表中是否有环描述代码检测链表中是否存在环链表中存在环想检测链表中是否存在环&#xff0c;而不需要找到环的入口 判断链表中是否有环 题目 描述 判断给定的链表中是否有环。如果有环则返回true&#xff0c;否则返回false。 数据范围&#xff1a;链表…

Spring Boot集成canal快速入门demo

1.什么是canal&#xff1f; canal 是阿里开源的一款 MySQL 数据库增量日志解析工具&#xff0c;提供增量数据订阅和消费。 工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志&#xff08;binary log&#xff09;, 日志中的记录叫做二进制日志事件&#xff…

二叉树_堆(下卷)

前言 接前面两篇的内容&#xff0c;接着往下讲二叉树_堆相关的内容。 正文 那么&#xff0c;回到冒泡排序与堆排序的比较。 我们知道冒泡排序的时间复杂度为 O ( N 2 ) O(N^2) O(N2)&#xff0c;这个效率是不太好的。 那么&#xff0c;我们的堆排序的时间复杂度如何呢&…