当通过python插入数据时,如何处理google工作表中的Quota exceed错误429



我是python的新手,目前正在处理一项自由职业任务。在我的项目中,我得到了主题名称xls文件,该文件每周都会更新新名称。我能够为给定的名称抓取数据,并通过python将获得的数据插入谷歌工作表中。我现在有5000多个名字。我以为我的代码已经准备好了,但在8-10个名称之后,我遇到了错误429,该错误表示超出了配额限制。我在网站上查看了一下,谷歌似乎允许每个项目每100秒500次请求,每个用户每100秒100次请求。考虑到这一限制,我对代码进行了更改,并添加了sleep,这样就不会出现这个错误,但我在这里似乎有一个误解,根据我的想法,我的代码在一次循环运行中执行了7个请求,在执行sleep(500(之前运行了9个循环,但我仍然面临同样的错误。我确信我错过了一些非常明显的东西,但在我自己尝试了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条记录doo被执行,但下一次批处理失败并出现此错误。

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

这个问题有很多解决办法。从我的角度来看,最好的方法是将每个调用都打包到一个函数中,并在那里使用try-catch块和sleep功能。

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))

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

相关内容

  • 没有找到相关文章

最新更新