使用 YouTube 数据 API RelatedToVideoID 功能时 'snippet' 的 KeyError

KeyError for 'snippet' when using YouTube Data API RelatedToVideoID feature

这是我在 Stack Overflow 上的第一个问题,所以如果有任何不清楚的地方请告诉我。 :)

我的问题与 this thread 有点相关。我正在尝试使用 YouTube 数据 API 为我的论文制作视频样本。我已经使用下面的代码成功完成了;但是,当我将条件从查询 (q) 更改为 relatedToVideoId 时,解包部分由于某种原因中断。

它在我的循环之外工作,但在循环内部不起作用(来自另一个线程的 .get() 建议也是同样的故事)。有谁知道为什么会这样以及我该如何解决它?

这是我编写的(缩短的)代码,您可以使用它来重现问题:

import numpy as np
import pandas as pd

# Allocate credentials:
from googleapiclient.discovery import build
api_key = "YOUR KEY SHOULD GO HERE"
# Session Build
youtube = build('youtube', 'v3', developerKey = api_key)

df_sample_v2  = pd.DataFrame(columns = ["Video.ID", "Title", "Channel Name"])    
keywords       = ['Global Warming',
                  'Coronavirus'
                  ]
iter           = list(range(1, 150))
rand_selec_ids = ['H6u0VBqNBQ8',
                 'LEZCxxKp0hM'
                 ]
for i in iter:
        
      # Search Request
      request = youtube.search().list(
          part             = "snippet",
          #q               = keywords[4],
          relatedToVideoId = rand_selec_ids[1],
          type             = "video",
          maxResults       = 5000,
          videoCategoryId  = 28,
          order            = "relevance",
          eventType        = "completed",
          videoDuration    = "medium"
      ) 

      # Save Response
      response = request.execute()

      # Unpack Response
      rows = []

      for i in list(range(0, response['pageInfo']['resultsPerPage'])):

          rows.append([response['items'][i]['id']['videoId'],
                       response['items'][i]['snippet']['title'], # this is the problematic line
                       response['items'][i]['snippet']['channelTitle']]
                     )

      temp = pd.DataFrame(rows, columns = ["Video.ID", "Title", "Channel Name"])
      df_sample_v2 = df_sample_v2.append(temp)
      print(f'{len(df_sample_v2)} videos retrieved!')

我得到的 KeyError 出现在 rows.append() 的第二行,我在其中尝试访问代码段。

KeyError                                  Traceback (most recent call last)
<ipython-input-90-c6c01139e372> in <module>
     45 
     46                 rows.append([response['items'][i]['id']['videoId'],
---> 47                              response['items'][i]['snippet']['title'],
     48                              response['items'][i]['snippet']['channelTitle']]
     49                            )

KeyError: 'snippet'

你的问题是因为 属性 resultsPerPage 数组的大小 items.

迭代从 API 获得的项目的正确方法如下(这也是进行此类迭代的一般 pythonic 方法):

for item in response['items']:
    rows.append([
        item['id']['videoId'],
        item['snippet']['title'],
        item['snippet']['channelTitle']
    ])

您可以在您的代码中添加类似于下面的 调试 代码的内容,以说服您自己相信我的声明。

print(f"resultsPerPage={response['pageInfo']['resultsPerPage']}")
print(f"len(items)={len(response['items'])}")