视频输出的图像嘿,所以我在使用YT data API v3抓取YouTube频道视频数据时遇到了一个令人讨厌的问题。这在大约一周前是有效的,但现在它想变得固执起来。
到目前为止,代码中的所有内容都在工作,只是由于某种奇怪的原因,它返回的JSON结果的第三个结果是通道对象条目,而不是视频对象。我找不到现在发生这种情况的任何原因,但这是有问题的,因为这意味着以下用于提取视频id的代码在前两个结果之后停止迭代,因为第三个(频道(条目没有"id"字典条目"videoId",因为它有"channelId"。
我认为我最好的解决方案是修改这个代码块,使其跳过任何在其"id"字典中没有"videoId"的JSON对象,但我对如何在for循环中使用字典对象有点生疏。有人能帮我吗?
limit = 5
video_Ids = []
nextPageToken ="" #for 0th iteration let it be null
for i in range(limit):
url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}"
data = json.loads(requests.get(url).text)
for item in data['items']:
video_Id = item['id']['videoId']
video_Ids.append(video_Id)
nextPageToken = data['nextPageToken']
编辑:我已经包含了JSON输出的图像。正如您所看到的,它有几个嵌套的字典和列表。
limit = 5
video_Ids = []
nextPageToken ="" #for 0th iteration let it be null
for i in range(limit):
url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}"
data = json.loads(requests.get(url).text)
for item in data['items']:
if 'videoId' in item['id']:
video_Id = item['id']['videoId']
video_Ids.append(video_Id)
nextPageToken = data['nextPageToken']
或者你可以使用尝试异常
limit = 5
video_Ids = []
nextPageToken ="" #for 0th iteration let it be null
for i in range(limit):
url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}"
data = json.loads(requests.get(url).text)
for item in data['items']:
try:
video_Id = item['id']['videoId']
video_Ids.append(video_Id)
except KeyError:
pass
nextPageToken = data['nextPageToken']
在代码中使用try/except怎么样?
因此,如果出现错误,代码将不会退出,只会打印一条错误消息并转到下面的视频。
video_Ids = []
nextPageToken ="" #for 0th iteration let it be null
for i in range(limit):
url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}"
data = json.loads(requests.get(url).text)
try:
for item in data['items']:
video_Id = item['id']['videoId']
video_Ids.append(video_Id)
except:
print(f'There was an error loading the page {i}')
nextPageToken = data['nextPageToken']
谢谢你们的回复,但我刚刚找到了一个解决方案:
limit = 5
video_Ids = []
nextPageToken ="" #for 0th iteration let it be null
for i in range(limit):
url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}"
data = json.loads(requests.get(url).text)
for key in data['items']:
if 'videoId' in key['id']:
video_Id = key['id']['videoId']
video_Ids.append(video_Id)
# else:
# continue
nextPageToken = data['nextPageToken']
因此,它所做的是跳过通道JSON对象并返回249/250个结果(作为videoId代码格式的视频JSON对象(。它并不完美,但它对我有用。