使用pytube15.0.0下载YouTube音频遇RegexMatchError求助
解决方案与替代方案
修复pytube的问题
1. 升级pytube到最新版本
你的pytube版本15.0.0较旧,YouTube页面结构和反爬逻辑频繁更新,新版本会针对性修复正则匹配类问题。执行以下命令升级:
pip install --upgrade pytube
2. 替换自定义搜索逻辑为pytube内置功能
你通过urllib和正则提取视频ID的方式易受页面结构变动影响,改用pytube自带的YouTubeSearch类更稳定:
from pytube import YouTube, YouTubeSearch # 构造搜索关键词 search_kw = f"{tracks[i+1]['Artist']} {tracks[i+1]['Track Title']}" print(f"Preparing {tracks[i+1]['Artist']}-{tracks[i+1]['Track Title']}") # 用pytube内置搜索获取首个结果 results = YouTubeSearch(search_kw, max_results=1).to_dict() if results: song_yt_link = f"https://www.youtube.com{results[0]['url_suffix']}" selected_video = YouTube(song_yt_link) output_path = '/dataset/' # 直接筛选纯音频流(比mp4视频流更适合音频下载需求) audio = selected_video.streams.filter(only_audio=True).first() audio.download(output_path=output_path)
3. 手动修复cipher.py的正则(升级后仍报错时)
若升级版本后问题依旧,找到pytube安装目录下的cipher.py,修改get_throttling_function_name函数中的正则规则:
将原有匹配模式替换为:
function_patterns = [ r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&.*?\|\|\s*([a-z]+)\(', r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)\([a-z]\)', ]
保存后重新运行代码。
替代模块推荐
如果pytube始终无法解决问题,以下模块维护更活跃、兼容性更强:
1. yt-dlp
这是youtube-dl的活跃分支,对YouTube反爬机制适配更好,功能更全面。示例代码:
import yt_dlp search_kw = f"{tracks[i+1]['Artist']} {tracks[i+1]['Track Title']}" print(f"Preparing {tracks[i+1]['Artist']}-{tracks[i+1]['Track Title']}") # 配置下载参数:获取最佳音频并转为MP3格式 ydl_opts = { 'format': 'bestaudio/best', 'outtmpl': '/dataset/%(artist)s-%(title)s.%(ext)s', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', }], } # 直接搜索并下载(也可传入具体视频链接) with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([f"ytsearch1:{search_kw}"])
安装命令:
pip install yt-dlp
2. youtube-dl
经典的YouTube下载工具,维护频率略低于yt-dlp,可作为备选:
安装命令:
pip install youtube-dl
用法与yt-dlp类似,部分参数存在差异,可参考官方文档调整。
内容的提问来源于stack exchange,提问作者Anthony Reid
相关产品推荐
相关产品推荐

