You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS下Selenium+Python爬取YouTube视频标题写入文件问题

问题根因排查

你的代码存在4个核心错误,直接触发你遇到的两类异常:

  • 第一个错误:XPath写法不符合Selenium规则。Selenium的find_elements只能定位DOM元素节点,你写的XPath末尾带/text()是直接取文本节点,Selenium识别不到这类节点,直接导致元素定位失败,后续获取title.text拿不到有效内容,写入文件自然为空;而且定位不到元素时WebDriverWait会阻塞到超时,甚至拦截后续driver.quit()的执行,这就是Safari进程卡住无法正常退出的核心原因。
  • 第二个错误:滚动逻辑完全失效。你每次滚动仅设置10像素位移,而且滚动操作定义后没有调用perform()执行,ActionChains的操作不触发perform根本不会实际生效,页面永远不会下滑加载更多结果,while循环会持续空转卡死。
  • 第三个错误:缩进与逻辑判断错误。count = 0被错误缩进写到while循环内部,每次循环都会把count重置为0;后续for循环的判断条件写为count > query_amount,会多取1条结果,计数逻辑完全不对。
  • 第四个错误:文件操作冗余低效。一开始用w模式打开文件空跑一次没有实际意义,循环内反复以a模式打开关闭文件写内容,不仅性能差还容易触发文件占用报错。
修复方案

直接替换为以下修正后的可运行代码即可:

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
from selenium import webdriver
import time

# 接收用户输入参数
request = input('Search for: ')
split_request = request.split()
url = 'https://www.youtube.com/results?search_query=' + '+'.join(split_request)
query_amount = int(input('How many results do you want to see? '))

driver = webdriver.Safari()
actions = ActionChains(driver)
driver.get(url)

try:
    # 修正XPath:仅定位标题元素节点,不直接取文本节点
    video_title_xpath = '//*[@id="video-title"]/yt-formatted-string'
    WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, video_title_xpath)))
    
    title_list = []
    # 修正滚动逻辑:每次滚动500像素,触发perform执行,直到拿到足够数量的有效标题
    while len(title_list) < query_amount:
        raw_titles = driver.find_elements(By.XPATH, video_title_xpath)
        # 过滤广告、占位元素产生的空标题
        title_list = [t for t in raw_titles if t.text.strip() != '']
        actions.scroll_by_amount(0, 500).perform()
        time.sleep(0.8) # 等待页面加载新内容
    
    # 仅打开一次文件完成写入,指定utf-8编码避免非英文标题报错
    with open('YouTube Search Results.txt', mode='w', encoding='utf-8') as file:
        for i in range(query_amount):
            file.write(title_list[i].text.strip() + '\n')
    
    print(f"已成功写入{query_amount}条视频标题到YouTube Search Results.txt")
finally:
    driver.quit()
额外注意事项
  • 运行前需要提前开启Safari的远程自动化权限:打开Safari设置→高级→勾选「在菜单栏中显示开发菜单」,再在开发菜单中勾选「允许远程自动化」,否则驱动会启动失败。
  • 如果运行时偶发元素定位失败,可以把等待条件从presence_of_all_elements_located替换为visibility_of_all_elements_located,等元素完全可见渲染完成后再取内容。

内容的提问来源于stack exchange,提问作者Lake Five

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:51:18