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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 21:43:12