【python爬虫之 funboost 分布式函数调度框架】

  1. Funboost框架介绍
    • 背景
      • 在处理大规模数据爬取任务或者需要高并发执行的爬虫任务时,传统的单线程或单进程爬虫可能效率低下。Funboost框架应运而生,它提供了一种分布式函数调度的解决方案,使得可以轻松地将爬虫任务分布到多个节点(机器或进程)上执行,从而提高爬虫效率。
    • 核心概念
      • 任务队列(Queue):Funboost使用任务队列来存储待执行的爬虫任务。这些任务可以是对某个网页的爬取请求、数据解析操作等。例如,将一系列需要爬取的URL放入任务队列中,等待被执行。
      • 消费者(Consumer)/工作者(Worker):从任务队列中获取任务并执行的实体。可以是一个进程或者一个线程,在分布式环境下,这些消费者可以分布在不同的机器上。它们不断地从队列中取出任务,执行爬虫相关的操作,如发送HTTP请求、解析HTML等。
      • 生产者(Producer):负责生成任务并将其放入任务队列的角色。在爬虫场景中,生产者可以是一个脚本,它收集需要爬取的网页链接,然后将这些任务(以URL为主要信息)放入任务队列。
    • 功能特点
      • 分布式执行:支持在多个节点上同时执行任务,通过合理配置可以充分利用集群资源进行大规模爬虫。
      • 灵活的任务调度:能够设置定时任务、延迟任务和周期性任务。例如,可以设置每隔一段时间就对某个网站的热门页面进行爬取,或者延迟一段时间后开始爬取某个新上线的网页。
      • 任务监控与管理:提供了一个直观的监控界面,可以查看任务的执行进度、状态(如成功、失败、等待等)、执行次数等信息。方便开发者及时发现问题并调整爬虫策略。
      • 易于集成:可以很方便地与现有的Python爬虫库(如Requests、BeautifulSoup、Scrapy等)集成,使得开发者可以利用熟悉的工具进行爬虫开发。
  2. 安装Funboost
    • 使用pip命令进行安装,在命令行中执行:pip install funboost。安装完成后,就可以在Python项目中引入Funboost库。
  3. 一个简单的爬虫实例与Funboost结合
    • 准备工作:定义一个简单的网页爬取函数
      • 假设我们要爬取一个简单的新闻网站的文章标题和内容,使用RequestsBeautifulSoup库。
      • 首先,导入所需的库:
python 复制代码
import requests
from bs4 import BeautifulSoup
复制代码
 - 然后,定义一个爬取函数:
