【问题标题】:How to deal with gspread quota exceded, error 429如何处理 gspread 配额超出,错误 429
【发布时间】:2023-06-07 23:21:01
【问题描述】:

我正在尝试在工作表上写东西,但我得到了

gspread.exceptions.APIError: {'code': 429, 'message': "Quota exceeded for quota group 'WriteGroup' and limit 'Write requests per user per 100 seconds'....

如何编辑我的代码以使其未达到配额限制在达到配额一段时间后继续?尝试了time.sleep(),但它不起作用,或者我无法将其放置在正确的位置。

这是我的 gspread 代码

class CpfSearch(object):
    def __init__(self, spreadsheet_name):
        self.cpf_col = 1
        self.nome_col = 2
        self.age_col = 3
        self.beneficio_col = 4
        self.concessao_col = 5
        self.salario_col = 6
        self.bancos_col = 7
        self.bancocard_col = 8
        self.consig_col = 9
        self.card_col = 15

        scope = ['https://www.googleapis.com/auth/spreadsheets',
                 'https://www.googleapis.com/auth/drive.readonly']

        creds = ServiceAccountCredentials.from_json_keyfile_name('CONSULTAS.json', scope)

        client = gspread.authorize(creds)

        self.sheet = client.open(spreadsheet_name).sheet1

    def process_cpf_list(self):

        # SKIP OVER COLUMN HEADING IN THE SPREADSHEET
        cpfs = self.sheet.col_values(self.cpf_col)[1:]

        bot_url = BOT(cpfs)
        nomes, idades, beneficios, concessoes, salarios, bancoss, bancoscard, consigs, cards = bot_url.search_cpfs()

        # UPDATE THE SHEET
        print("Atualizando...")

        for cpfs in range(len(nomes)):
            time.sleep(1)
            self.sheet.update_cell(cpfs + 2, self.nome_col, nomes[cpfs])
            self.sheet.update_cell(cpfs + 2, self.age_col, idades[cpfs])
            self.sheet.update_cell(cpfs + 2, self.beneficio_col, beneficios[cpfs])
            self.sheet.update_cell(cpfs + 2, self.concessao_col, concessoes[cpfs])
            self.sheet.update_cell(cpfs + 2, self.salario_col, salarios[cpfs])
            self.sheet.update_cell(cpfs + 2, self.bancos_col, bancoss[cpfs])
            self.sheet.update_cell(cpfs + 2, self.bancocard_col, bancoscard[cpfs])
            self.sheet.update_cell(cpfs + 2, self.consig_col, consigs[cpfs])
            self.sheet.update_cell(cpfs + 2, self.card_col, cards[cpfs])


cpf_updater = CpfSearch('TESTE')
cpf_updater.process_cpf_list()

【问题讨论】:

  • 您是否尝试过增加您的睡眠时间?现在它正好处于配额限制,因此任何细微的差异都可能导致错误。尝试加倍睡眠,看看是否有效。然后慢慢后退以加快速度。
  • 其实远远超过配额限制。看起来每次循环都写了 9 次,是配额的 9 倍。因此,将 time.sleep 增加到 10,看看是否可行。
  • 您还可以在每个 update_cell 行周围放置一个 try/except 块,让 except 块休眠 100 秒(重置配额),然后重做该行并继续。
  • 能否请您解释一下如何制作,除了更详细的内容吗?我是非常新的编程,感谢您的帮助:)
  • 我看到了你的新问题。 *.com/q/61198280/7108653 如果我的回答对您的情况没有用处。我必须道歉。

标签: python web-scraping google-sheets error-handling gspread


【解决方案1】:

在这个答案中,我想建议创建一个包含值的数组,并使用values_update 的方法将该数组放入电子表格。这些值可以通过一个 API 调用来放置。至此,我认为您的问题可能会得到解决。

修改后的脚本:

当你的脚本被修改时,请进行如下修改。

发件人:

self.sheet = client.open(spreadsheet_name).sheet1

收件人:

self.spreadsheet = client.open(spreadsheet_name)
self.sheet = self.spreadsheet.sheet1

发件人:

for cpfs in range(len(nomes)):
    time.sleep(1)
    self.sheet.update_cell(cpfs + 2, self.nome_col, nomes[cpfs])
    self.sheet.update_cell(cpfs + 2, self.age_col, idades[cpfs])
    self.sheet.update_cell(cpfs + 2, self.beneficio_col, beneficios[cpfs])
    self.sheet.update_cell(cpfs + 2, self.concessao_col, concessoes[cpfs])
    self.sheet.update_cell(cpfs + 2, self.salario_col, salarios[cpfs])
    self.sheet.update_cell(cpfs + 2, self.bancos_col, bancoss[cpfs])
    self.sheet.update_cell(cpfs + 2, self.bancocard_col, bancoscard[cpfs])
    self.sheet.update_cell(cpfs + 2, self.consig_col, consigs[cpfs])
    self.sheet.update_cell(cpfs + 2, self.card_col, cards[cpfs])

收件人:

values = []
for cpfs in range(len(nomes)):
    values.append([nomes[cpfs], idades[cpfs], beneficios[cpfs], concessoes[cpfs], salarios[cpfs], bancoss[cpfs], bancoscard[cpfs], consigs[cpfs], "", "", "", "", "", cards[cpfs]])
rng = "'" + self.sheet._properties['title'] + "'!B2"
self.spreadsheet.values_update(rng, params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})

参考:

【讨论】: