如何用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()
关键修改说明
- 滚动加载:通过JS滚动到页面底部并等待加载,获取更多搜索结果;
- 链接筛选逻辑:基于
/watch?v=的特征和11位视频ID验证,替代不稳定的class定位,同时自动去重; - HTML获取范围:改用
page.content()获取完整页面源码,确保不遗漏任何视频元素; - 等待优化:使用
domcontentloaded配合滚动后的等待,保证内容渲染完成。
内容的提问来源于stack exchange,提问作者Mystic
相关产品推荐
相关产品推荐

