【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本身也可以将任务的状态(如已完成、等待、失败等)存储到数据库中,方便进行持久化管理和查询。可以在配置文件中指定数据库连接信息来实现这一功能。
相关推荐
隔着天花板看星星2 小时前
Kafka-创建topic源码
大数据·分布式·中间件·kafka
ad禥思妙想2 小时前
如何运行python脚本
开发语言·python
威威猫的栗子2 小时前
用 Python 与 Turtle 创作属于你的“冰墩墩”!
开发语言·python·turtle
goTsHgo2 小时前
在Spark Streaming中简单实现实时用户画像系统
大数据·分布式·spark
IT古董2 小时前
【机器学习】超简明Python基础教程
开发语言·人工智能·python·机器学习
老周聊架构3 小时前
聊聊Flink:Flink中的时间语义和Watermark详解
大数据·flink
别这么骄傲3 小时前
Flink Lookup Join(维表 Join)
大数据·flink·linq
qq_q9922502773 小时前
django基于python 语言的酒店推荐系统
后端·python·django
小李L3 小时前
Python3 Flask 应用中使用阿里短信发送
后端·python·flask
好看资源平台3 小时前
动态网站数据爬取——Selenium的使用
爬虫·python