如何修复YouTube Data API分页数据存储:Pandas仅保留最后部分数据
修复YouTube Data API分页数据丢失问题——仅保留最后一页结果的解决办法
问题核心:你的代码每次分页循环都会覆盖res变量,最终只保留了最后一页的搜索结果;后续获取视频详情时也仅处理了最后一页的ID,导致数据不全。以下是具体修复步骤和完整代码:
修复思路
- 初始化全局列表存储所有视频ID:避免每次循环覆盖数据,用列表累加每一页的视频ID
- 分批处理视频详情请求:YouTube Data API的
videos.list接口一次最多支持50个ID查询,需分批处理避免报错 - 统一转换为DataFrame:基于所有视频详情数据生成完整的DataFrame
修改后的完整代码
1. 分页获取所有视频ID
api_key = "***" from googleapiclient.discovery import build youtube = build('youtube','v3',developerKey = api_key) # 初始化全局列表存储所有视频ID all_video_ids = [] nextPageToken = '' query = "你的搜索关键词" # 补充你的搜索关键词 for x in range(2): request = youtube.search().list( q=query, part='id', maxResults=50, order="date", pageToken=nextPageToken, type='video') res = request.execute() # 提取当前页的视频ID并添加到全局列表 page_video_ids = [item['id']['videoId'] for item in res['items']] all_video_ids.extend(page_video_ids) # 更新下一页token,若无则提前终止循环 if 'nextPageToken' in res: nextPageToken = res['nextPageToken'] else: break print(f"共获取到 {len(all_video_ids)} 条视频ID")
2. 分批获取视频详情并转换为DataFrame
import pandas as pd # 定义分批获取视频详情的函数 def batch_get_video_details(youtube, video_ids): all_video_details = [] # 每50个ID为一批处理 for i in range(0, len(video_ids), 50): batch_ids = video_ids[i:i+50] request = youtube.videos().list( id=','.join(batch_ids), part='snippet' ) response = request.execute() all_video_details.extend(response.get('items', [])) return all_video_details # 获取所有视频详情 video_details = batch_get_video_details(youtube, all_video_ids) # 转换为Pandas DataFrame df = pd.DataFrame([{ '视频ID': item['id'], '频道名称': item['snippet']['channelTitle'], '视频标题': item['snippet']['title'], '视频描述': item['snippet']['description'] } for item in video_details]) # 查看结果 print(f"DataFrame包含 {len(df)} 条数据") display(df.head())
关键注意事项
- 使用
list.extend()而非直接赋值:确保每一页的ID都被累加到全局列表中,而非覆盖之前的数据 - 分批处理视频详情:严格遵守API限制,避免单次请求ID数量超过50导致报错
- 提前终止循环:当API返回结果中没有
nextPageToken时,及时退出循环,减少无效请求
内容的提问来源于stack exchange,提问作者MasterMind
相关产品推荐
相关产品推荐

