Не работает функция python
Делаю парсер, отслеживает удалённые винкоды на аукционе
Проблема:
Есть функция для сохранения удалённых винкодов (save_removed_vins
), на её вызове в def main()
код останавливается и дальше не работает.
def save_removed_vins(removed_vins, filename):
with lock:
try:
existing_removed_vins = load_removed_vins(filename)
if not removed_vins:
logging.info("Удалённых VIN-кодов для сохранения не найдено.")
return # Прерываем выполнение функции
existing_removed_vins.update(removed_vins)
# Создаём файл, если он отсутствует
if not os.path.exists(filename):
logging.info(f"Файл {filename} не найден. Создаём новый файл.")
# Сохраняем обновлённые VIN-коды в файл
with open(filename, "w", encoding="utf-8") as f:
json.dump(sorted(existing_removed_vins), f, ensure_ascii=False, indent=4)
logging.info(f"Сохранено {len(existing_removed_vins)} удалённых VIN-кодов в {filename}.")
except Exception as e:
logging.error(f"Ошибка сохранения удалённых VIN-кодов: {e}")
def main():
global processed_urls # Указываем, что используем глобальное множество
try:
# Проверяем, существует ли файл, и создаём его, если он отсутствует
if not os.path.exists(OUTPUT_FILE):
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
json.dump([], f, ensure_ascii=False, indent=4)
# Загружаем существующие VIN-коды из файла
existing_vins = load_from_json(OUTPUT_FILE)
all_new_vins = set()
# Получаем список брендов автомобилей
brands = get_car_brands()
if not brands:
logging.info("Нет марок для обработки. Пропускаем текущий цикл.")
return False # Нет данных для обработки
# Фильтруем бренды: Ford и Mercedes
target_brands = ["ford", "mercedes"]
selected_brand_urls = [url for url in brands if any(brand in url.lower() for brand in target_brands)]
if not selected_brand_urls:
logging.warning("Бренды Ford или Mercedes не найдены. Пропускаем текущий цикл.")
return False
# Обрабатываем каждую марку
for brand_url in selected_brand_urls:
brand_name = "Ford" if "ford" in brand_url.lower() else "Mercedes" # Устанавливаем правильное название бренда
logging.info(f"Начинаем обработку марки: {brand_name}")
# Получаем все модели для текущей марки
car_models = get_car_models(brand_url)
if not car_models:
logging.warning(f"Нет моделей для марки {brand_name}. Пропускаем.")
continue
# Фильтруем модели для Ford Focus или Mercedes
if brand_name == "Ford":
target_models = [model for model in car_models if "focus" in model[1].lower()]
elif brand_name == "Mercedes":
target_models = [model for model in car_models if "mercedes" in model[1].lower()]
if not target_models:
logging.warning(f"Модели для {brand_name} не найдены. Пропускаем текущий цикл.")
continue
# Многопоточная обработка моделей
with ThreadPoolExecutor(max_workers=THREADS) as executor:
for model_url, model_name in target_models:
logging.info(f"Начинаем парсинг для: {brand_name} {model_name}")
executor.submit(process_model, model_url, all_new_vins, brand_name, model_name)
# Сравниваем старые и новые VIN-коды
removed_vins = existing_vins - all_new_vins
if removed_vins:
logging.info(f"Найдено {len(removed_vins)} удалённых VIN-кодов.")
logging.info(f"VIN-Codes: {removed_vins}")
save_removed_vins(removed_vins, 'removed_vin.json') # Сохраняем удалённые VIN-коды
# Сохраняем новые VIN-коды в файл
save_to_json(all_new_vins, OUTPUT_FILE)
# Очищаем список обработанных URL
processed_urls.clear()
logging.info("Список обработанных URL очищен.")
return True # Успешное завершение
except Exception as e:
logging.error(f"Ошибка во время выполнения парсинга: {e}")
return False