Python循环爬取URL时append_rows写入Google Sheets报错问题
解决Google Sheets批量写入的429配额与400格式错误问题
问题根源
- 用
insert_row逐行写入时,每一行都触发一次API请求,快速耗尽Google Sheets API的请求配额,导致429错误。 - 改用
append_rows触发400错误,核心原因是传入的数据格式不符合Google Sheets API要求的ListValue结构:- 数据必须是二维列表(外层列表是行集合,内层列表是每行的单元格值)
- 单元格值不能是
None或非基本数据类型(比如对象),必须是字符串、数字等可序列化的类型
正确批量写入方案
1. 先批量收集所有数据到内存
遍历球员详情页时,把每个球员的信息整理成子列表,统一存入全局列表,避免边爬边写触发频繁请求:
all_players_data = [] # 遍历球员列表页的每个球员链接 for player_link in player_links: # 爬取并提取球员详情数据 player_name = ... # 提取姓名 player_url = player_link player_position = ... # 提取位置 avatar_url = ... # 提取头像链接 # 处理空值:将None转为空字符串,避免格式错误 player_name = player_name if player_name else "" player_position = player_position if player_position else "" avatar_url = avatar_url if avatar_url else "" # 将单条球员数据加入全局列表 all_players_data.append([player_name, player_url, player_position, avatar_url])
2. 批量写入Google Sheets
方法一:使用append_rows(推荐)
确保传入的values是二维列表,同时指定value_input_option='USER_ENTERED'让API自动适配数据格式:
# 假设sheet是已授权的Google Sheet对象 sheet.append_rows(values=all_players_data, value_input_option='USER_ENTERED')
方法二:使用batch_update(更灵活)
如果需要指定写入范围或复杂操作,用批量更新:
data = [ { 'range': 'Sheet1!A:D', # 对应姓名、URL、位置、头像链接四列 'values': all_players_data } ] sheet.batch_update({'valueInputOption': 'USER_ENTERED', 'data': data})
3. 额外优化建议
- 控制爬取频率:遍历球员页时添加
time.sleep(1)延时,避免目标网站反爬,同时分散API请求时间。 - 数据一致性检查:确保每个子列表的元素数量一致,避免因列数不匹配触发格式错误。
- 分批次写入:如果数据量极大,拆分列表为每50-100行一批次写入,每批次后延时1-2秒,避免触发配额限制。
常见错误排查
- 仍报400错误:检查
all_players_data中的元素,确保没有None、字典、对象等非基本类型,全部转为字符串或数字。 - 仍触发429错误:进一步缩小批次大小,延长批次间的延时,或在Google Cloud控制台调整API配额(若允许)。
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

