当前位置:   article > 正文

scrapy pipelines

scrapy pipelines

1.时间的处理

获取当前时间的字符串

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

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

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

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

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

  1. # 1.在settings 启用统计信息中间件 STATS_CLASS = 'scrapy.statscollectors.MemoryStatsCollector'
  2. # 2.用于连接信号,以便在爬虫关闭时调用spider_closed方法
  3. @classmethod
  4. def from_crawler(cls, crawler):
  5. pipeline = cls()
  6. crawler.signals.connect(pipeline.spider_closed, signal=scrapy.signals.spider_closed)
  7. return pipeline
  8. # 3.获取爬虫运行的统计信息,并将其保存到JSON文件中
  9. def spider_closed(self, spider):
  10. stats = spider.crawler.stats.get_stats()
  11. with open('./log/stats.json', 'w') as f:
  12. 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的进程没有释放。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/41789
推荐阅读
相关标签
  

闽ICP备14008679号