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

评论: 0

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