如何使用 Python 搜刮 YouTube:分步指南

评论: 0

由于 YouTube 的动态内容和反抓取措施,从 YouTube 中抓取数据具有一定的挑战性。但是,使用正确的工具和技术,您可以有效地提取有用的信息。在本文中,我们将向您介绍使用 Python、Playwright 和 lxml 搜刮 YouTube 视频数据的过程。

了解数据结构,用 Python 搜刮 Youtube

在了解如何搜索 YouTube 之前,我们需要先了解它的结构。它有许多可用的功能,有无穷无尽的数据类型可供选择,涉及用户活动和视频统计。该平台的一些关键参数包括视频标题和描述、添加的标签、浏览量、点赞和评论,以及频道和播放列表信息。这些元素对于内容营销人员和创作者评估视频的表现以及制定视频内容的策略非常重要。

利用 YouTube 数据 API,开发人员可以通过编程方式访问大部分指标。该 API 还允许访问订阅者数量以及频道上的视频,从而为分析和整合目的提供大量数据。

然而,有些特定元素可能无法通过应用程序接口获取,因此只能通过网络搜刮来检索。例如,要获得某些详细的观众参与度指标,如评论的情绪或参与的具体时间,就需要对 Youtube 页面进行网络抓取。这种技术通常比较复杂,而且由于平台的内容演绎不断变化,以及其对数据搜刮的严格规定,可能会存在风险。

在下面的模块中,我们将向你展示如何用 Python 构建脚本并高效地从 Youtube 搜刮数据。

使用代理服务器避免在搜索 YouTube 时被检测到

要使用 Python 搜刮 Youtube 视频,必须使用代理来规避 IP 禁止和僵尸穿越防范方法。下面是一些代理类型及其说明:

  1. 住宅代理服务器连接到真正的真实 IP 地址,并用作网站的真实连接。在很大程度上需要信任才能不被发现的 Youtube 数据搜刮中,代理是最佳选择。代理服务器可以让搜刮者表现得像一个真正的用户,从而将被检测为僵尸的几率降到最低。
  2. ISP 代理服务器介于住宅 IP 和数据中心代理服务器之间。它们由互联网服务提供商提供,这些服务提供商会发布真实的 IP 地址,而这些地址很难被标记为代理。这种特性使得 ISP 代理服务器在搜索 Youtube 搜索结果时非常有效,因为这种搜索结果既需要真实性,又需要出色的性能。
  3. 尽管数据中心网络速度最高,但由于来自大型数据中心,因此很容易被 YouTube 等平台识别。尽管它们高效易用,但刮擦时被拦截的风险很高。当快速数据处理的需求大于检测带来的风险时,这些类型是最佳选择。
  4. 移动代理通过蜂窝网络上的移动设备路由连接,提供了最合法的解决方案。由于服务提供商通常会轮换移动 IP,因此移动代理被标记的可能性要小得多。但需要注意的是,它们的速度可能比其他类型低得多。

如果有策略地使用这些类型,就有可能在不被发现的情况下从 Youtube 搜刮数据,从而在遵守平台服务条款的同时继续访问数据。此外,正确理解它们还能在您需要找到 代刮.

环境设置

使用 pip 安装必要的库:

pip install playwright 
pip install lxml

安装 Playwright 浏览器二进制文件:

playwright install

要直接安装 Chromium 浏览器二进制文件,请使用以下命令:

playwright install chromium

使用 Python 进行 YouTube 数据网络抓取时,您主要需要以下库:

  1. Playwright:一个功能强大的库,用于自动运行无头浏览器,让你像真正的用户一样与网页交互;
  2. lxml:一个快速且功能丰富的库,用于在 Python 中处理 XML 和 HTML,支持 XPath 以查询文档;
  3. CSV 模块:内置 Python 库,用于将提取的数据保存到 CSV 文件中。

步骤 1:导入所需程序库

import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv

步骤 2:无头浏览器自动化

使用 Playwright 启动无头浏览器,导航到 YouTube 视频 URL,然后等待页面完全加载。

滚动页面加载更多评论。

browser = await playwright.chromium.launch(headless=True)
context = await browser.new_context()
page = await context.new_page()

# 导航至 YouTube 视频 URL
await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

# 向下滚动以加载更多评论
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# 为加载其他内容留出时间
await page.wait_for_timeout(1000)

