【python爬虫之 funboost 分布式函数调度框架】
- Funboost框架介绍
- 背景
- 在处理大规模数据爬取任务或者需要高并发执行的爬虫任务时,传统的单线程或单进程爬虫可能效率低下。Funboost框架应运而生,它提供了一种分布式函数调度的解决方案,使得可以轻松地将爬虫任务分布到多个节点(机器或进程)上执行,从而提高爬虫效率。
- 核心概念
- 任务队列(Queue):Funboost使用任务队列来存储待执行的爬虫任务。这些任务可以是对某个网页的爬取请求、数据解析操作等。例如,将一系列需要爬取的URL放入任务队列中,等待被执行。
- 消费者(Consumer)/工作者(Worker):从任务队列中获取任务并执行的实体。可以是一个进程或者一个线程,在分布式环境下,这些消费者可以分布在不同的机器上。它们不断地从队列中取出任务,执行爬虫相关的操作,如发送HTTP请求、解析HTML等。
- 生产者(Producer):负责生成任务并将其放入任务队列的角色。在爬虫场景中,生产者可以是一个脚本,它收集需要爬取的网页链接,然后将这些任务(以URL为主要信息)放入任务队列。
- 功能特点
- 分布式执行:支持在多个节点上同时执行任务,通过合理配置可以充分利用集群资源进行大规模爬虫。
- 灵活的任务调度:能够设置定时任务、延迟任务和周期性任务。例如,可以设置每隔一段时间就对某个网站的热门页面进行爬取,或者延迟一段时间后开始爬取某个新上线的网页。
- 任务监控与管理:提供了一个直观的监控界面,可以查看任务的执行进度、状态(如成功、失败、等待等)、执行次数等信息。方便开发者及时发现问题并调整爬虫策略。
- 易于集成:可以很方便地与现有的Python爬虫库(如Requests、BeautifulSoup、Scrapy等)集成,使得开发者可以利用熟悉的工具进行爬虫开发。
- 背景
- 安装Funboost
- 使用
pip
命令进行安装,在命令行中执行:pip install funboost
。安装完成后,就可以在Python项目中引入Funboost库。
- 使用
- 一个简单的爬虫实例与Funboost结合
- 准备工作:定义一个简单的网页爬取函数
- 假设我们要爬取一个简单的新闻网站的文章标题和内容,使用
Requests
和BeautifulSoup
库。 - 首先,导入所需的库:
- 假设我们要爬取一个简单的新闻网站的文章标题和内容,使用
- 准备工作:定义一个简单的网页爬取函数
import requests
from bs4 import BeautifulSoup
- 然后,定义一个爬取函数:
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相关模块并创建任务队列:
from funboost import BoostQueue
queue = BoostQueue('news_crawler_queue')
- 将爬取函数注册到任务队列中:
@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作为任务放入队列。
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
,具体端口可能因配置而异)来查看任务的执行情况。在监控界面中,可以看到任务的执行状态、成功或失败的数量等信息。
- 可以通过访问Funboost提供的监控界面(通常在浏览器中访问
- 深入教程:高级功能与优化
- 分布式部署
- 配置多个工作者节点:为了实现真正的分布式,需要在多台机器或者多个进程上启动工作者。可以通过在不同的服务器上安装Funboost,并执行
funboost_worker --queue_name news_crawler_queue
来启动工作者。确保这些机器能够访问任务队列(可能需要配置网络和权限等)。 - 负载均衡:Funboost本身会自动对任务进行分配,但在复杂的网络环境或者大规模集群中,可能需要结合一些外部的负载均衡工具来优化任务分配,确保每个工作者节点的负载相对均衡。
- 配置多个工作者节点:为了实现真正的分布式,需要在多台机器或者多个进程上启动工作者。可以通过在不同的服务器上安装Funboost,并执行
- 任务调度优化
- 定时和周期性任务设置:如果需要定期爬取某些网站的数据,比如每天早上9点爬取某个新闻网站的头条新闻。可以使用Funboost的定时任务功能。在创建任务队列时,可以设置定时参数。例如:
- 分布式部署
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提供了错误处理和重试机制。可以在注册函数时设置重试次数和重试间隔。例如:
@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本身也可以将任务的状态(如已完成、等待、失败等)存储到数据库中,方便进行持久化管理和查询。可以在配置文件中指定数据库连接信息来实现这一功能。
原文地址:https://blog.csdn.net/weixin_44892179/article/details/143883885
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!