当前位置: 首页 > news >正文

python实现YouTube关键词爬虫(2025/02/11)

在当今数字化时代,YouTube作为全球最大的视频分享平台之一,拥有海量的视频资源。无论是进行市场调研、内容创作还是学术研究,能够高效地获取YouTube上的相关视频信息都显得尤为重要。今天,我将为大家介绍一个基于Python实现的YouTube视频搜索爬虫,帮助大家快速获取特定关键词相关的视频基本信息。

废话不多说,先上结果:

一、项目背景与需求

随着信息的爆炸式增长,如何从海量的YouTube视频中快速找到符合特定需求的内容成为了一个挑战。例如,对于内容创作者来说,了解某一热门话题下的视频趋势和优秀作品能够为自己的创作提供灵感;对于市场研究人员而言,分析特定品牌或产品的相关视频数据有助于洞察市场动态和用户反馈。因此,开发一个能够自动搜索并提取YouTube视频信息的爬虫工具具有重要的应用价值。

二、技术选型与实现思路

1.技术选型

  • Python语言:Python以其简洁易读的语法和强大的库支持,成为了爬虫开发的首选语言。它提供了丰富的网络请求库(如requests)、数据处理库(如pandas)以及JSON解析等功能,能够高效地实现爬虫的各项功能。

  • requests:用于发送HTTP请求,获取YouTube网页的响应数据。它支持自定义请求头、参数和数据,能够灵活地模拟浏览器行为,从而获取到我们需要的视频搜索结果数据。

  • pandas:主要用于数据的存储和处理。在爬取到视频信息后,我们可以将其存储为DataFrame对象,方便后续的数据分析、筛选和导出为CSV文件等操作。

2.实现思路

  • 模拟搜索请求:通过分析YouTube的搜索功能,我们发现其搜索结果是通过向特定的API接口发送请求并携带相应的参数和数据来获取的。因此,我们需要构造类似的请求,包括设置合适的请求头(如User-AgentReferer等)、参数(如搜索关键词、分页令牌等)以及请求体(包含搜索的上下文信息等),以模拟用户在浏览器中进行搜索的行为。

  • 解析响应数据:YouTube返回的搜索结果数据是JSON格式的,其中包含了视频的基本信息,如视频链接、标题、播放量、发布时间、作者昵称和主页链接等。我们需要编写解析逻辑,从JSON数据中提取出这些有用的信息,并将其整理成结构化的数据格式,以便后续的存储和分析。

  • 分页爬取与数据存储:由于YouTube的搜索结果通常会有很多页,为了完整地获取所有相关视频信息,我们需要实现分页爬取的功能。在每次请求中,我们可以通过解析返回数据中的分页令牌来判断是否存在下一页,并循环发送请求直到获取到所有页面的数据。同时,我们将爬取到的视频数据存储到CSV文件中,方便用户后续查看和使用。

三、代码实现

1.发送搜索请求

我们实现了get方法,用于发送搜索请求并获取YouTube的响应数据。在这个方法中,我们根据是否是首次请求(通过token参数判断),构造不同的请求体数据。首次请求时,我们直接传递搜索关键词;后续分页请求时,则使用分页令牌来获取下一页的数据。

