【Python爬虫之:使用 Funboost 分布式函数调度爬取视频】

news2024/11/20 8:20:04

使用 Funboost 分布式函数调度爬取视频

  • 1. 安装依赖
  • 2. 使用 Funboost 配置分布式爬虫
    • 创建 Funboost 配置文件
    • 配置爬虫任务
    • 保存视频和图片
    • 启动爬虫
  • 3. 处理并存储数据
  • 4. 免责声明

1. 安装依赖

首先,我们需要安装一些必要的依赖。你可以使用 pip 来安装它们:

pip install requests beautifulsoup4 funboost
  • requests: 用来发送 HTTP 请求。
  • beautifulsoup4: 用来解析 HTML 页面。
  • funboost: 分布式函数调度框架。

2. 使用 Funboost 配置分布式爬虫

在 Funboost 中,我们可以使用任务调度框架来分配和管理爬虫任务。下面的示例将演示如何使用 Funboost 来进行视频爬取。

创建 Funboost 配置文件

首先,创建一个 Python 文件 config.py,用来配置 Funboost:

# config.py
from funboost import Funboost

# 初始化 Funboost 配置
funboost = Funboost(project="douyin_beauty_crawler", debug=True)

# 配置爬取任务队列
funboost.set_queue("video_queue", max_jobs=5)
funboost.set_queue("image_queue", max_jobs=10)

这里的 project="douyin_beauty_crawler" 是指定项目名称,video_queueimage_queue 是我们用来存储视频和图片的任务队列。

配置爬虫任务

我们需要创建两个任务,一个用来爬取视频,另一个用来爬取图片。每个任务都会由 Funboost 分布式框架调度执行。

# crawler.py
import requests
from bs4 import BeautifulSoup
from funboost import FunboostTask
import os

# 视频爬取任务
@FunboostTask(queue="video_queue")
def fetch_video_data(page_number: int):
    base_url = "https://www.douyin.com/beauty"
    # 获取视频页面 HTML
    response = requests.get(f"{base_url}?page={page_number}")
    if response.status_code != 200:
        print(f"Failed to retrieve page {page_number}")
        return
    
    # 解析 HTML
    soup = BeautifulSoup(response.text, "html.parser")
    
    # 提取视频 URL
    video_elements = soup.find_all("a", class_="video-link")
    video_urls = [el.get("href") for el in video_elements if el.get("href")]

    # 打印爬取的视频 URL
    for video_url in video_urls:
        print(f"Found video URL: {video_url}")

    return video_urls

# 图片爬取任务
@FunboostTask(queue="image_queue")
def fetch_image_data(page_number: int):
    base_url = "https://www.douyin.com/beauty"
    # 获取抖音页面 HTML
    response = requests.get(f"{base_url}?page={page_number}")
    if response.status_code != 200:
        print(f"Failed to retrieve page {page_number}")
        return
    
    # 解析 HTML
    soup = BeautifulSoup(response.text, "html.parser")
    
    # 提取图片 URL
    image_elements = soup.find_all("img", class_="image-class")
    image_urls = [img.get("src") for img in image_elements if img.get("src")]

    # 打印爬取的图片 URL
    for img_url in image_urls:
        print(f"Found image URL: {img_url}")

    return image_urls

解释:

  1. @FunboostTask(queue="video_queue"):标记该函数为一个任务,并指定该任务使用的视频队列进行调度。
  2. requests.get():发送 HTTP 请求获取页面内容。
  3. BeautifulSoup:解析 HTML,提取视频和图片的 URL。
  4. video_elementsimage_elements:通过 BeautifulSoup 查找视频和图片标签。

保存视频和图片

为了保存视频和图片,我们可以使用 requests 下载内容:

# 下载视频
def download_video(video_url: str, save_path: str):
    response = requests.get(video_url, stream=True)
    with open(save_path, "wb") as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

# 下载图片
def download_image(image_url: str, save_path: str):
    response = requests.get(image_url, stream=True)
    with open(save_path, "wb") as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

启动爬虫

为了启动爬虫并调度任务,我们需要在主程序中调用:

# main.py
from funboost import Funboost
from crawler import fetch_video_data, fetch_image_data

# 初始化 Funboost 配置
funboost = Funboost(project="douyin_beauty_crawler", debug=True)

# 启动任务调度
if __name__ == "__main__":
    # 触发视频爬取任务
    funboost.add(fetch_video_data, page_number=1)
    # 触发图片爬取任务
    funboost.add(fetch_image_data, page_number=1)

    # 启动任务调度
    funboost.run()

解释:

  • funboost.add():将爬取任务添加到任务队列中,并传递参数。
  • funboost.run():启动 Funboost 调度器,开始执行任务。

3. 处理并存储数据

为了更好地管理爬取的数据,我们可以将视频和图片保存到本地文件夹中:

# 下载并保存视频和图片
def save_media(media_urls, media_type="image"):
    for idx, url in enumerate(media_urls):
        file_extension = "mp4" if media_type == "video" else "jpg"
        save_path = f"{media_type}_{idx + 1}.{file_extension}"
        if media_type == "video":
            download_video(url, save_path)
        else:
            download_image(url, save_path)
        print(f"Saved {media_type} to {save_path}")

# 在爬取视频和图片后调用保存函数
video_urls = fetch_video_data(page_number=1)
save_media(video_urls, media_type="video")

image_urls = fetch_image_data(page_number=1)
save_media(image_urls, media_type="image")

