#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. попробую обновленный ответ и обновлю здесь, как это происходит