利用Python和Selenium进行YouTube视频分类

认为每个数据科学爱好者都应该掌握网页抓取技能。当寻找项目数据或想要分析特定网站上的数据时,这项技能非常有用。但请记住,网页抓取不应越过道德和法律的界限。

在本文中,将学习如何使用Selenium和Python进行网页抓取以提取YouTube视频数据。然后,将使用NLTK库来清洗数据,最后构建一个模型来根据特定类别对这些视频进行分类。

Selenium概述

Selenium是一个流行的浏览器自动化工具。它主要用于行业测试,但也非常适合网页抓取。如果在IT领域工作过,可能已经接触过Selenium。可以轻松地编写一个Python脚本来使用Selenium自动化一个网络浏览器。它为提供了所需的自由度,以便高效地提取数据并将其存储在喜欢的格式中以供将来使用。

Selenium需要一个驱动程序来与选择的浏览器接口。例如,Chrome需要ChromeDriver,这需要在开始抓取之前安装。Selenium网络驱动程序直接使用浏览器自己的引擎与浏览器通信以控制它。这使得它非常快速。

网页抓取项目的先决条件

在开始网页抓取之前,有一些事情必须知道:HTML和CSS的基本知识是必须的。需要这些知识来理解即将抓取的网页的结构。Python是必需的,用于清洗数据、探索数据和构建模型。了解一些基本的库,如Pandas和NumPy,将是锦上添花。

设置Python环境

是时候启动最喜欢的Python IDE了(对来说是Jupyter笔记本)!让开始编码。

步骤1:安装Python绑定:

# 在终端中输入-$ pip install selenium

步骤2:下载Chrome WebDriver:

访问选择与Chrome版本兼容的驱动程序。

要检查使用的Chrome版本,请点击右上角的三个垂直点,然后转到帮助->关于Google Chrome。

步骤3:将驱动程序文件移动到PATH:

# 转到下载目录,解压文件,将其移动到usr/local/bin PATH。$ cd Downloads$ unzip chromedriver_linux64.zip$ mv chromedriver /usr/local/bin/

现在准备好开始网页抓取了。

从YouTube抓取数据

在本文中,将从YouTube抓取特定类别的视频ID、视频标题和视频描述。将抓取的类别包括:旅游、科学、食品、历史、制造、艺术与舞蹈。让开始吧!

首先,让导入一些库:

# 查看Gist上的代码。

在做任何事情之前,打开浏览器中的YouTube。输入想要搜索的视频类别并设置过滤器为“视频”。这将只显示与搜索相关的视频。复制这样做后的URL。

接下来,需要设置驱动程序以从YouTube获取URL的内容:

# 查看Gist上的代码。

将链接粘贴到driver.get(“链接在这里”)函数中并运行单元格。这将在新浏览器窗口中打开该链接。将在以下任务中使用此浏览器窗口。

抓取该页面上的所有视频链接。将创建一个“列表”来存储这些链接。

现在,转到浏览器窗口,右键单击页面,然后选择“检查元素”。

搜索id为“video-title”的锚点标签,然后右键单击它->复制->XPath。XPath应该看起来像这样://*[@id=”video-title”]

现在,编写以下代码以开始从页面抓取链接并运行单元格。这应该抓取网页上的所有链接并将其存储在列表中。

# 查看Gist上的代码。

上述代码将抓取搜索的锚点标签的“href”属性。

现在,需要创建一个带有4列的DataFrame——“链接”、“标题”、“描述”和“类别”。将在这些列中存储不同类别的视频详细信息:

# 查看Gist上的代码。

准备好从YouTube抓取视频详细信息了。这是Python代码:

# 查看Gist上的代码。

让分解这个代码块以了解刚刚做了什么:“wait”将忽略在“until”条件中默认遇到的NotFoundException(抛出)。它将立即传播所有其他异常。

参数:driver:要传递给预期条件的WebDriver实例timeOutInSeconds:当调用期望时的超时时间(秒)v_category:存储之前搜索的视频类别名称

