программа на python внезапно начала выдавать ошибку ключа

#python

Вопрос:

Я делаю запрос API на сервер, а затем анализирую ответ json и сохраняю его в csv-файле. Все работало, но теперь внезапно программа выдает ошибки.

Странно то, что, когда я запускаю тот же код на своем ноутбуке, он работает, но на vps он создает исключение (всего несколько минут назад он работал и на vps, и на vps ничего не изменилось, что могло бы вызвать исключение).

мой код на python:

 from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import requests
import json
import csv
from datetime import datetime


print("Started...")
def fn():
    print("        Writing Data...")
    session_id = "auZsJ4F2RsQNJxSPTMDt2238324"
    Outlook='http://www.myfxbook.com/api/get-community-outlook.json?session='   session_id
    Outlook_response = requests.get(Outlook)
    Outlook_data = Outlook_response.json()['symbols']
    now = datetime.now()
    current_time = now.strftime("%H:%M")


    EURUSD=Outlook_data[0]
    SHORTPERC0=EURUSD['shortPercentage']
    LONGPERC0 =EURUSD['longPercentage']
    SHORTvolume0=EURUSD['shortVolume']
    longVolume0=EURUSD['longVolume']
    longPositions0=EURUSD['longPositions']
    shortPositions0=EURUSD['shortPositions']

    with open('myfile.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([current_time, SHORTvolume0, longVolume0, longPositions0, shortPositions0])

        print("        done...")

sched = BlockingScheduler()

# Execute fn() at the start of each minute.
sched.add_job(fn, trigger=CronTrigger(second=1))
sched.start()
 

вот в чем заключаются ошибки:

введите описание изображения здесь

Связана ли ошибка с APScheduler? Или это ключевая ошибка?

ответ json выглядит так:

 {
"error": false,
"message": "",
"symbols": [{
    "name": "EURUSD",
    "shortPercentage": 45,
    "longPercentage": 55,
    "shortVolume": 23273.25,
    "longVolume": 28123.5,
    "longPositions": 74045,
    "shortPositions": 60996,
    "totalPositions": 135041,
    "avgShortPrice": 1.1709,
    "avgLongPrice": 1.1975
}
 

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

1. дикт ` Outlook_response.json()` не содержит ключевых символов

2. привет, спасибо за ответ @balderman, но из ответа я ясно вижу, что в ответе есть ключевые «символы»

3. распечатайте диктант, прежде чем искать ключ. вы уверены, что он там?

4. Абсолютно верно, что в словаре нет ключа «символы». Я не могу сказать вам, сколько раз я тратил время на отладку, исходя из предположения, что я знаю, что такое данные, полагаясь на то, что я думаю , что это данные. Как говорит @balderman, Outlook_response_parsed = Outlook_response.json(); print(Outlook_response_parsed); Outlook_data = Outlook_response_parsed['symbols'] чтобы быть абсолютно уверенным, какие данные вызывают ошибку.

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

Ответ №1:

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

 try:
    Outlook_data = Outlook_response.json()['symbols']
except:
    print("An error has occurred while getting the data. Please try again later.")
 

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

1. Я не знаю, почему кто-то проголосовал против этого ответа, потому что то, что в нем говорится, правильно. Во время очистки очень часто не получают ответа, и это может быть вызвано различными причинами (например, тайм-ауты, обнаружение ботов на веб-сайте и блокировка вас…). Разработчик несет ответственность за то, чтобы признать это и справиться с этими ситуациями.

2. полностью согласен с этим ответом, а также с другими ответами ,

3. Если бы ответ не был получен, вы бы TimeoutError получили ответ или что-то в этом роде ConnectionError . Если сервер вернет пустой ответ или что-то, что не является допустимым JSON, вы получите что-то вроде JSONDecodeError . Если бы ответом была строка null , вы бы получили TypeError . Сообщение об KeyError ошибке от OP может быть вызвано в этой строке только в том случае, если соединение было успешным, ответ был получен и является допустимым JSON словаря (и в этом словаре отсутствует symbols ключ), что означает, что первое предложение этого ответа явно неверно.

4. Кроме того: игнорирование ошибки в операции, которая , по-видимому, необходима для дальнейших вычислений, вряд ли является решением проблемы, если только OP явно не отмечает, что это случайная операция, в которой ошибка игнорируется; и голый except , улавливающий любые и все ошибки, является антипаттером и почти никогда не должен использоваться.

5. @Amadan, я согласен с вашими комментариями. Я неправильно сформулировал свой комментарий, в ответе есть некоторые недостатки, но мне не понравилось, что кто — то дал ответ, который, по крайней мере, показал возможное направление (т. Е. Используйте try/except), не комментируя, почему и не предлагая лучшего решения . Спасибо вам за ценные подробности.

Ответ №2:

это может сработать для вас :

     Request = 'https://www.myfxbook.com/api/login.json?email=usernameamp;password=password'
    response = requests.get(Request, verify = False)
    data = response.json()
    Session = data['session']
    path = ('https://www.myfxbook.com/api/get-community-outlook.json?session='   Session)
    Outlook_response = requests.get(path, verify = False)
    Outlook_data = Outlook_response.json()['symbols']
 

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

например :

 headers = {
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
Outlook_response = requests.get(Outlook, headers=headers)
Outlook_data = Outlook_response.json()['symbols']
 

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

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

2. попробую обновленный ответ и обновлю здесь, как это происходит