Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Extração de dados de uma API - Python

Olá, estou tentando fazer a extração de dados dessa API: https://www.balldontlie.io/#get-all-stats com o seguinte código em python:

import requests
import json
import time

resultados_totais = []
paginas_totais_para_ler = int(11000)
contador_extra = 0

for page_num in range(1, paginas_totais_para_ler + 1):
    url = "https://balldontlie.io/api/v1/stats?per_page=100&page=" + str(page_num)
    print("Lendo", url)
    response = requests.get(url)
    data = response.json()
    response.raise_for_status()
    resultados_totais = resultados_totais + data['data']
    contador_extra = contador_extra + 1
    print(contador_extra)
    if contador_extra == 59:
        contador_extra = 0
        print('tempo')
        time.sleep(60)

print("Temos um total de", len(resultados_totais), "resultados")

with open('test.json', 'w', encoding='utf-8') as d:
    json.dump(resultados_totais, d, ensure_ascii=False, indent=4)

Porém, sempre obtenho esse erro: (https://cdn1.gnarususercontent.com.br/1/292460/5c2858ca-33df-4bd8-9b44-0d50a48ab3e0.png)

A API deveria suportar 60 requests por segundo, as vezes até passa de 60, mas no final sempre dá esse erro. Alguém teria alguma sugestão para poder me ajudar?

OBS: Preciso dos dados de todas as 11000 páginas do 'stats'

1 resposta
solução!

Achei essa solução para o problema:

import requests
import json
import time
from datetime import datetime

resultados_totais = []
paginas_totais_para_ler = 11486

# Funcao para buscar os dados de uma pagina especifica
def get_api_data(page_num): 
    url = "https://balldontlie.io/api/v1/stats?per_page=100&page=" + str(page_num)

    current_time = datetime.now().strftime("%H:%M:%S")
    print("{} - Lendo {}".format(current_time, url))

    # Guarda o inicio do request
    start_request = datetime.now()
    response = requests.get(url)

    # Calcula o tempo total do request
    end_request = datetime.now()
    delta = end_request - start_request

    # Se o request durou menos de 1 seg, aguardar para nao dar erro
    if delta.seconds <= 0:
        time.sleep(1)

    if response.status_code == 200:
        data = response.json()
        response.raise_for_status()
        return data['data']
    else:
        # Se mesmo assim tivermos erro de request, aguarda 15 segundos e tenta novamente
        current_time = datetime.now().strftime("%H:%M:%S")
        print("{} - ({}) Limite de request ... aguardando 15 seg para tentar novamente".format(current_time, response.status_code))
        time.sleep(15)
        return get_api_data(page_num)

# Loop para todas as paginas..
for page_num in range(1, paginas_totais_para_ler + 1):
    resultados_totais.extend(get_api_data(page_num))
    if page_num == paginas_totais_para_ler:
        print('\nSalvando Arquivo json..')
        with open('all_stats.json', 'w', encoding='utf-8') as d:
            json.dump(resultados_totais, d, ensure_ascii=False, indent=4)
        print('\nArquivo Salvo!!')

print("\nTemos um total de", len(resultados_totais), "resultados.")