Почему он выдает «KeyError» после запроса API?

#python #api #python-requests

Вопрос:

мой код Python выдает ошибку после короткого периода от 5 до 7 запросов или так называемого «Файла». c:/Users/xxx/Desktop/Webscraper.py», строка 15, в программе zeit=(веб-сайт[«данные»]).

Ошибка ключа: «данные»

Почему он выдает эту ошибку ? Ключ всегда должен быть там.

 import requests
import time
import os

def programm():
    while True:
        url=f"https://api.nanopool.org/v1/eth/network/timetonextepoch"
        webseite = requests.get(url).json()
        zeit=(webseite['data'])
        puffer=int(420)

        while zeit > puffer:
            url=f"https://api.nanopool.org/v1/eth/network/timetonextepoch"
            webseite = requests.get(url).json()
            zeit=(webseite["data"])
            puffer=int (420)
            print("Zeit zum DAG-Wechsel in Sekunden:",zeit)
            time.sleep(60) #Refresh Zeit
            while zeit < puffer:
                print("Neustart in",int(zeit)) # Zeit zur nächsten DAG Epoche in Sekunden
                os.startfile("C:/Users/xxxx/Desktop/restart1.bat")
                print("restart")
                time.sleep(5000)
                break
        break
while True:
    programm()
    break
 

Комментарии:

1. «Ключ всегда должен быть там» — ну, очевидно, это не так. Вы можете print(webseite) перед доступом к data полю просмотреть содержимое

2. Значение, полученное из HTTP GET, равно {"status":true,"data":319847.5982666667}

3. Как я могу обработать пропущенный запрос? Скрипт всегда должен выполнять этот запрос даже без ответа

4. Каков ваш план на случай ошибок? Вы должны resp = requests.get(url) и должны проверить resp.status_code , прежде чем получать json. Затем решите, что делать с различными типами ошибок. Вам следует if 'data' in webseite , прежде чем пытаться использовать его, решить, что вы хотите делать в этом случае.

5. если запрос не выполняется, он должен просто повторять его снова и снова, пока я не получу запрос. Как я могу это реализовать?

Ответ №1:

Веб-сайты могут периодически выходить из строя по многим причинам. Возможно, вы делаете слишком много запросов, или сервер перегружен, или он не работает для обслуживания. Ваш код должен проверять коды ошибок, которые помогут выяснить, что идет не так.

Поскольку вы хотите продолжать попытки, вы можете просто добавить это в свой код. Я выделил сбор данных в отдельную функцию, которая возвращается только тогда, когда получает хорошие данные. Это уменьшает количество повторений в вашем коде.

 import requests
import time
import os

def get_nanopool_time_to_next_epoch():
    while True:
        url=f"https://api.nanopool.org/v1/eth/network/timetonextepoch"
        resp = requests.get(url)
        if resp.status_code >= 300:
            print("--------------------------------------------")
            print("Http error", resp.status_code)
            print(resp.content)
        webseite = requests.get(url).json()
        if 'data' not in webseite:
            print("--------------------------------------------")
            print("'data' not in result")
            print(resp.content)
        else:
            return webseite['data']
        time.sleep(1)

def programm():
    while True:
        zeit = get_nanopool_time_to_next_epoch()
        puffer=int(420)

        while zeit > puffer:
            zeit = get_nanopool_time_to_next_epoch()
            puffer=int (420)
            print("Zeit zum DAG-Wechsel in Sekunden:",zeit)
            time.sleep(60) #Refresh Zeit
            while zeit < puffer:
                print("Neustart in",int(zeit)) # Zeit zur nächsten DAG Epoche in Sekunden
                os.startfile("C:/Users/xxxx/Desktop/restart1.bat")
                print("restart")
                time.sleep(5000)
                break
        break
while True:
    programm()
    break
 

Комментарии:

1. Вот и все. Большое вам спасибо. Мне нужно увеличить обработку исключений. Ты мне так сильно помогаешь.

2. Как я могу реализовать это, если запрос не выполняется, он просто пытается снова и снова. Я не хочу прерывать код сообщением об ошибке.