使用youtube-transcript-api的Python脚本无加载内容,请求排查
解决YouTube Transcript API脚本无内容加载的问题
你的脚本核心问题是错误处理了YouTubeTranscriptApi.get_transcripts()的返回值,同时可以补充几处优化点来排查问题:
1. 修复get_transcripts()返回值处理
get_transcripts()返回的是一个包含两个字典的元组:
- 第一个字典:键为成功获取转录文本的视频ID,值为对应转录内容
- 第二个字典:键为获取失败的视频ID,值为对应错误信息
你的代码错误地将这个元组当成了与video_ids一一对应的列表,导致循环逻辑完全失效。修复后的核心代码如下:
try: # 获取转录结果:成功字典 + 错误字典 transcripts_dict, errors_dict = YouTubeTranscriptApi.get_transcripts( video_ids, continue_after_error=True, languages=['de'] # 注意参数名是languages,不是language ) # 处理成功的转录 for video_id, transcript in transcripts_dict.items(): full_text = get_transcript_text(transcript) output_filename = os.path.join(OUTPUT_DIR, f"{video_id}.txt") with open(output_filename, 'w', encoding='utf-8') as outfile: outfile.write(full_text) print(f"Erfolgreich gespeichert: {output_filename}") # 处理失败的请求 for video_id, error in errors_dict.items(): print(f"Fehler beim Abrufen des Transkripts für ID {video_id}: {error}") except Exception as e: print(f"\n Kritischer Fehler während des API-Aufrufs: {e}")
2. 其他关键修复与检查点
- 修正参数名:原代码中
language=['de']应为languages=['de'](API要求复数形式),否则会忽略语言设置 - 增强URL提取正则:原正则可能无法匹配部分URL格式(比如带参数的youtu.be链接),可以替换为更健壮的版本:
def extract_video_id(url): """Extrahiert Video-ID aus YouTube-URL""" pattern = r'(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([0-9A-Za-z_-]{11})' match = re.search(pattern, url) return match.group(1) if match else None - 检查urls.txt格式:确保文件中每行一个URL,无多余空格或空行(脚本已处理空行,但建议保持格式整洁)
- 验证虚拟环境依赖:在venv中重新确认依赖安装:
pip install --upgrade youtube-transcript-api - 检查视频是否有德语转录:如果视频没有德语字幕,API会返回错误,可以添加多语言 fallback:
languages=['de', 'en'] # 优先德语,其次英语
修复后的完整脚本
# download_transcripts.py from youtube_transcript_api import YouTubeTranscriptApi import re import os # --- Konfiguration --- URLS_FILE = "urls.txt" OUTPUT_DIR = "transcripts" # --------------------- def extract_video_id(url): """Extrahiert Video-ID aus YouTube-URL""" pattern = r'(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([0-9A-Za-z_-]{11})' match = re.search(pattern, url) return match.group(1) if match else None def get_transcript_text(transcript_segments): """Segmente zu einem Text""" return ' '.join([segment['text'] for segment in transcript_segments]) def download_transcripts(): """Liest URLs, extrahiert IDs, Transkripte download""" if not os.path.exists(URLS_FILE): print(f"Fehler: Die Datei '{URLS_FILE}' wurde nicht gefunden.") return os.makedirs(OUTPUT_DIR, exist_ok=True) video_ids = [] # URLs aus der Datei lesen und IDs extrahieren with open(URLS_FILE, 'r') as f: for line in f: url = line.strip() if url: video_id = extract_video_id(url) if video_id: video_ids.append(video_id) else: print(f"Warnung: Konnte die Video-ID aus der URL '{url}' nicht extrahieren.") if not video_ids: print("Keine gültigen Video-IDs zum Herunterladen gefunden.") return print(f"Starte Download für {len(video_ids)} Videos...") try: transcripts_dict, errors_dict = YouTubeTranscriptApi.get_transcripts( video_ids, continue_after_error=True, languages=['de', 'en'] ) # 处理成功的转录 for video_id, transcript in transcripts_dict.items(): full_text = get_transcript_text(transcript) output_filename = os.path.join(OUTPUT_DIR, f"{video_id}.txt") with open(output_filename, 'w', encoding='utf-8') as outfile: outfile.write(full_text) print(f"Erfolgreich gespeichert: {output_filename}") # 处理失败的请求 for video_id, error in errors_dict.items(): print(f"Fehler beim Abrufen des Transkripts für ID {video_id}: {error}") except Exception as e: print(f"\n Kritischer Fehler während des API-Aufrufs: {e}") if __name__ == "__main__": download_transcripts()
内容的提问来源于stack exchange,提问作者nalos
相关产品推荐
相关产品推荐

