diff --git a/volk_load.py b/volk_load.py index e62c99a..a63eb87 100644 --- a/volk_load.py +++ b/volk_load.py @@ -157,27 +157,51 @@ def load_categories(): log_message(f"Запрос описания для категории {category_id} из {desc_url}") with urlopen(desc_url) as response: - desc_response = json.loads(response.read().decode()) + # Явно указываем кодировку UTF-8 при декодировании + raw_data = response.read() + try: + decoded_data = raw_data.decode('utf-8') + except UnicodeDecodeError as e: + error_msg = f"Ошибка декодирования ответа для категории {category_id}: {e}. Попытка декодирования как latin-1." + log_message(error_msg, "WARNING") + decoded_data = raw_data.decode('latin-1') + + try: + desc_response = json.loads(decoded_data) + except json.JSONDecodeError as e: + error_msg = f"Ошибка парсинга JSON для категории {category_id}: {e}. Первые 500 символов ответа: {decoded_data[:500]}" + log_message(error_msg, "ERROR") + print(error_msg) + # Пропускаем эту категорию и продолжаем обработку + continue # Проверка версии API api_version = desc_response.get('api_version') if api_version != VOLK_API_VERSION: - error_msg = f"Несовпадение версии API при загрузке описания категории {category_id}: получена версия '{api_version}', ожидается '{VOLK_API_VERSION}'. Обработка остановлена." + error_msg = f"Несовпадение версии API при загрузке описания категории {category_id}: получена версия '{api_version}', ожидается '{VOLK_API_VERSION}'. Пропуск категории." log_message(error_msg, "ERROR") print(error_msg) - # Останавливаем обработку - break + # Пропускаем эту категорию и продолжаем обработку + continue # Проверка наличия блока data if 'data' not in desc_response: - error_msg = f"В JSON ответе для категории {category_id} отсутствует блок 'data'. Обработка остановлена." + error_msg = f"В JSON ответе для категории {category_id} отсутствует блок 'data'. Пропуск категории." log_message(error_msg, "ERROR") print(error_msg) - # Останавливаем обработку - break + # Пропускаем эту категорию и продолжаем обработку + continue desc_data = desc_response['data'] + # Проверка типа desc_data - должен быть словарём + if not isinstance(desc_data, dict): + error_msg = f"Блок 'data' для категории {category_id} не является словарём (тип: {type(desc_data)}). Пропуск категории." + log_message(error_msg, "ERROR") + print(error_msg) + # Пропускаем эту категорию и продолжаем обработку + continue + # Получаем description из блока data description = desc_data.get('description') # Если description пустое, None или отсутствует, обнуляем поле в БД @@ -198,11 +222,14 @@ def load_categories(): log_message(f"Описание для категории {category_id} обнулено (пустое или отсутствует)") except Exception as e: - error_msg = f"Ошибка при загрузке описания для категории {category_id}: {e}" + error_msg = f"Ошибка при загрузке описания для категории {category_id}: {type(e).__name__}: {e}" log_message(error_msg, "ERROR") print(error_msg) - # Останавливаем обработку при ошибке - break + import traceback + traceback_str = traceback.format_exc() + log_message(f"Трассировка ошибки для категории {category_id}:\n{traceback_str}", "ERROR") + # Пропускаем эту категорию и продолжаем обработку остальных + continue log_message(f"Завершение загрузки описаний. Обновлено описаний: {desc_updated_count}.")