gpt4 book ai didi

python - 通过 python 插入数据时如何处理 google 工作表中的配额超出错误 429?

转载 作者:行者123 更新时间:2023-12-05 06:01:13 24 4
gpt4 key购买 nike

我是 Python 的新手,目前正在处理一项自由职业任务。在我的项目中,我获得了主题名称 xls 文件,该文件每周都会更新为新名称。我能够抓取给定名称的数据,并通过 python 将获得的数据插入到 google 工作表中。目前,我的文件中有 5,000 多个名字。我以为我的代码已准备就绪,但在输入 8-10 个名称后,我遇到了错误 429,表明超出了配额限制。我查看了该网站,似乎 Google 允许每个项目每 100 秒限制 500 个请求,每个用户每 100 秒限制 100 个请求。考虑到这个限制,我对代码进行了更改并添加了 sleep ,因此不会遇到此错误,但根据我的想法,我似乎误会了这里,我的代码在循环运行中执行了 7 个请求,而我之前运行了 9 个循环执行 sleep(500) 但我仍然面临同样的错误。我确信我遗漏了一些非常明显的东西,但在我自己尝试了 3 天之后,我失去了信心,因此感谢任何帮助,下面是供引用的代码。

import requests
from bs4 import BeautifulSoup
import gspread
import pandas as pd
from oauth2client.service_account import ServiceAccountCredentials
from pandas import ExcelWriter
import time


# define the scope
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# add credentials to the account
creds = ServiceAccountCredentials.from_json_keyfile_name('/content/drive/MyDrive/ListUpdate.json', scope)

# authorize the clientsheet
client = gspread.authorize(creds)

# get the instance of the Spreadsheet
sheet = client.open('JP_combined_Strip')

# get the first sheet of the Spreadsheet
sheet_instance = sheet.get_worksheet(0)


list_of_lists = sheet_instance.get_all_values() # req 1
print(len(list_of_lists))

start = int((sheet_instance.cell(2, 1).value)) # req 2 this column is for recording the last row number where this program left off to continue from there next on next run
end = len(list_of_lists) + 1

for i in range(start,end,1):

##
## code for scraping
##
##
##
## scraped data
##

sheet_instance.update_cell(i, 3, data_1 ) # req 3
sheet_instance.update_cell(i, 4,data_2) # req 4
sheet_instance.update_cell(i, 5, data_3) # req 5
sheet_instance.update_cell(i, 6, data_4) # req 6
sheet_instance.update_cell(i, 7, data_5) # req 7
sheet_instance.update_cell(i, 8, data_6) # req 8
sheet_instance.update_cell(i, 9, data_7) # req 9 (req 7 under loop)
if i%9 == 0:
sheet_instance.update_cell(2, 1, i) # req 8 under loop when loop is run9 times = 9 * 7 = 63 requests total
## total requests should be 66 in total before each sleep statement is executed which is less than 100 requests as stated in google
print("sleep")
time.sleep(500)

代码成功运行到第一次休眠,7 条记录都得到执行但下一批失败并出现此错误。

最佳答案

问题是您仅在一定数量的请求后才休眠,而忽略了它可能在其间的任何地方失败,因此任何 API 调用都是潜在的失败。

这个问题有很多解决方案。在我看来,最好的方法是将每个调用包装到一个带有 try-catch block 和休眠功能的函数中。

import time

def api_call_handler(func):
# Number of retries
for i in range(0, 10):
try:
return func()
except Exception as e:
print(e)
time.sleep(2 ** i)
print("The program couldn't connect to the Google Spreadsheet API for 10 times. Give up and check it manually.")
raise SystemError

此代码的用法示例:

# Before
sheet_instance.update_cell(i, 3, data_1)
# Now
api_call_handler(lambda: sheet_instance.update_cell(i, 3, data_1))

此解决方案为代码添加了额外的结构并使其冗长,但它是防弹的。

关于python - 通过 python 插入数据时如何处理 google 工作表中的配额超出错误 429?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67278848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com