Fastapi中怎么一次性运行多个Scrapy爬虫

2024-05-07 23:20

本文主要是介绍Fastapi中怎么一次性运行多个Scrapy爬虫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

运行Scrapy爬虫很简单,直接"Scrapy crawl 爬虫名称"即可。但是我们如果想在Fastapi中通过接口的方式一次性运行多个爬虫。那该怎么实现?

假如在scrapy下面的spiders里面写了许多爬虫文件,你可以在spiders的__init__.py文件中,将写好的爬虫类导入到__init__文件里面,然后将类保存到一个序列里面,用于后续启动。例如

from .apnews import ApnewsSpider
from .cnnnews import CnnnewsSpider
...SPIDERS = [ApnewsSpider,CnnnewsSpider,...
]

当然,如果你觉得麻烦,完全可以动态添加,比如使用装饰器等。

废话少说,接着直接看代码:

import asyncio
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
PROCESS = CrawlerProcess(get_project_settings())
_CRAWL_LOCK = asyncio.Lock()async def run_spiders():for spider_class in SPIDERS:_ = PROCESS.crawl(spider_class)@router.post('/crawl/news', description="新闻爬取")
async def crawl_news(background_tasks: BackgroundTasks):async with _CRAWL_LOCK:try:if not PROCESS.crawlers or not any(crawler.crawling for crawler in PROCESS.crawlers):background_tasks.add_task(run_spiders)else:return JSONResponse(status_code=status.HTTP_400_BAD_REQUEST, content="爬虫正在运行")except Exception as error:error_msg = f'Exception in start crawler, reason: {str(error)}'log_it(error_msg, level=logging.ERROR)return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content="爬虫启动失败")return JSONResponse(status_code=status.HTTP_200_OK, content="OK")

PROCESS = CrawlerProcess(get_project_settings()): 这一行创建了一个 Scrapy 的 CrawlerProcess 对象,该对象用于管理和运行爬虫。_CRAWL_LOCK = asyncio.Lock()这一行创建了一个 asyncio 锁,用于确保在同一时刻只有一个异步任务可以运行。这是为了防止多个请求同时触发爬虫启动时可能出现的问题。run_spiders是运行爬虫的主要函数,其中SPIDERS就是上面所有爬虫类的列表,依次遍历这个爬虫类列表,使用PROCESS.crawl(spider_class)调用了 CrawlerProcess 对象的 crawl 方法来启动指定的爬虫。

我如果不想在fastapi里面运行多个爬虫,只需在普通的main函数里面即可,这时该怎么修改(这里有个坑

也直接看代码:

PROCESS = CrawlerProcess(get_project_settings())
_CRAWL_LOCK = threading.Lock()def run_spiders():for spider_class in SPIDERS:_ = PROCESS.crawl(spider_class)PROCESS.start()PROCESS.join()def crawl_spider():with _CRAWL_LOCK:try:if not PROCESS.crawlers or not any(crawler.crawling for crawler in PROCESS.crawlers):run_spiders()else:logging.error("爬虫正在运行。。。")except Exception as error:error_msg = f'Exception in start crawler, reason: {str(error)}'logging.error(error_msg)if __name__ == '__main__':crawl_spider()

这里如果在普通函数里面遍历运行爬虫类,需要PROCESS.start(),PROCESS.join()用于等待所有爬虫执行完成正常退出。否则遍历完爬虫类程序就会结束了。

而在fastapi异步模式下,通常不需要使用 join() 方法来等待爬虫执行完毕。这是因为异步框架通常会在任务完成时通过回调或者异步等待的方式来处理结果,而不是像同步编程那样需要显式地等待任务的完成。

这篇关于Fastapi中怎么一次性运行多个Scrapy爬虫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968688

相关文章

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://