解释:

  • save_media():根据 URL 列表下载并保存视频或图片。
  • download_video()download_image():将视频和图片分别保存到本地文件系统。

4. 免责声明

记住,爬虫要遵守相关网站的 robots.txt 和法律法规,避免对网站造成负担。

  1. 内容准确性:本博客中的所有信息和内容仅供参考之用。尽管作者尽力确保所提供的信息准确无误,但不对其准确性、完整性或适用性作出任何明示或暗示的保证。作者不对因依赖或使用本博客内容而导致的任何直接或间接损失或损害负责。
  2. 版权声明:本博客中的所有内容,包括文字、图片和代码,均为作者原创或引用自公开的资源。若涉及到版权问题或引用的内容不符合版权规定,请及时联系作者以做出相应的处理。未经授权,禁止以任何形式复制、转载或商业使用本博客内容。
  3. 个人观点: 本博客中的观点和见解仅代表作者个人的观点,并不代表 CSDN或其他机构的观点。作者在博客中分享的技术知识和经验基于个人的学习和实践,读者在应用这些信息时需自行判断和承担风险。
  4. 法律责任:作者不对因使用本博客中的信息而产生的任何法律责任或纠纷承担责任。读者在依赖本博客内容时应自行进行充分的验证,并遵守相关的法律法规。
  5. 网站链接:本博客可能包含指向其他网站的链接,这些链接仅为方便读者而提供。作者不对这些网站的内容、准确性或可靠性负责。访问这些链接时,读者需自行承担风险。
  6. 技术变更: 由于技术和信息更新的速度,本博客中的技术信息和建议可能会有所变化。作者不对因技术变更或信息更新造成的任何问题或损失负责。
  7. 联系信息: 如果您对本博客内容有任何疑问或建议,欢迎通过私信作者沟通。作者会尽力解答您的问题并做出适当的修正。

推荐阅读:《Python 爬虫入门级教程之爬取小说》,《python爬虫–爬取电商商品及对其销量进行分析》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…

力扣-Hot100-数组【算法学习day.37】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出(scala) 0.前言–数据源 在进行数据转换之前,需要进行数据读取。 数据读取分为4大部分: (1)内置数据源; 又分为文件数据源; socket…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节:使用Postman和浏览器开发者工具 在网络爬虫开发过程中,我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具(特别是Network面板和Console面板)是两种最常用的工具,能够帮助开发者有效地捕…

vue2侧边导航栏路由

<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

JVM类加载过程-Loading

一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…

BERT--公认的里程碑

前言 如果说&#xff0c;让我选Transformer架构的哪个模型最深入人心&#xff0c;我将毫不犹豫的选择BERT&#xff01; BERT 的意义在于&#xff0c;从大量无标记的数据集中训练得到的深度模型&#xff0c;可以限制提高各项自然语言处理任务的准确率。 BERT 在当时&#xff0…

<项目代码>YOLOv8 瞳孔识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…

果韵 2.0.1| 听歌神器,双端支持,支持下载歌曲和歌词

果韵是一款支持Windows和安卓双端的音乐播放器&#xff0c;支持自定义音源&#xff0c;界面简洁。用户可以通过缓存下载歌曲和歌词。为了使用这些功能&#xff0c;需要先进行音源导入。通过设置中的存储设置&#xff0c;将缓存文件夹移动到download目录下&#xff0c;之后缓存的…

Allegro从.brd文件中导出器件ball map

Step 1&#xff08;可选&#xff09;&#xff1a;设置网络颜色 Step2&#xff1a;File->Export->Symbol Spreadsheet\ Step3&#xff1a;Primary text选择Net Name Step 4&#xff1a;在.brd所有文件夹下生成一个ball map文件&#xff0c;其中网络颜色与Step 1一致。ba…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

家庭网络常识:猫与路由器

这张图大家应该不陌生——以前家庭网络的连接方式。 图1 家庭网络连接示意图 来说说猫/光猫&#xff1a; 先看看两者的图片。 图2 猫 图3 光猫 这个东西因为英文叫“modem”&#xff0c;类似中文的“猫”&#xff0c;所以简称“猫”。 猫和光猫的区别就是&#xff0c;一…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…

elasticsearch的倒排索引是什么?

大家好&#xff0c;我是锋哥。今天分享关于【elasticsearch的倒排索引是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; elasticsearch的倒排索引是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 倒排索引&#xff08;Inverted Index&a…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

uniApp项目运行到鸿蒙手机,应用图标一直是H,应用名一直是HBuilder问题

项目运行到鸿蒙手机&#xff0c;应用图标一直是H,应用名一直是HBuilder问题 应用运行到鸿蒙手机和鸿蒙模拟器&#xff0c;应用图标一直是H,应用名一直是HBuilder&#xff0c;在自动生成的harmony-configs文件夹下也没有配置的文件&#xff0c; 这时候需要你将DevEco Studio 下…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

中伟视界:AI智能分析算法如何针对非煤矿山的特定需求,提供定制化的安全生产解决方案

非煤矿山智能化改造&#xff0c;除了政策文件&#xff0c;上级监管单位需要安装的AI智能分析算法功能之外的&#xff0c;矿方真正关心的&#xff0c;能解决矿方安全生产隐患的AI智能分析算法功能有哪些呢&#xff1f; 经过与矿方的现场交流沟通&#xff0c;收集第一现场人员对安…