class ScraperError(Exception): """Базовое исключение скрапера.""" class AntiBotDetectedError(ScraperError): """Вызывается, когда сайт блокирует автоматизацию.""" class SiteStructureChangedError(ScraperError): """Вызывается, когда структура страницы изменилась и данных не хватает.""" class ListingResumeError(ScraperError): """Вызывается, когда resume по checkpoint больше недостижим.""" class ScraperAbortedError(ScraperError): """Вызывается при внешнем прерывании (например, потеря Celery lock'а)."""