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