步骤 3:HTML 内容解析

使用 Playwright 提取页面的 HTML 内容,并使用 lxml 进行解析。

# 提取页面内容
page_content = await page.content()

# 解析 HTML 内容
parser = html.fromstring(page_content)

步骤 4:数据提取

使用 XPath 表达式提取所需的数据点(如标题、频道、注释)。

收集所有相关数据,包括视频元数据和评论。

# 提取视频数据
title = parser.xpath('//div[@id="title"]/h1/yt-formatted-string/text()')[0]
channel = parser.xpath('//yt-formatted-string[@id="text"]/a/text()')[0]
channel_link = 'https://www.youtube.com' + parser.xpath('//yt-formatted-string[@id="text"]/a/@href')[0]
posted = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[2]
total_views = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[0]
total_comments = parser.xpath('//h2[@id="count"]/yt-formatted-string/span/text()')[0]
comments_list = parser.xpath('//yt-attributed-string[@id="content-text"]/span/text()')

步骤 5:保存数据

将提取的数据保存为 CSV 文件,便于分析和存储。

# 将数据保存为 CSV 文件
with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["Title", "Channel", "Channel Link", "Posted", "Total Views", "Total Comments", "Comments"])
    writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

代理实施

代理在网络搜索中发挥着至关重要的作用,尤其是在处理大规模数据提取或像 YouTube 这样有严格防僵尸措施的网站时。下面介绍 Playwright 脚本中如何实现代理:

代理设置:

  1. playwright.chromium.launch() 中的代理参数用于通过指定的代理服务器路由所有浏览器流量。
  2. 必须配置代理服务器详细信息,包括服务器地址、用户名和密码。

browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
    )

使用代理的好处

  • IP 屏蔽:代理服务器可以隐藏你的原始 IP 地址,减少被屏蔽的可能性。
  • 请求分发:通过轮流使用代理服务器,可以将请求分发到不同的 IP 地址,模拟来自多个用户的流量。
  • 访问受限内容:代理服务器可帮助绕过区域限制或访问可能仅限于某些 IP 范围的内容。

这种实现方式可确保您的刮擦活动不太可能被 YouTube 的反僵尸机制检测和阻止。

完整的代码执行

以下是使用 Playwright 和 lxml 搜刮 YouTube 视频数据的完整代码,包括代理实现。

import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv

# 运行 Playwright 并提取数据的异步函数
async def run(playwright: Playwright) -> None:
    # 使用代理设置启动无头浏览器
    browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
    )
    context = await browser.new_context()
    page = await context.new_page()

    # 导航至 YouTube 视频 URL
    await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

    # 向下滚动以加载更多评论
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # 为加载其他内容留出时间
    await page.wait_for_timeout(1000)
    
    # 提取页面内容
    page_content = await page.content()

    # 关闭浏览器
    await context.close()
    await browser.close()

    # 解析 HTML 内容
    parser = html.fromstring(page_content)

    # 提取视频数据
    title = parser.xpath('//div[@id="title"]/h1/yt-formatted-string/text()')[0]
    channel = parser.xpath('//yt-formatted-string[@id="text"]/a/text()')[0]
    channel_link = 'https://www.youtube.com' + parser.xpath('//yt-formatted-string[@id="text"]/a/@href')[0]
    posted = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[2]
    total_views = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[0]
    total_comments = parser.xpath('//h2[@id="count"]/yt-formatted-string/span/text()')[0]
    comments_list = parser.xpath('//yt-attributed-string[@id="content-text"]/span/text()')

    # 将数据保存为 CSV 文件
    with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(["Title", "Channel", "Channel Link", "Posted", "Total Views", "Total Comments", "Comments"])
        writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

# 运行异步函数
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

在建立从 YouTube 搜刮数据的环境时,重点使用代理服务器来有效规避平台限制至关重要。仔细选择代理服务器对于最大限度地降低阻止风险和确保匿名操作至关重要。静态 ISP 代理因其快速的连接速度和稳定性而备受推崇。此外,住宅代理服务器提供的动态 IP 地址具有较高的信任系数,因此不太可能被 YouTube 的安全系统标记。在数据收集过程中遵守道德标准也很重要,以防止违反 YouTube 的服务条款。

评论:

0 评论