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

相关文章

react ant design Upload 多文件上传 beforeUpload 会调用很多次,怎么只获取一次

当使用Ant Design的Upload组件实现多文件上传时,beforeUploadHandler函数会被每个选中的文件调用一次。如果您只想获取一次选中的文件而不是每个文件都触发一次处理逻辑,可以采取以下方法: 使用 useRef 钩子保存文件列表:可以使用React的useRef钩子在组件中保存一个文件列表变量,而不是使用useState。这样就可以确保文件列表只在初始选择文件时获取一次。示

批处理执行VC运行时与.Net

@echo 安装完窗口会自动关闭!!! @echo off start /wait vcredist_x86/vcredist_x86.exe /q /norestart start /wait DotNetFx40/dotNetFx40_Full_x86_x64.exe /q /norestart

来自大厂硬盘的降维打击!当希捷酷玩520 1TB SSD卷到369,请问阁下该怎么应对?

来自大厂硬盘的降维打击!当希捷酷玩520 1TB SSD卷到369,请问阁下该怎么应对? 哈喽小伙伴们好,我是Stark-C~ 今年4月份的时候因为电脑上的游戏盘突然挂掉,为了性价比选购了希捷酷玩520 1TB SSD,同时我也是在本站为大家分享了这款硬盘的具体表现。 记得我购买这款硬盘花了差不多500块钱,当时 SSD 的市场价格普遍偏贵,希捷作为硬盘大厂的老大哥,拥有深厚的技术底蕴,不管

基于JMS的分布式爬虫系统的设计与实现7

随着互联网技术的飞速发展,网络信息以指数型趋势高速增长。对于一个要对数据进行统计分析的系统而言,搜集数据的过程是冗长枯燥的。基于这一现实,分布式爬虫系统获得了发展的契机。系统通过多台服务器的协调运行,成倍地提高了爬虫的效率。当然,分布式系统在获得效率提升的同时也大大增加了系统的复杂程度,开发人员需要考虑多方面因素以确保系统的正常运转。 本文对分布式爬虫系统的架构做了深入的讨论,给出了选择该架构的

JVM运行时数据区 - 程序计数器

运行时数据区 Java虚拟机在执行Java程序的过程中,会把它管理的内存划分成若干个不同的区域,这些区域有各自的用途、创建及销毁时间,有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和结束而建立和销毁,这些共同组成了Java虚拟机的运行时数据区域。 如上图,运行时数据区由方法区、堆区、Java虚拟机栈、本地方法栈、程序计数器五部分组成,其中方法区和堆区是线程共享的区域,Java虚

一本企业画册怎么制作成二维码分享

​在这个数字化时代,二维码已经成为一种便捷的分享方式。企业画册,作为展示企业形象、宣传产品和服务的重要工具,也可以通过二维码进行分享。现在我来教你如何将一本企业画册制作成二维码分享。 1. 准备好制作工具:FLBOOK在线制作电子杂志平台 2. 转换文档:点击开始创作选择上传PDF文件,将PPT文档转换为电子书(Word、PPT、PDF、JPG四种格式文件都可以转换)。

css中的bfc怎么玩?

首先弄明白一个概念,上面是bfc? w3c是这样解释 BFC(Block Formatting Context)是Web页面中盒模型布局的CSS渲染模式。它的定位体系属于常规文档流。 说通俗一点就是: float的值不为none position的值不为static或者relative display的值为 table-cell, table-caption, inline-bl

python合并多个excel表格文件为一个或者放到不同的sheet中

场景:许多excel文件格式和内容的标题都一样,需要将这些表格合并到一起,有5个表,每个表10行的话,合并后就是50行的数据 方案1:文件放到一个目录中遍历所有文件然后进行数据合并-合并到不同sheet 目录 d:/表格存放/ 下存放了5个excel文件 要求输出到d盘根目录下面 ‘合并后表格.xlsx’ import osimport pandas as pd#定义一个函数读取文件路径

VS2010打开项目提示未能正确加载解决方案中一个或多个项目

今天打开vs2010项目,竟然提示“未能正确加载解决方案中一个或多个项目”,还有什么详细去输出看,我在网上找了下,没有解决,我看输出下边是说“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\Microsoft.Cpp.x64.targets”有问题,然后我就去其他电脑拷贝了一个,试了下,卧槽,竟然解决了,虽然不知道是

如何再tensorflow2.0 运行tensorflow1.x 代码

在代码中没有使用contrib模块的情况下,可以在代码最前端加上如下两句,直接可以实现的代码升级。 import tensorflow.compat.v1 as tftf.disable_v2_behavior()   参考网站:https://cloud.tencent.com/developer/article/1473538