def get(self, keyword, token):url = "https://www.youtube.com/youtubei/v1/search"params = {"prettyPrint": "false"}if token != "-1":data = {"context": {"client": {"hl": "zh-CN","gl": "HK","remoteHost": "103.17.98.17","deviceMake": "","deviceModel": "","visitorData": "CgthSS1jZ09JTTY3ayj44Iy9BjIKCgJISxIEGgAgWg%3D%3D","userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36,gzip(gfe)","clientName": "WEB","clientVersion": "2.20250203.06.01","osName": "Windows","osVersion": "10.0","originalUrl": f"https://www.youtube.com/results?search_query={quote(keyword)}&themeRefresh=1","platform": "DESKTOP","clientFormFactor": "UNKNOWN_FORM_FACTOR",
…………}else:data = {"context": {"client": {"hl": "zh-CN","gl": "HK","remoteHost": "103.17.98.17","deviceMake": "","deviceModel": "","visitorData": "CgthSS1jZ09JTTY3ayj44Iy9BjIKCgJISxIEGgAgWg%3D%3D","userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36,gzip(gfe)","clientName": "WEB","clientVersion": "2.20250203.06.01","osName": "Windows","osVersion": "10.0","originalUrl": f"https://www.youtube.com/results?search_query={quote(keyword)}","platform": "DESKTOP","clientFormFactor": "UNKNOWN_FORM_FACTOR",
…………}data = json.dumps(data, separators=(',', ':'))response = requests.post(url, headers=headers, cookies=cookies, params=params, data=data, timeout=(3, 10))return response.json()

2.解析响应数据

在获取到YouTube的响应数据后,我们需要从中提取出有用的视频信息。这部分逻辑由parse_data方法实现。我们首先解析出视频的基本信息,如视频链接、标题、播放量、发布时间、作者昵称和主页链接等,并将这些信息存储到一个列表中。同时,我们还会尝试从响应数据中获取分页令牌,以便后续进行分页爬取。

def parse_data(self, keyword, contents):token = Nonecontents_1 = contents[0]['itemSectionRenderer']['contents']result_list = []for c in contents_1:videoRenderer = c.get('videoRenderer')if videoRenderer:videoId = videoRenderer.get('videoId')video_url = f"https://www.youtube.com/watch?v={videoId}"title = "".join([tt['text'] for tt in videoRenderer['title'].get('runs', [])])viewCountText = videoRenderer.get('viewCountText', {}).get('simpleText', '')publishedTimeText = videoRenderer.get('publishedTimeText', {}).get('simpleText', '')username = videoRenderer['ownerText']['runs'][0]['text']uid_ = videoRenderer['ownerText']['runs'][0]['navigationEndpoint']['browseEndpoint']['canonicalBaseUrl']p_url = f"https://www.youtube.com{uid_}"item = {"关键词": keyword,"视频链接": video_url,"标题": title,"发布时间": publishedTimeText,"播放量": viewCountText,"昵称": username,"主页链接": p_url,}self.log(f"找到视频:{title}")result_list.append(item)try:token = contents[1]['continuationItemRenderer']['continuationEndpoint']['continuationCommand']['token']except:passif result_list:self.save_data(self.saveFileName, result_list)return token

3.主逻辑与分页爬取

最后,我们实现了run方法和main方法。run方法用于控制爬虫的运行逻辑,包括发送搜索请求、解析响应数据、存储数据以及分页爬取等功能。main方法则用于读取关键词文件,并依次对每个关键词启动爬虫。

 

def run(self, keyword, token="-1"):self.current_token = tokenself.saveFileName = keywordwhile self.is_running and self.current_token:try:# 检查页数限制if self.max_pages and self.current_page >= self.max_pages:self.log(f"已达到设定的{self.max_pages}页限制,停止爬取")breakself.log(f"正在爬取第 {self.current_page + 1} 页")dataJson = self.get(keyword, self.current_token)if self.current_token == "-1":contents = dataJson["contents"]["twoColumnSearchResultsRenderer"]["primaryContents"]["sectionListRenderer"]["contents"]else:contents = dataJson["onResponseReceivedCommands"][0]["appendContinuationItemsAction"]["continuationItems"]self.current_token = self.parse_data(keyword, contents)self.current_page += 1except Exception as e:self.log(f"发生错误:{str(e)}")breakdef main(self):keyword_list = [k.strip() for k in open('关键词.txt', encoding='utf-8').readlines() if k.strip() != ""]xuhao = 0for index, keyword in enumerate(keyword_list[xuhao:], xuhao):print((index, keyword))self.run(keyword)

 

四、总结

通过以上代码的实现,我们成功地开发了一个能够自动搜索并提取YouTube视频信息的爬虫工具。它可以帮助我们快速获取特定关键词相关的视频数据,并将其存储到CSV文件中,方便后续的分析和使用。在实际应用中,我们还可以根据需求对爬虫进行进一步的优化和扩展,例如增加代理支持、设置爬取频率等,以提高爬虫的稳定性和效率。


希望这篇文章能够帮助你更好地理解和实现YouTube视频搜索爬虫。如果有任何问题或建议,欢迎在评论区留言交流!

 

相关文章:

python实现YouTube关键词爬虫(2025/02/11)

在当今数字化时代,YouTube作为全球最大的视频分享平台之一,拥有海量的视频资源。无论是进行市场调研、内容创作还是学术研究,能够高效地获取YouTube上的相关视频信息都显得尤为重要。今天,我将为大家介绍一个基于Python实现的YouT…...

【效率技巧】怎么做思维导图||数学思维||费曼学习法

目录标题 常见问题:认知误区和建议:思维导图按照功能分类思维导图好处步骤(拆解的步骤) 常见问题: 1、做好的思维导图浪费时间 2、做简单的思维导图没有效果 认知误区和建议: 1、做思维导图工具&#xf…...

LabVIEW与USB设备开发

开发一台USB设备并使用LabVIEW进行上位机开发,涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输,帮助用户顺利完成项目开发。下面是一个详细的说明&…...

动态规划LeetCode-416.分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...

云原生(五十五) | ECS中自建数据库迁移到RDS

文章目录 ECS中自建数据库迁移到RDS 一、场景说明 二、ECS中自建数据库迁移到RDS实现步骤 三、 创建wordpress数据库 四、登录ECS导出wordpress数据库 五、返回RDS数据库管理控制台 六、开启外网地址并设置白名单 七、获取RDS外网访问地址 八、重新设置wordpress的wp-…...

【吾爱出品】 视频批量分段工具

视频批量分段工具 链接:https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后,点击 "文件" 菜单下的 "选择视频文件" 按钮,或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...

HTML【详解】input 标签

input 标签主要用于接收用户的输入,随 type 属性值的不同,变换其具体功能。 通用属性 属性属性值功能name字符串定义输入字段的名称,在表单提交时,服务器通过该名称来获取对应的值disabled布尔值禁用输入框,使其无法被…...

二叉搜索树的实现(C++)

前言 二叉搜索树(搜索二叉树,Binary search tree)是一种特殊的二叉树。其规则为:左子树的值一定小于等于根,右子树的值一定大于等于根,并且左右子树也为搜索二叉树。 二叉搜索树的插入 1.若树为空&#xf…...

vue2老版本 npm install 安装失败_安装卡主

vue2老版本 npm install 安装失败_安装卡主 特别说明:vue2老版本安装慢、运行慢,建议升级vue3element plus vite 解决方案1: 第一步、修改npm 镜像为国内镜像 使用淘宝镜像: npm config set registry https://registry.npmmir…...

【MySQL】索引篇

1.什么时候适用索引? 字段有唯一限制,比如商品编码经常用于where查询条件的字段经常用于group by和order by 的字段 2.什么时候不需要创建索引? 字段中存在大量重复经常更新的字段表数据太少的时候 where条件、group by,order by里…...

Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...

鸿蒙面试题

1.0penHarmony的系统架构是怎样的? 2.电话服务的框架? 3.OpenHarmony与HarmonyOS有啥区别?...

Rust 语言入门(一):打印与格式化输出

对于初学者来说,掌握 Rust 的基本 I/O 操作是入门的第一步。本篇博客将介绍 Rust 语言的打印机制,包括基本的 print!、println! 宏,格式化输出方式,并探讨其底层原理。 Rust 的基本打印 在 Rust 中,最常见的输出方式…...

vue3.x 的 toRef详细解读

在 Vue 3.x 中,toRef 是一个用于创建响应式引用的工具函数。它可以将一个响应式对象的某个属性转换为一个独立的 ref 对象,同时保持与原始属性的响应式连接。以下是 toRef 的详细解读和示例。 1. toRef 的作用 核心功能 toRef 用于从响应式对象&#x…...

wordpress资讯类网站整站打包

wordpress程序,内置了价值499元的模板.但是有了模板没有全自动采集相信大多数人都搞不懂,目录那么多,全靠原创几乎是不可能的事情,除非你是大公司,每人控制一个板块, 这套源码里面最有价值的应该是这个采集…...

GitHub基本操作及Git简单命令

GitHub简介 GitHub就是一个远程仓库,远程仓库可以理解为就是一个可以保存自己代码的地方,在实际开发当中一个项目往往是有多个人来共同协作开发完成的,那么就需要一个统一代码保存的地方,而GitHub就是起到一个共享和汇总代码的作…...

记一次MySQL故障解决

记一次MySQL故障解决 1 故障现象2 故障排查2.1 查看MySQL服务状态2.2 查看服务日志 3 解决方法3.1 增加 wait_timeout 和 interactive_timeout 参数的值,确保连接不会因超时而被关闭:3.2 检查服务已经恢复正常,不过以上只是临时修改&#xff…...

DeepSeek-R1私有化部署教程 | Linux服务器搭建AI大语言模型

**云服务器用LinuxDockerOllamaOpenWebUI部署DeepSeek-R1大语言模型(LLMs),DeepSeek本地化部署教程(在自己电脑上部署也可以参考此教程)。**超详细教程,手把手。 在当今数字化时代,大型语言模型…...

「软件设计模式」桥接模式(Bridge Pattern)

深入解析桥接模式:解耦抽象与实现的艺术 一、模式思想:正交维度的优雅解耦 桥接模式(Bridge Pattern)通过分离抽象(Abstraction)与实现(Implementation),使二者可以独立…...

【Flink快速入门-5.流处理之多流转换算子】

流处理之多流转换算子 实验介绍 前面实验中介绍的算子已经能够满足我们的大部分开发需求了,但是在实际工作中有时候还会遇到一些业务场景,例如需要摄入多个输入流并将其合并处理,或者需要将一条输入流分割为多条子流,在不同的子…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...