使用 YouTube API RelatedToVideoID 功能时出现“片段”的 KeyError

时间:2021-05-19 20:46:11

标签: python for-loop youtube-api append keyerror

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

我的问题与this thread有些相关。我正在尝试使用 YouTube API 为我的论文采样视频。我用下面的代码成功地做到了;但是,当我将标准从查询 (q) 更改为 relatedToVideoId 时,由于某种原因,解包部分会中断。 .有谁知道为什么会这样,我该如何解决?

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

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'

1 个答案:

答案 0 :(得分:0)

您的问题源于数组 resultsPerPage 大小的属性 items should not be used as an indicator

迭代从 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'])}")
相关问题