youtube_dl 视频说明

youtube_dl video descriptions

我有一个 df,其中包含一组来自 YT 的视频 ID:

import pandas as pd

data = {'Order':  ['1', '2', '3'],
        'VideoID': ['jxwHmAoKte4', 'LsXM502SpiU','1I3f27iQ4pM']
        }

df = pd.DataFrame (data, columns = ['Order','VideoID'])

print (df) 

并希望下载视频说明并将它们保存在同一 df 的额外列中。

我尝试以这种方式在 Jupyter 中使用 youtube_dl:

import youtube_dl

def all_descriptions(URL):
    videoID=df['VideoId']
    URL = 'https://www.youtube.com/watch?v=' + videoID
    ydl_opts = {
    'forcedescription':True,
    'skip_download': True,
    'youtube-skip-dash-manifest': True,
    'no_warnings': True,
    'ignoreerrors': True
    }
   
    try:
        youtube_dl.YoutubeDL(ydl_opts).download(URL)
        return webpage

except:
    pass

df['descriptions']=all_descriptions(URL)

我看到代码的输出为文本,但在 df 中只有“None”作为列的文本。

显然我无法以正确的方式将函数的输出传输到 df。

你能建议如何正确处理吗?

提前感谢您的帮助。

可以使用extract_info方法:

df['description'] = [
    youtube_dl.YoutubeDL().extract_info(
        u, download=False)['description'] for u in URL]

df

输出:

  Order      VideoID                                        description
0     1  jxwHmAoKte4  Bundesweit gelten sie nun ab heute, die schärf...
1     2  LsXM502SpiU  Wie sicher ist der Impfstoff? Wäre eine Impfpf...
2     3  1I3f27iQ4pM  Impfen ja oder nein, diese Frage stellen sich ...

P.S。 forcedescription 参数仅将描述打印到标准输出,它不会 return

更新: extract_info returns None 如果失败了,以防万一我们有视频在获取描述之前可能失败从信息中我们可以检查信息不是 None:

ydl = youtube_dl.YoutubeDL(ydl_opts)
infos = [ydl.extract_info(u, download=False) for u in URL]
df['description'] = [
    info['description'] if info is not None else ''
    for info in infos]

@perl 我修改了 df 以包含导致两种类型错误的两个 URL:

import pandas as pd

data = {'Order':  ['1', '2', '3', '4', '5'],
        'VideoId': ['jxwHmAoKte4', 'LsXM502SpiU','1I3f27iQ4pM', 'MGQOX2rK5s', 'wNayw_E7lIA']
        }

df = pd.DataFrame (data, columns = ['Order','VideoId'])

print (df)

然后我按照你建议的方式测试,包括我定义的ydl_opts:

videoID=df['VideoId']
URL = 'https://www.youtube.com/watch?v=' + videoID
ydl_opts = {
    'forcedescription':True,
    'skip_download': True,
    'youtube-skip-dash-manifest': True,
    'no_warnings': True,
    'ignoreerrors': True
    }
    
df['description'] = [
    youtube_dl.YoutubeDL(ydl_opts).extract_info(
        u, download=False)['description'] for u in URL]

df

到达第一个错误我得到输出:

TypeError: 'NoneType' object is not subscriptable

之后,我将代码中的 'forcedescription' 替换为 'extract_info':

def all_descriptions(URL):
    videoID=df['VideoId']
    URL = 'https://www.youtube.com/watch?v=' + videoID
    ydl_opts = {
    'forcedescription':True,
    'skip_download': True,
    'youtube-skip-dash-manifest': True,
    'no_warnings': True,
    'ignoreerrors': True
    }
   
    try:
        youtube_dl.YoutubeDL(ydl_opts).download(URL)
        return webpage
    
    except:
        pass

它会跳过所有错误,但结果 'description' 列中没有任何内容。

有什么建议吗?