如何使用 Python 抓取 Youtube 数据
已发表: 2019-05-29在视频分享网站方面,YouTube 已经成为明显的赢家,虽然据说它的价值超过 1600 亿美元,但通过该网站谋生的人数也非常庞大。 这些内容创作者加入了 YouTube 合作伙伴计划,通过将他们的内容货币化,通过广告赚取大量收入。
为什么要从 Youtube 上抓取数据?
YouTube 数据可用于各种用例,例如:
1.找到最喜欢的关键字
假设您运行搜索以查找 YouTube 上显示的某些特定单词的热门视频。 现在,如果您抓取每个视频的喜欢、不喜欢、观看次数和标题,您将能够制作一个关键字列表,将这些关键字插入到您的 YouTube 标题中时,可以带来更好的收入。
2.比较标签
通过比较带有特定主题标签的视频的喜欢和观看次数,您可以更好地了解在视频上使用哪些主题标签以使其更受欢迎,或者了解哪些主题标签更适合您的视频标题。
3. 寻找最受欢迎的频道
提取 YouTube 上的热门视频可以帮助您创建出现的频道名称的频率图,从而使您能够找到人们喜欢的热门频道。 反过来,这也将帮助您了解哪些主题在 YouTube 观众中最受欢迎。
4. 跟踪频道的受欢迎程度
通过提取特定 YouTube 频道新上传视频的数据,您可以了解该频道的热度是在上升还是下降,或者是停滞不前。
5. 记录喜欢、不喜欢和观看视频
您可以通过定期从这些视频中抓取数据来创建一个图表,其中 x 轴为时间,y 轴为喜欢、不喜欢或观看次数。
让我们开始使用代码:
由于我们已经在之前的“如何从此类文章中抓取数据”中解释了安装和初始化过程,因此我们希望您已准备好完成这些步骤。
要运行代码,请使用 python 命令,然后在出现提示时输入 YouTube 视频 URL。

将下面给出的代码复制到一个文件中,并将其命名为 youtubeDataExtractor.py(尽管您实际上可以给它任何文件名,只要它以“.py”结尾)。
[代码语言=“python”]
#!/usr/bin/python
# -*- 编码:utf-8 -*-
导入 urllib.request
导入 urllib.parse
导入 urllib.error
从 bs4 导入 BeautifulSoup
导入 ssl
导入json
导入 ast
导入json
导入操作系统
from urllib.request 导入请求,urlopen
# 用于忽略 SSL 证书错误
ctx = ssl.create_default_context()
ctx.check_hostname = 假
ctx.verify_mode = ssl.CERT_NONE
# 用户输入
url = input('输入Youtube视频网址-')
# 让网站相信你正在使用 Mozilla 浏览器访问它
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
网页 = urlopen(req).read()
# 创建html页面的BeautifulSoup对象,方便提取数据。
汤= BeautifulSoup(网页,'html.parser')
html = soup.prettify('utf-8')
视频详细信息 = {}
其他详细信息 = {}
对于 soup.findAll('span',attrs={'class': 'watch-title'}) 中的跨度:
video_details['TITLE'] = span.text.strip()
对于 soup.findAll('script',attrs={'type': 'application/ld+json'}) 中的脚本:
channelDesctiption = json.loads(script.text.strip())
video_details['CHANNEL_NAME'] = channelDesctiption['itemListElement'][0]['item']['name']
对于soup.findAll('div',attrs = {'class':'watch-view-count'})中的div:
video_details['NUMBER_OF_VIEWS'] = div.text.strip()

