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

news/2024/5/20 1:34:14

运行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() 方法来等待爬虫执行完毕。这是因为异步框架通常会在任务完成时通过回调或者异步等待的方式来处理结果,而不是像同步编程那样需要显式地等待任务的完成。


http://www.mrgr.cn/p/51876228

相关文章

安卓开发(二)Android开发基础知识

了解Android Android大致可以分为4层架构:Linux内核层、系统运行库层、应用框架层和应用层。 内核层:Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动…

常用算法汇总

作者:指针不指南吗 专栏:算法篇 🐾算法思维逻辑🐾 文章目录 1.判断闰年2.计算从某天到某天的天数3.二分4. 前缀和5.差分6.图论6.1dfs6.2走迷宫 7.最短路7.1dijkstra7.2foly 8.并查集9.数论9.1gcd lcm9.2判断素数(质数)9.3分解质因…

指代消解类方法梳理

概念: MLM:带遮罩的语言模型 NSP:单句预测,任务包括两个输入序列 SBO:分词边界目标 1.spanBERT,2019 spanBERT是对bert从分词到文本跨度的优化,主要有两方面的优化:&#xff08…

开发组合php+mysql 人才招聘小程序源码搭建 招聘平台系统源码+详细图文搭建部署教程

随着互联网的快速发展,传统的招聘方式已经不能满足企业和求职者的需求。为了提高招聘效率,降低招聘成本,越来越多的人开始关注人才招聘小程序、在线招聘平台。分享一个人才招聘小程序源码及搭建,让招聘更加高效便捷。系统是运营级…

C++数据类型

整型C++除了int类型 还有其他类型的数据,所占空间也不一样 sizeof() 函数——得到数据所占的字节#include "iostream" using namespace std;int main() {system("chcp 65001");long long num = 20;cout << "long long 类型占" << s…

Stable Diffusion:AI绘画的新纪元

摘要&#xff1a; Stable Diffusion&#xff08;SD&#xff09;作为AI绘画领域的新星&#xff0c;以其开源免费、强大的生成能力和高度的自定义性&#xff0c;正在引领一场艺术与技术的革命。本文旨在为读者提供Stable Diffusion的全面介绍&#xff0c;包括其原理、核心组件、安…

SpringBootWeb入门

SpringBoot可以帮助我们快速的构建应用程序、简化开发、提高效率 创建SpringBoot工程&#xff0c;并勾选web开发相关依赖 定义HelloController类&#xff0c;添加方法&#xff0c;并添加注解 运行测试 创建SpringBoot工程(联网下载) 在File里面点击new Module 点击next 修…

C++整型

C++除了int类型 还有其他类型的数据,所占空间也不一样 sizeof() 函数——得到数据所占的字节#include "iostream" using namespace std;int main() {system("chcp 65001");long long num = 20;cout << "long long 类型占" << sizeo…

常见的容器技术有哪些

容器技术是一种轻量级的软件封装方式&#xff0c;它将软件代码及其依赖项打包在一起&#xff0c;这样应用可以在任何支持容器的系统上无缝运行。它允许应用程序及其依赖项在一个隔离的环境中运行&#xff0c;这个环境被称为容器。容器技术有助于提高应用程序的可移植性、一致性…

Azure AKS日志查询KQL表达式

背景需求 Azure&#xff08;Global&#xff09; AKS集群中&#xff0c;需要查询部署服务的历史日志&#xff0c;例如&#xff1a;我部署了服务A&#xff0c;但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代&#xff0c;而我在命令行中只能看到当前版本的pod日志&#xff…

TypeScript学习日志-第十九天(namespace命名空间)

namespace命名空间 一、基本用法 namespace 所有的变量以及方法必须要导出才能访问&#xff0c;如图&#xff1a; 二、 嵌套 namespace 可以进行嵌套使用&#xff0c;如图&#xff1a; 它也必须需要导出才能访问 三、合并 当我们出现两个同名的 namespace 它就会合并这两…

Penpad再获 Presto Labs 投资,Scroll 生态持续扩张

Penpad是Scroll生态的LaunchPad平台&#xff0c;其整计划像收益聚合器以及RWA等功能于一体的综合性Web3平台拓展&#xff0c;该平台在近期频获资本市场关注&#xff0c;并获得了多个知名投资者/投资机构的支持。 截止到本文发布前&#xff0c;Penpad已经获得了包括Scroll联合创…

华为 二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

C++ cout打印输出 (解决输出乱码)

cout打印输出输出单份内容// 输出单份内容cout << "Hello World!" << endl;cout << 10 << endl;输出多份内容// 输出多份内容cout << "I am " << 18 << "years old" << endl;可以自由组合多个&…

鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽

进程间为何要通讯 ? 鸿蒙内核默认支持 64个进程和128个任务&#xff0c;由进程池和任务池统一管理.内核设计尽量不去打扰它们&#xff0c;让各自过好各自的日子&#xff0c; 但大家毕竟在一口锅里吃饭&#xff0c; 不可能不与外界联系&#xff0c; 联系就得有渠道&#xff0c…

栈的磁盘优化:降低存取成本的算法与实现

栈的磁盘优化&#xff1a;降低存取成本的算法与实现 问题背景简单实现方法的分析实现方法PUSH操作POP操作成本分析渐近分析 优化实现方法实现方法成本分析渐近分析 进一步优化&#xff1a;双页管理策略实现方法管理策略成本分析 伪代码示例C代码示例结论 问题背景 在具有有限快…

28.leetcode---前K个高频单词(Java版)

题目链接: https://leetcode.cn/problems/top-k-frequent-words/description/ 题解: 代码: 测试:

windows系统远程执行脚本部署项目操作手册

windows系统远程执行脚本部署项目操作手册 windows系统远程执行脚本部署项目 如果频繁的需要部署项目到远程的服务器上,每次要手动上传项目,然后停止项目,启动项目,很麻烦,像Linux天生支持远程执行脚本 Windows借助工具也可以做到. 安装WinSCP软件 自行下载软件或关注我的公…

Material Studio 计算分子静电力、电荷密度以及差分电荷密度

1.先打开Material Studio导入要计算的分子cif文件或者mol文件&#xff0c;直接Flie-Import 2.高斯几何优化一下结构&#xff0c;参数按照我的设置就行&#xff0c;一般通用&#xff0c;后面出问题再调整 3.点完Run后会跳出很多计算过程&#xff0c;不用管&#xff0c;等他计算完…

新能源汽车动力电池热管理-液冷方案应用原理与应用前景简介

前言 动力电池是新能源汽车的核心部件之一&#xff0c;其性能和寿命直接影响着车辆的续航里程和使用成本。液冷方案作为一种常见的动力电池温控解决方案&#xff0c;被广泛应用于新能源汽车领域。本文将详细介绍液冷方案的原理、发展方向以及市场前景。 一、液冷方案的原理 …