【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…

软设之数据仓库

数据仓库的特点: 面向主题:数据按主题组织 集成的:消除了源数据中的不一致性&#xff0c;提供了整个企业的一致性全局信息。 相对稳定的:主要进行查询操作&#xff0c;只有少量的修改和删除操作 反映历史变化:记录了企业从过去某一时刻到当前各个阶段的信息&#xff0c;可对…

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页签绑定值 …

Golang并发编程-Goroutine

1Goroutine 在java/c中我们要实现并发编程的时候&#xff0c;我们通常需要自己维护一个线程池&#xff0c;并且需要自己去包装一个又一个的任务&#xff0c;同时需要自己去调度线程执行任务并维护上下文切换&#xff0c;这一切通常会耗费程序员大量的心智。那么能不能有一种机…

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报文 客户端 服务端

redis,电脑缓存

由于目前互联网巨大的访问量&#xff0c;在生产环境中常常需要redis结合mysql来用&#xff0c;我们可以将redis当作mysql的缓存&#xff0c;应用(app)所有读的操作都负载到redis上&#xff0c;因为redis够快&#xff0c;如果直接从mysql上读会对它造成巨大的压力&#xff0c;之…

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 …

C# 多线程Paralle使用

在C#中&#xff0c;Parallel 类是 System.Threading.Tasks 命名空间下的一个静态类&#xff0c;它提供了并行执行循环和操作的简便方法。通过使用 Parallel 类&#xff0c;可以简化多线程编程&#xff0c;提高应用程序执行并行任务的能力。Parallel 类主要用于并行执行 for 和 …

小程序跳转防止页面栈卡死

小程序中页面栈为10个&#xff0c;超过10个之后小程序则无法进行跳转&#xff1b; 解决方法&#xff1a;进行页面栈判断有就返回&#xff0c;没有但没10个就navigateTo否则redirectTo&#xff1b; /*** 跳转定制历史*/ goCustomizeHistory() {let index getCurrentPages().f…

大自然的传奇——龙宫

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

json数据格式 继续学习

1.定义 轻量级的数据交互格式&#xff0c;可以按照json数据格式去组织和封装数据。 本质是一个带有特定格式的字符串。 2.功能 负责不同编程语言中的数据传递和交互。 3.json数据格式转化 """ 演示json数据和python字典之间的转换 """ impor…

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

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

Spring Task详解

文章目录 一、开启定时任务二、cron表达式 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑 一、开启定时任务 Spring Boot 默认在无任何第三方依赖的情况下使用 spring-context 模块下提供的定时任务工具 Spring Task。我们只…