在某些情况下,我们可能需要批量获取 YouTube 上某个关键词相关的视频信息,如标题、链接、博主等。这个过程通过人工操作会十分繁琐,因此我们可以借助 Python 的 Selenium 库来实现自动化操作。
本篇博客将详细讲解如何使用 Selenium 自动化浏览器操作,从 YouTube 抓取相关视频信息并保存到 Excel 文件中。
也可以根据这个逻辑写tiktok,ins等等
文章末尾放置了完整的代码配置好之后可以直接运行,我的python版本是3.8
环境准备
在开始之前,确保你的 Python 环境中已经安装了以下依赖库:
bash
Copy code
pip install selenium openpyxl
此外,你还需要下载 ChromeDriver,这个驱动程序用于让 Selenium 控制 Chrome 浏览器。你可以从 ChromeDriver 官方网站 下载,并确保 ChromeDriver 的版本与本地 Chrome 浏览器版本匹配。
将下载的
chromedriver
添加到系统的 PATH 中,以便 Selenium 可以找到它。
代码实现
步骤 1:自动搜索 YouTube 视频
下面的代码展示了如何使用 Selenium 自动化搜索 YouTube,并抓取指定关键字的相关视频信息。
pythonCopy codefrom selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import openpyxl
def scroll_down(driver):
"""执行页面滚动,加载更多视频"""
driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
time.sleep(2) # 等待页面加载
def search_youtube_videos_via_selenium(keyword, max_videos=100):
driver = webdriver.Chrome() # 确保你已安装 ChromeDriver
driver.get("https://www.youtube.com")
# 查找搜索框并输入关键字
search_box = driver.find_element('name', 'search_query')
search_box.send_keys(keyword)
search_box.send_keys(Keys.RETURN)
time.sleep(2) # 等待页面加载
videos = []
last_video_count = 0 # 用于检测页面是否加载了新内容
while len(videos) < max_videos:
# 查找视频元素
video_elements = driver.find_elements('xpath', '//ytd-video-renderer')
for video_element in video_elements[last_video_count:max_videos]:
try:
title_element = video_element.find_element('xpath', './/a[@id="video-title"]')
title = title_element.get_attribute('title')
url = title_element.get_attribute('href')
# 查找发布者(博主)信息
channel_element = video_element.find_element('xpath', './/yt-formatted-string[@id="text"]/a')
channel_name = channel_element.text
channel_url = channel_element.get_attribute('href')
video_info = {
'title': title,
'url': url,
'channel_name': channel_name,
'channel_url': channel_url
}
videos.append(video_info)
# 达到所需视频数量,提前退出
if len(videos) >= max_videos:
break
except Exception as e:
print(f"获取视频信息时出错: {e}")
continue
# 如果没有加载更多视频,退出循环
if len(video_elements) == last_video_count:
break
last_video_count = len(video_elements)
# 向下滚动加载更多内容
scroll_down(driver)
driver.quit()
return videos
代码解析
- scroll_down 函数:这个函数通过执行 JavaScript 向下滚动页面,以加载更多的视频内容。每次滚动后,脚本会暂停 2 秒,等待新内容加载完成。
- search_youtube_videos_via_selenium 函数:这个函数打开 YouTube,输入指定的关键字进行搜索,然后抓取视频的标题、链接、博主名称和博主链接,并将这些信息存储在
videos
列表中。
步骤 2:将抓取结果保存到 Excel 文件
抓取到的视频信息可以通过
openpyxl
库保存到 Excel 文件中,代码如下:
pythonCopy codedef save_to_excel(videos, filename='去重.xlsx'):
"""将视频信息保存到Excel文件并去重博主链接"""
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = "YouTube Videos"
# 写入表头
headers = ['标题', '视频链接', '博主名称', '博主链接']
sheet.append(headers)
# 用于存储已处理过的博主链接
seen_channels = set()
# 写入视频信息
for video in videos:
# 仅当博主链接不在集合中时,写入数据
if video['channel_url'] not in seen_channels:
row = [video['title'], video['url'], video['channel_name'], video['channel_url']]
sheet.append(row)
# 将博主链接添加到集合中,避免重复
seen_channels.add(video['channel_url'])
# 保存文件
workbook.save(filename)
print(f"数据已成功写入 {filename} 文件。")
代码解析
- save_to_excel 函数:该函数将视频信息写入 Excel 文件,并通过集合
seen_channels
去重博主链接,确保不会保存重复的博主信息。
步骤 3:主函数与实际运行
最后,我们通过以下代码调用这些功能,抓取视频信息并保存到 Excel 文件中:
pythonCopy codeif __name__ == '__main__':
keyword = input("请输入关键字:")
max_videos = int(input("请输入要获取的视频数量:"))
results = search_youtube_videos_via_selenium(keyword, max_videos)
for idx, video in enumerate(results, start=1):
print(f"视频 {idx}:")
print(f"标题: {video['title']}")
print(f"视频链接: {video['url']}")
print(f"博主名称: {video['channel_name']}")
print(f"博主链接: {video['channel_url']}")
print("-" * 40)
# 将结果写入Excel文件
save_to_excel(results)
在执行这段代码时,程序会提示你输入一个搜索关键词和希望抓取的视频数量,然后它会自动打开浏览器执行 YouTube 搜索,并将抓取到的视频信息打印到控制台。最后,它还会将结果保存到一个名为
去重.xlsx
的 Excel 文件中。
去重的原因主要是因为有些博主会发送很多视频导致博主名字一样
完整代码如以下
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import openpyxl
def scroll_down(driver):
"""执行页面滚动,加载更多视频"""
driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
time.sleep(2) # 等待页面加载
def search_youtube_videos_via_selenium(keyword, max_videos=100):
driver = webdriver.Chrome() # 确保你已安装 ChromeDriver
driver.get("https://www.youtube.com")
# 查找搜索框并输入关键字
search_box = driver.find_element('name', 'search_query')
search_box.send_keys(keyword)
search_box.send_keys(Keys.RETURN)
time.sleep(2) # 等待页面加载
videos = []
last_video_count = 0 # 用于检测页面是否加载了新内容
while len(videos) < max_videos:
# 查找视频元素
video_elements = driver.find_elements('xpath', '//ytd-video-renderer')
for video_element in video_elements[last_video_count:max_videos]:
try:
title_element = video_element.find_element('xpath', './/a[@id="video-title"]')
title = title_element.get_attribute('title')
url = title_element.get_attribute('href')
# 查找发布者(博主)信息
channel_element = video_element.find_element('xpath', './/yt-formatted-string[@id="text"]/a')
channel_name = channel_element.text
channel_url = channel_element.get_attribute('href')
video_info = {
'title': title,
'url': url,
'channel_name': channel_name,
'channel_url': channel_url
}
videos.append(video_info)
# 达到所需视频数量,提前退出
if len(videos) >= max_videos:
break
except Exception as e:
print(f"获取视频信息时出错: {e}")
continue
# 如果没有加载更多视频,退出循环
if len(video_elements) == last_video_count:
break
last_video_count = len(video_elements)
# 向下滚动加载更多内容
scroll_down(driver)
driver.quit()
return videos
def save_to_excel(videos, filename='去重.xlsx'):
"""将视频信息保存到Excel文件并去重博主链接"""
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = "YouTube Videos"
# 写入表头
headers = ['标题', '视频链接', '博主名称', '博主链接']
sheet.append(headers)
# 用于存储已处理过的博主链接
seen_channels = set()
# 写入视频信息
for video in videos:
# 仅当博主链接不在集合中时,写入数据
if video['channel_url'] not in seen_channels:
row = [video['title'], video['url'], video['channel_name'], video['channel_url']]
sheet.append(row)
# 将博主链接添加到集合中,避免重复
seen_channels.add(video['channel_url'])
# 保存文件
workbook.save(filename)
print(f"数据已成功写入 {filename} 文件。")
if __name__ == '__main__':
keyword = input("请输入关键字:")
max_videos = int(input("请输入要获取的视频数量:"))
results = search_youtube_videos_via_selenium(keyword, max_videos)
for idx, video in enumerate(results, start=1):
print(f"视频 {idx}:")
print(f"标题: {video['title']}")
print(f"视频链接: {video['url']}")
print(f"博主名称: {video['channel_name']}")
print(f"博主链接: {video['channel_url']}")
print("-" * 40)
print("如果需要奈飞GPT等办公会员的话可以访问下面这个链接,注意前后空格 ")
print("用户首单优惠码:jnu666")
print("https://universalbus.cn/?s=54pa61yt3s" )
# 将结果写入Excel文件
save_to_excel(results)
版权归原作者 赵其辉 所有, 如有侵权,请联系我们删除。