由于 YouTube 的动态内容和反抓取措施,从 YouTube 中抓取数据具有一定的挑战性。但是,使用正确的工具和技术,您可以有效地提取有用的信息。在本文中,我们将向您介绍使用 Python、Playwright 和 lxml 搜刮 YouTube 视频数据的过程。
使用 pip 安装必要的库:
pip install playwright
pip install lxml
安装 Playwright 浏览器二进制文件:
playwright install
要直接安装 Chromium 浏览器二进制文件,请使用以下命令:
playwright install chromium
使用 Python 进行 YouTube 数据网络抓取时,您主要需要以下库:
import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv
使用 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)
使用 Playwright 提取页面的 HTML 内容,并使用 lxml 进行解析。
# 提取页面内容
page_content = await page.content()
# 解析 HTML 内容
parser = html.fromstring(page_content)
使用 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()')
将提取的数据保存为 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 脚本中如何实现代理:
代理设置:
browser = await playwright.chromium.launch(
headless=True,
proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
)
使用代理的好处
这种实现方式可确保您的刮擦活动不太可能被 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 的服务条款。
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
评论: 0