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

使用 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"# 获取视频页面 HTMLresponse = requests.get(f"{base_url}?page={page_number}")if response.status_code != 200:print(f"Failed to retrieve page {page_number}")return# 解析 HTMLsoup = BeautifulSoup(response.text, "html.parser")# 提取视频 URLvideo_elements = soup.find_all("a", class_="video-link")video_urls = [el.get("href") for el in video_elements if el.get("href")]# 打印爬取的视频 URLfor 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"# 获取抖音页面 HTMLresponse = requests.get(f"{base_url}?page={page_number}")if response.status_code != 200:print(f"Failed to retrieve page {page_number}")return# 解析 HTMLsoup = BeautifulSoup(response.text, "html.parser")# 提取图片 URLimage_elements = soup.find_all("img", class_="image-class")image_urls = [img.get("src") for img in image_elements if img.get("src")]# 打印爬取的图片 URLfor 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.mzph.cn/diannao/61642.shtml

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

相关文章

ftdi_sio应用学习笔记 4 - I2C

目录 1. 查找设备 2. 打开设备 3. 写数据 4. 读数据 5. 设置频率 6 验证 6.1 遍历设备 6.2 开关设备 6.3 读写测试 I2C设备最多有6个(FT232H),其他为2个。和之前的设备一样,定义个I2C结构体记录找到的设备。 #define FT…

04 - 尚硅谷 - MQTT 客户端编程

1.在Java中使用MQTT 1.1 Eclipse Paho Java Client 具体步骤&#xff1a; 1、创建一个Spring Boot项目&#xff0c;添加如下依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>…

shell第一次作业

要求&#xff1a; 通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 2.判断服务是否安装 ​ 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 ​ 没有安装&#xff1b;安装对应的软件包 3.测试 判断服务是…

1+X应急响应(网络)病毒与木马的处置:

病毒与木马的处置&#xff1a; 病毒与木马的简介&#xff1a; 病毒和木马的排查与恢复&#xff1a;

服务器数据恢复—热备盘未激活导致硬盘掉线的raid5阵列崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌X3850服务器中有一组由数块SAS硬盘组建的RAID5阵列&#xff0c;该阵列中有一块盘是热备盘。操作系统为linux redhat&#xff0c;上面跑着一个基于oracle数据库的oa。 服务器故障&#xff1a; 服务器raid5阵列中有一块硬盘离线&#xff0…

Eclipse 创建Dynamic web project项目-配置Tomcat服务器

1、new——>project: 2、选择web的 Dynamic web project项目: 3、 项目命名&#xff0c;选择new runtime(没有部署过web项目&#xff0c;一般tartget runtime选项里面是空的)&#xff1a; 4、完成1、2的路径选择&#xff1a; 5、完成两个选项操作后&#xff0c;点击finish &…

✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本

api.js //封装ajax方法 import $g from "../sg";//vue项目使用 import $ from jquery;//(提示&#xff1a;原生开发页面请前往https://jquery.com下载最新版jQuery) import { Message } from "element-ui";//element项目使用 // import axios from "…

理解折半查找法

理解折半查找法&#xff1a;高效的查找算法 折半查找法&#xff08;又称二分查找法&#xff09;是一种高效的查找算法&#xff0c;用于查找一个已排序数组中的目标元素。与线性查找方法不同&#xff0c;折半查找每次都将搜索范围减半&#xff0c;从而大幅提升查找效率。本文将详…

解决前端页面报错:Not allowed to load local resource

在前后端分离项目中&#xff0c;在前端页面里使用file://的绝对路径访问本地图片&#xff0c;在加载图片的 时候会报出Not allowed to load local resource 的错误。 这是因为浏览器出于安全因素&#xff0c;禁止通过绝对路径访问图片&#xff0c;需要通过虚拟路径进行访问。 …

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上&#xff0c;给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上&#xff0c;打开 服务&#xff0c;找到VMware DHCP和VMware NAT&#xff0c;把这两个服务打开&#xff0c;专一般问题就…

力扣 LeetCode 236. 二叉树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 后序遍历 注意&#xff1a; p和q其中一个就是它们的公共祖先的情况也考虑到了&#xff0c;假设q是公共祖先&#xff0c;遇到q就直接返回&#xff0c;相当于是下面一边为空&#xff0c;一边不为空的情况&#xff0c;返回不为空就一边即可 class Solutio…

前端速通(HTML)

1. HTML HTML基础&#xff1a; 什么是HTML&#xff1f; 超文本&#xff1a; "超文本"是指通过链接连接不同网页或资源的能力。HTML支持通过<a>标签创建超链接&#xff0c;方便用户从一个页面跳转到另一个页面。 标记语言&#xff1a; HTML使用一组预定义的标签…

python语言基础-5 进阶语法-5.4 正则表达式

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.4 正则表达式 5.4.1 正则表达式 正则表达式的概念&#xff1a; 正则表达式是用来…

论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)

文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况&#xff1a;理论与模拟C. 印刷偶极子的情况&#xff1a;电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/970…

Palo Alto Networks PAN-OS身份认证绕过漏洞复现(CVE-2024-0012)

0x01 产品描述: PAN-OS 是运行 Palo Alto Networks 下一代防火墙的软件。通过利用 PAN-OS 本机内置的关键技术(App-ID、Content-ID、设备 ID 和用户 ID),可以在任何时间、任何地点完全了解和控制所有用户和设备中正在使用的应用程序。0x02 漏洞描述: PAN-OS 设备管理 Web …

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…

版本控制和idea简体中文教程

版本控制是一种管理软件开发过程中代码变更的技术。它允许多个开发者协作编辑同一个项目&#xff0c;同时跟踪每个变更的历史记录&#xff0c;以便在需要时恢复到之前的版本。版本控制系统&#xff08;Version Control System, VCS&#xff09;是实现版本控制的具体工具。 16.…

自制游戏:监狱逃亡

第一个游戏&#xff0c;不喜勿喷&#xff1a; #include<bits/stdc.h> #include<windows.h> using namespace std; int xz; int ruond_1(int n){if(xz1){printf("撬开了&#xff0c;但站在你面前的是俄罗斯内务部特种部队的奥摩大帝&#xff0c;你被九把加特…

Claude3.5-Sonnet和GPT-4o怎么选(附使用链接)

随着人工智能模型的不断进化&#xff0c;传统的评估标准已经逐渐变得陈旧和不再适用。以经典的“喝水测试”为例&#xff0c;过去广泛应用于检测模型能力&#xff0c;但现如今即便是国内的一些先进模型&#xff0c;也能够轻松答对这些简单的问题。因此&#xff0c;我们亟需引入…

uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题

uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…