Я разрабатываю алгоритм машинного обучения для прогнозирования температуры в моем городе. Я использую wunderground API для получения данных. Итак, в этом фрагменте кода, где я выполняю запрос API:
def extract_weather_data(url, api_key, target_date, days):
records = []
for _ in range(days):
request = BASE_URL.format(API_KEY, target_date.strftime('%Y%m%d'))
response = requests.get(request)
print request
if response.status_code == 200:
data = response.json()['history']['dailysummary'][0]
records.append(DailySummary(
date=target_date,
meantempm=data['meantempm'],
meandewptm=data['meandewptm'],
meanpressurem=data['meanpressurem'],
maxhumidity=data['maxhumidity'],
minhumidity=data['minhumidity'],
maxtempm=data['maxtempm'],
mintempm=data['mintempm'],
maxdewptm=data['maxdewptm'],
mindewptm=data['mindewptm'],
maxpressurem=data['maxpressurem'],
minpressurem=data['minpressurem'],
precipm=data['precipm']))
time.sleep(6)
target_date += timedelta(days=1)
return records
records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
Я получаю эту ошибку после запроса 3-4:
Traceback (most recent call last):
File "data.py", line 45, in <module>
records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
File "data.py", line 26, in extract_weather_data
data = response.json()['history']['dailysummary'][0]
File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)
Как я могу это исправить?
Спасибо вам большое!
Золотое правило, когда речь идет о HTTP - запросах (API или нет, и независимо от ожидаемого ответа типа контента) является то, что все может пойти не так, во многих отношениях, и в любое время, и что они ошибутся один день или иначе самый неожиданным образом, так если вы надеетесь иметь десятку надежной клиентской программы, вы должны быть готовы справиться с любым возможным результатом.
Чаще всего это означает, что запросы на обработку вызовов в обработчиках try/except также проверяются, проверяя код состояния ответа, тип контента и эффективный контент (вместо того, чтобы слепо предположить, что вы получили то, что вы просили), и в зависимости от значения исключения/неожиданного ответа стоит ли повторять запрос пару раз (с увеличением задержки между повторениями), прежде чем сдаваться (некоторые условия ошибки могут быть временными) или просто отказаться немедленно. Во всех случаях вы также хотите, чтобы вы позволили пользователю узнать, что пошло не так, с максимально возможной информацией (запрос, ответ, если у вас есть один, исключение и полная трассировка), когда вы решите отказаться.
Из последней части вашей ошибки:
ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)
это похоже на то, что данные, которые вы получаете, находятся не в правильном формате - либо это не JSON, либо это не совсем так, как ожидает Python. Если вы просто печатаете response.content
или получаете данные через что-то вроде Postman, это может помочь вам решить, где проблема.
В зависимости от того, что вы получаете, вы можете "исправить" ответ, прежде чем разбирать его как JSON, или вам может понадобиться проанализировать его другим способом.