You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:22:17