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

如何用Python+Playwright+BeautifulSoup获取YouTube搜索结果视频URL?

问题分析与解决方案

核心问题原因

  • 依赖易变的页面class:YouTube的前端class命名(如yt-simple-endpoint style-scope ytd-video-renderer)会频繁更新,固定class定位很容易失效。
  • 未处理滚动加载:YouTube搜索结果默认只加载顶部少量视频,不滚动页面的话,后续视频不会出现在HTML中。
  • 等待时机与范围问题:networkidle状态不代表视频列表完全渲染完成,且仅获取#content的innerHTML可能遗漏部分元素。

修正后的代码

# pip install playwright beautifulsoup4
# playwright install

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('https://www.youtube.com/results?search_query=apple+pokemon', wait_until='domcontentloaded')
    
    # 滚动页面加载更多视频,可根据需求调整滚动次数
    for _ in range(3):
        page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
        page.wait_for_timeout(1000)  # 等待滚动后的内容加载
    
    # 获取完整页面HTML,避免遗漏元素
    html = page.content()
    soup = BeautifulSoup(html, 'html.parser')
    
    # 通过链接特征筛选视频URL,避开易变的class
    video_urls = []
    for link in soup.find_all('a', href=True):
        href = link['href']
        # 验证是否为有效YouTube视频链接(ID长度固定11位)
        if '/watch?v=' in href and len(href.split('v=')[1].split('&')[0]) == 11:
            full_url = f'https://www.youtube.com{href}'
            if full_url not in video_urls:
                video_urls.append(full_url)
    
    # 输出所有提取到的视频URL
    for url in video_urls:
        print(url)
    
    browser.close()

关键修改说明

  1. 滚动加载:通过JS滚动到页面底部并等待加载,获取更多搜索结果;
  2. 链接筛选逻辑:基于/watch?v=的特征和11位视频ID验证,替代不稳定的class定位,同时自动去重;
  3. HTML获取范围:改用page.content()获取完整页面源码,确保不遗漏任何视频元素;
  4. 等待优化:使用domcontentloaded配合滚动后的等待,保证内容渲染完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:35