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
相关产品推荐
相关产品推荐