soup.findAll('button',attrs={'title': 'I like this'}) 中的按钮:
video_details['LIKES'] = button.text.strip()
对于 soup.findAll('button',attrs={'title': 'I dislike this'}) 中的按钮:
video_details['不喜欢'] = button.text.strip()
对于 soup.findAll('span',attrs={'class': 'yt-subscription-button-subscriber-count-brand-horizontal yt-subscriber-count'}) 中的跨度:
video_details['NUMBER_OF_SUBSCRIPTIONS'] = span.text.strip()
标签 = []
对于 soup.findAll('span',attrs={'class': 'standalone-collection-badge-renderer-text'}) 中的跨度:
对于 span.findAll('a',attrs={'class': 'yt-uix-sessionlink'}):
hashtags.append(a.text.strip())
video_details['HASH_TAGS'] = 标签
使用 open('output_file.html', 'wb') 作为文件:
文件.write(html)
使用 open('data.json', 'w', encoding='utf8') 作为输出文件:
json.dump(video_details, outfile, ensure_ascii=False,indent=4)
print('———-数据提取完成。检查json文件。———-')
[/代码]
运行代码后,您会发现在当前目录中创建了一个名为 data.json 的 JSON。 我们运行了一些流行音乐视频的代码,下面是与它们相关的 JSON——
1. Imagine Dragons 的Thunder –
[代码语言=“python”]
{
“TITLE”:“想象龙——雷霆”,
“CHANNEL_NAME”:“ImagineDragonsVEVO”,
“NUMBER_OF_VIEWS”:“1,182,556,781 次观看”,
“喜欢”:“6,693,559”,
“不喜欢”:“337,823”,
“NUMBER_OF_SUBSCRIPTIONS”:“17M”,
“哈希标签”:[]
}
[/代码]
2.德雷克在你的感受中
[代码语言=“python”]
{
“TITLE”:“Drake – In My Feelings (Lyrics, Audio) “Kiki Do you love me””,
“CHANNEL_NAME”:“特殊团结”,
“NUMBER_OF_VIEWS”:“278,121,686 次观看”,
“喜欢”:“2,407,688”,
“不喜欢”:“114,933”,
“NUMBER_OF_SUBSCRIPTIONS”:“614K”,
“哈希标签”:[
“#InMyFeelings”,
“#德雷克”,
“#蝎”
]
}
[/代码]
YouTube 爬虫代码解释:
像往常一样,我们首先从网页中抓取 HTML 代码并将其保存到本地目录中的文件中,以便我们对其进行分析并找到可以轻松提取且也有价值的数据点。 大多数对 HTML 页面中数据点的研究必须手动完成,方法是搜索特定的关键字或值并找到它们出现的位置。
我们使用 BeautifulSoup (BS4) 从 HTML 代码中的特定位置提取数据-
- 具有“watch-title”类的 span 类型元素是您可以找到视频标题的地方。
- 具有“application/ld+json”类型的脚本元素包含通道名称。
- 具有 watch-view-count 类的 div 元素将帮助您获取特定 YouTube 视频的观看次数。
- 标题为“我喜欢这个”的按钮元素包含对该特定视频的点赞数。
- 与上述类似,标题为“我不喜欢这个”的按钮元素具有对特定视频的不喜欢次数的计数。
- 具有类 'yt-subscription-button-subscriber-count-brand-horizontal yt-subscriber-count' 的 span 元素是您可以从中提取已上传特定视频的频道的订阅者数量的元素。
- 查找与给定视频相关的主题标签比其他数据点稍微复杂一些。 首先,您必须提取所有具有类“standalone-collection-badge-renderer-text”的跨度,然后必须从那里提取所有具有类“yt-uix-sessionlink”的a-tags。 通过将所有 a 标记中的文本提取到一个数组中,您将能够创建一个主题标签列表。 可以将此数组添加到名为“HASH_TAGS”的特定键下的结果 json 中,以便在最终结果 json 中以结构化格式获取信息。
你可以从 Youtube 上抓取哪些数据点?
使用上面给出的代码,您可以从任何 YouTube 视频中抓取某些数据点,只要您拥有它们的 URL。 某些视频中可能只有主题标签字段可能不存在,因为它不是 YouTube 视频页面中的必填字段。 可以抓取的数据点如下——
标题
最重要的数据点是我们一开始就提取的数据点。 视频的标题包含大量信息,并且至关重要,否则所有其他数据点都将毫无意义。
频道名称
在标题之后,频道名称对于将标题与创建者(即创建内容的人)相关联非常重要。 在 YouTube 中,视频与其频道名称相关联,而不是其创作者,因为在许多情况下,不止一个人在处理单个频道的视频。
观看次数
了解视频覆盖面的最简单指标是查看视频获得的观看次数。 这也是与 YouTube 视频相关的最重要指标,在许多方面,它决定了视频创作者的收入。
喜欢
YouTube 视频上的点赞数,就是观看者对视频的喜爱程度足以实际点击视频下方的竖起大拇指按钮的百分比。
不喜欢
与上述数据点类似,不喜欢的次数将决定视频的不喜欢按钮的点击次数。
订阅数量
虽然喜欢、不喜欢和观看描绘了单个 YouTube 视频的受欢迎程度,但订阅数量可以更好地了解 YouTube 频道的受欢迎程度。 对于 YouTube 频道,我们没有其他指标。 订阅数量是唯一的单一数据点,它越高,所讨论的 YouTube 频道越受欢迎。
标签
Hashtags 已成为使您的内容可在不同媒体中搜索的流行方式。 无论是 Facebook 帖子还是 Instagram 图片,如今人们都在使用带有不同类型在线内容的主题标签,以便将不同类型的内容关联在一起。 这就是为什么“趋势标签”在今天成为一件事的原因。
结论
虽然给定的代码只能从 YouTube 视频页面中提取一些特定的数据点,但从不同的 YouTube 页面中探索 HTML 页面可以帮助您找到更多出现在类似 HTML 元素下的数据点。 由于网站本身不断变化,网络抓取没有给出硬性规定。 因此,学习要抓取哪些数据以及如何抓取是只能通过抓取具有不同数据格式的不同网页的经验来收集的东西。
在提取网络数据方面需要帮助?
通过我们的网络抓取服务,从用于业务应用程序的网站获取干净且随时可用的数据。
哎呀! 我们找不到您的表格。
免责声明:本教程中提供的代码仅用于学习目的。 我们不对它的使用方式负责,也不对源代码的任何有害使用承担任何责任。
