如何用Python通过YouTube API获取指定ChannelId全部视频并正确追加数据?
解决YouTube API批量获取视频数据的循环追加问题
我来帮你搞定这个问题!你的代码核心问题在于直接对API返回的字典对象使用append方法——因为r.json()返回的是字典类型,而append是列表专属的方法,所以肯定会报错。另外,你需要单独维护一个容器来存储所有视频条目,而不是直接修改原始的响应字典。
关键修改点:
- 新建一个列表
all_videos来统一存储所有请求返回的视频数据 - 每次请求后,提取响应里的
items字段(这才是真正的视频条目列表)追加到all_videos - 更新
nextPageToken时,要从当前循环的新响应里获取,而不是最初的json_data
修正后的完整代码:
import requests import json mykey = 'myGoogleKey' channelid = 'someRandomChannelId' # 初始化空列表,用来存储所有视频数据 all_videos = [] # 第一次请求 r = requests.get(f"https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=50&channelId={channelid}&order=date&key={mykey}") json_data = r.json() # 将第一次请求的视频条目加入列表 all_videos.extend(json_data.get("items", [])) nextPageToken = json_data.get("nextPageToken") # 循环获取剩余页面的数据 while nextPageToken: # 带pageToken的请求 r = requests.get(f"https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=50&channelId={channelid}&order=date&key={mykey}&pageToken={nextPageToken}") current_data = r.json() # 追加当前页的视频条目 all_videos.extend(current_data.get("items", [])) # 更新nextPageToken,从当前响应里取 nextPageToken = current_data.get("nextPageToken") # 把所有视频数据写入文件,这里包装成和API响应类似的结构 output_data = {"items": all_videos} with open('myJsonFile.json', 'w') as outfile: json.dump(output_data, outfile, sort_keys=True, indent=4) print("All Done! 总共获取到", len(all_videos), "条视频数据")
额外说明:
- 使用了f-string来拼接URL,比传统的字符串拼接更清晰易读
- 用
get("items", [])做了容错处理,如果API返回里没有items字段,会用空列表避免报错 - 最后把列表包装成带
items键的字典,和API原始响应结构一致,方便后续处理
内容的提问来源于stack exchange,提问作者DNac
相关产品推荐
相关产品推荐

