scrapy pipelines

news/2025/3/26 16:43:28/

1.时间的处理

获取当前时间的字符串

# 创建一个datetime对象并设置为当前时间,该时间少8小时
dt = datetime.datetime.now()
# 将datetime转换为本地时区
local_tz = pytz.timezone('Asia/Shanghai')
local_dt = local_tz.localize(dt)
# 将datetime对象格式化为ISO 8601格式的字符串
iso_date_string = local_dt.isoformat()
# 从字符串中删除'T'分隔符
date_string = iso_date_string.replace('T', ' ')
# 从字符串中删除'.091979+08:00'毫秒和时区信息
date_string = date_string.split('.')[0]

将 datetime 对象 datetime.datetime(2023, 5, 24, 14, 18, 20, 91979) 转换为字符串 '2023-05-24T14:18:20.091979'

# 创建一个datetime对象并设置为当前时间,该时间少8小时
dt = datetime.datetime.now()
# 将datetime转换为本地时区
local_tz = pytz.timezone('Asia/Shanghai')
local_dt = local_tz.localize(dt)
# 将datetime对象格式化为ISO 8601格式的字符串
iso_date_string = local_dt.isoformat()
# 从字符串中删除'T'分隔符
date_string = iso_date_string.replace('T', ' ')
# 从字符串中删除'.091979+08:00'毫秒和时区信息
date_string = date_string.split('.')[0]

 2.获取scrapy爬虫结束后的统计信息

在pipelines文件的类,添加一下代码

# 1.在settings 启用统计信息中间件 STATS_CLASS = 'scrapy.statscollectors.MemoryStatsCollector'
# 2.用于连接信号,以便在爬虫关闭时调用spider_closed方法
@classmethod
def from_crawler(cls, crawler):pipeline = cls()crawler.signals.connect(pipeline.spider_closed, signal=scrapy.signals.spider_closed)return pipeline# 3.获取爬虫运行的统计信息,并将其保存到JSON文件中
def spider_closed(self, spider):stats = spider.crawler.stats.get_stats()with open('./log/stats.json', 'w') as f:json.dump(stats, f)

注:close_spider方法和spider_closed方法是 Scrapy框架中表示爬虫结束的两种方法,它们有以下区别:

close_spider方法:

在爬虫完成数据抓取后调用,可以用于执行一些清理操作,例如关闭数据库连接或写入总结性数据等。此方法可以由用户手动调用,也可以在 Scrapy 引擎检测到爬虫结束时自动调用。

spider_closed方法:

当爬虫关闭时被 Scrapy 引擎自动调用,比close_spider更适合做资源释放或其他清理工作。

因此,close_spider方法和spider_closed方法在实现上可以相似,但它们基于两个不同的场景,需要根据具体情况使用。

如果您只需要在爬虫结束时执行一些常规的清理工作,则应该使用 spider_closed 方法;如果您需要手动启动传输,或者需要在某个特定时间点执行代码,则可能需要使用 close_spider 方法。

3.数据保存前、后操作

数据保存到redis前,在__init__方法 初始化redis对象,删除redis已经存在的旧数据;

数据保存到redis后,在爬虫结束方法退出driver,否则下次再跑就会报502超时链接不到docker selenium的driver,因为docker的driver的进程没有释放。

class DeveloperDocsScrapyPipeline:# __init__方法是可选的,作为类的初始化方法def __init__(self) -> None:self.redis_items_key = "developer-docs:link-data:items"self._redis = operate_redis()self._redis.del_redis_key(self.redis_items_key)def spider_closed(self, spider):driver.close()# 需要退出,否则,docker的进程不退出,下次执行会超时driver.quit()


http://www.ppmy.cn/news/1331115.html

相关文章

CSS高级技巧导读

1,精灵图 1.1 为什么需要精灵图? 目的:为了有效地减少服务器接收和发送请求的次数,提高页面的加载速度 核心原理:将网页中的一些小背景图像整合到一张大图中,这样服务器只需要一次请求就可以了 1.2 精灵…

YOLOv7调用摄像头检测报错解决

yolov7detect.py文件调用本地摄像头,把source参数设为0 parser.add_argument(--source, typestr, default0, helpsource) # file/folder, 0 for webcam 报错:cv2.error: OpenCV(3.4.2) 一堆地址:The function is not implemented. Rebuild the library…

从零开始c++精讲:第四篇——模板初阶

文章目录 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板原理2.4函数模板实例化2.5函数模板匹配原则 三、类模板3.1类模板的定义格式3.2类模板的实例化 一、泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& righ…

C++高级编程——STL:deque容器、stack容器和queue容器

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…

git bash右键菜单失效解决方法

git bash右键菜单失效解决方法 这几天重新更新了git,直接安装新版本后,右键菜单失效找不到了。找了好几个博客,发现都不全面,最后总结一下解决方法: (1)按winr,输入regedit打开注册…

前端面试——关于this指向问题?

想要知道关于this的指向问题,首先要了解this的绑定规则。那么this到底是什么样的绑定规则呢?一起来研究一下吧! 绑定一:默认绑定 绑定二:饮食绑定 绑定三:显示绑定 绑定四:隐式绑定 1. 默认…

泥石流监测识别摄像机

泥石流监测识别摄像机是一种基于图像识别技术的监测设备,主要用于实时监测和识别泥石流的发生和演变过程,以预警和减灾为目的。这种摄像机通常采用高清晰度摄像头和图像处理系统,能够实时拍摄泥石流事件,并对图像进行处理和分析&a…