“for”循环应用于上面创建的链接列表。driver.get(x)遍历所有链接,并在浏览器中打开它们以获取详细信息。v_id存储从链接中剥离的视频ID。v_title使用CSS路径获取视频标题。同样,v_description使用CSS路径存储视频描述。

在每次迭代期间,代码将提取的数据保存在之前创建的DataFrame中。

必须按照上述步骤为剩余的五个类别执行操作。完成后,应该有六个不同的DataFrame。现在,是时候将它们合并成一个DataFrame了:

# 查看Gist上的代码。

瞧!有最终的DataFrame,包含上述所有类别的视频的所有详细信息。

使用NLTK库清洗抓取的数据

在本节中,将使用流行的NLTK库来清洗“标题”和“描述”列中的数据。NLP爱好者会喜欢这一节!

在开始清洗数据之前,需要将所有列分别存储,以便可以快速轻松地执行不同的操作:

# 查看Gist上的代码。

首先,导入所需的库:

# 查看Gist上的代码。

现在,创建一个列表,可以在其中存储清洗的数据。将稍后将这些数据存储在DataFrame中。编写以下代码以创建一个列表并对df_title中的“标题”列进行一些数据清洗:

# 查看Gist上的代码。

看到在这里做了什么吗?从标题中移除了所有的标点符号,只保留了英文的根词。经过所有这些迭代后,准备了一个充满数据的列表。

需要按照相同的步骤清洗df_description中的“描述”列:

# 查看Gist上的代码。

注意:范围是根据数据集中的行数选择的。

现在,将这些列表转换为DataFrame:

# 查看Gist上的代码。

接下来,需要对类别进行标签编码。“LabelEncoder()”函数将标签编码为0到n_classes-1之间的值,其中n是不同标签的数量。

# 查看Gist上的代码。

在这里,对df_category应用了标签编码,并将结果存储到dfcategory中。

可以将清洗和编码的数据存储到一个新的DataFrame中:

# 查看Gist上的代码。

还没有完全完成清洗和转换部分。应该创建一个词袋,以便模型可以根据该词袋中的关键词对视频进行分类。这是创建词袋的代码:

# 查看Gist上的代码。

注意:在这里,从存储在列表corpus和corpus1中的数据中创建了1500个特征。“X”存储所有特征,“y”存储编码的数据。

为数据科学家角色中最受期待的部分——模型构建做好了准备!

构建YouTube视频分类模型

在构建模型之前,需要将数据分为训练集和测试集:训练集:用于训练模型的数据子集。测试集:包含剩余数据,用于测试训练好的模型。确保测试集满足以下两个条件:足够大,以获得统计上有意义的结果。代表整个数据集。换句话说,不要选择一个与训练集特性不同的测试集。

可以使用以下代码来分割数据:

# 查看Gist上的代码。

是时候训练模型了!将在这里使用随机森林算法。让继续使用RandomForestClassifier()函数训练模型:

# 查看Gist上的代码。

参数:n_estimators:森林中的树木数量criterion:用于测量分裂质量的函数。支持的标准是“gini”用于基尼不纯度和“entropy”用于信息增益。注意:这些参数是树特定的。

现在可以检查模型在测试集上的性能了:

# 查看Gist上的代码。

得到了令人印象深刻的96.05%的准确率。

整个过程进行得相当顺利!但还没有完成——还需要分析结果,以充分理解所取得的成就。

让检查分类报告:

# 查看Gist上的代码。

结果将给出以下属性:精确度是正确预测的正观测值与总预测正观测值的比率。精确度 = TP/TP+FP召回率是正确预测的正观测值与实际类别中所有观测值的比率。召回率 = TP/TP+FNF1分数是精确度和召回率的加权平均值。因此,这个分数考虑了假阳性和假阴性。F1分数 = 2*(召回率 * 精确度) / (召回率 + 精确度)

可以通过创建混淆矩阵来检查结果:

# 查看Gist上的代码。

混淆矩阵将是一个6×6矩阵,因为数据集中有六个类别。

一直想将对抓取和提取数据的兴趣与NLP和机器学习结合起来。所以喜欢沉浸在这个项目中,并记录下方法。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:15216758379