python 复制代码
def crawl_news(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    title = soup.find('h1').text
    content = soup.find('div', class_='article - content').text
    return {'title': title, 'content': content}
  • 使用Funboost调度爬虫任务
    • 导入Funboost相关模块并创建任务队列:
python 复制代码
from funboost import BoostQueue
queue = BoostQueue('news_crawler_queue')
复制代码
 - 将爬取函数注册到任务队列中:
python 复制代码
@queue.deco('crawl_news')
def crawl_news(url):
    # 这里是之前定义的爬取函数内容
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    title = soup.find('h1').text
    content = soup.find('div', class_='article - content').text
    return {'title': title, 'content': content}
  • 生成任务并放入队列(生产者部分)
    • 假设我们有一个包含新闻网页URL的列表,我们要将这些URL作为任务放入队列。
python 复制代码
news_urls = ['http://example.com/news1', 'http://example.com/news2']
for url in news_urls:
    # 将每个URL作为任务放入队列
    queue.push(url)
  • 启动消费者(工作者)来执行任务
    • 在命令行中执行:funboost_worker --queue_name news_crawler_queue。这将启动工作者进程,它会从news_crawler_queue任务队列中获取任务并执行crawl_news函数。
  • 监控任务执行情况
    • 可以通过访问Funboost提供的监控界面(通常在浏览器中访问http://localhost:5555,具体端口可能因配置而异)来查看任务的执行情况。在监控界面中,可以看到任务的执行状态、成功或失败的数量等信息。
  1. 深入教程:高级功能与优化
    • 分布式部署
      • 配置多个工作者节点 :为了实现真正的分布式,需要在多台机器或者多个进程上启动工作者。可以通过在不同的服务器上安装Funboost,并执行funboost_worker --queue_name news_crawler_queue来启动工作者。确保这些机器能够访问任务队列(可能需要配置网络和权限等)。
      • 负载均衡:Funboost本身会自动对任务进行分配,但在复杂的网络环境或者大规模集群中,可能需要结合一些外部的负载均衡工具来优化任务分配,确保每个工作者节点的负载相对均衡。
    • 任务调度优化
      • 定时和周期性任务设置:如果需要定期爬取某些网站的数据,比如每天早上9点爬取某个新闻网站的头条新闻。可以使用Funboost的定时任务功能。在创建任务队列时,可以设置定时参数。例如:
python 复制代码
from funboost import BoostQueue, funboost_config_deafult
funboost_config_deafult.TASK_TIME_OUT = 3600  # 设置任务超时时间为1小时
queue = BoostQueue('daily_news_crawler_queue', qps=1, cron_expression='0 0 9 * * *')
  • 上述代码中,cron_expression参数使用了cron表达式来设置定时任务,这里表示每天早上9点执行任务,qps参数表示每秒处理的任务数量,这里设置为1。
  • 错误处理与重试机制
    • 在爬虫过程中,可能会遇到网络故障、目标网站结构变化等问题导致任务失败。Funboost提供了错误处理和重试机制。可以在注册函数时设置重试次数和重试间隔。例如:
python 复制代码
@queue.deco('crawl_news', max_retry_times = 3, retry_interval = 60)
def crawl_news(url):
    try:
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        title = soup.find('h1').text
        content = soup.find('div', class_='article - content').text
        return {'title': title, 'content': content}
    except Exception as e:
        print(f"任务失败,原因:{e}")
        raise
  • 上述代码中,max_retry_times表示最多重试3次,retry_interval表示每次重试间隔60秒。当任务执行失败时,会按照设置进行重试,直到达到重试次数上限。
  • 与数据库集成
    • 存储爬取数据:为了长期保存爬取的数据,可以将Funboost与数据库集成。例如,使用SQLAlchemy将爬取的数据存储到关系型数据库(如MySQL、PostgreSQL等)或者使用MongoDB的Python驱动将数据存储到MongoDB中。
    • 任务状态存储:Funboost本身也可以将任务的状态(如已完成、等待、失败等)存储到数据库中,方便进行持久化管理和查询。可以在配置文件中指定数据库连接信息来实现这一功能。
相关推荐
TTBIGDATA8 小时前
【Ambari Plus】14.Hue 安装
大数据·hadoop·ambari·hdp·hue·cdh·bigtop
AI创界者8 小时前
零基础上手!ComfyUI + LTX-2.3 图生视频完整工作流搭建与调优指南(附避坑细节)
大数据·人工智能
充钱大佬8 小时前
Python测试基础教程
python·log4j·apache
有Li9 小时前
基于扩散模型的超声计算机断层成像实现肌肉骨骼组织高保真三维重建文献速递/基于多模态的医学影像分割与理解
大数据·深度学习·文献·医学生
weishuangyun1239 小时前
2026小程序开发全流程:从平台选择到功能定制的完整白皮书
大数据
记忆停留w9 小时前
从单体到微服务:Redis 协同 MySQL、Milvus、MinIO 搭建企业级RAG/AI Agent脚手架架构
大数据·人工智能·redis·微服务·ai·架构·milvus
初心丨哈士奇10 小时前
Python 四大基础容器|列表篇
python
明理的信封11 小时前
AI 基础设施的“去 Python 化“:Rust 与 C# 的两条替代路径
人工智能·python·rust
亿信华辰软件11 小时前
数据资产入表,数据治理厂商能做什么
大数据·数据资产·数据资产入表
小顿的企业观察12 小时前
中企出海战略规划,正在从“走出去”转向“走进去”
大数据·运维·人工智能·产品运营·制造