0


使用 Selenium 抓取 YouTube 视频信息并保存至 Excel

在某些情况下,我们可能需要批量获取 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)
​
标签: python 开发语言

本文转载自: https://blog.csdn.net/weixin_67653538/article/details/142977282
版权归原作者 赵其辉 所有, 如有侵权,请联系我们删除。

“使用 Selenium 抓取 YouTube 视频信息并保存至 Excel”的评论:

还没有评论