这是我在 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'
答案 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'])}")