Сайдкар уже пережидает челлендж QRATOR и уже его снимает, но
_last_response_status[provider] остаётся статусом challenge-страницы: он
пишется один раз, из ответа первого goto, а _wait_out_pow_challenge его не
обновляет. Наружу уходило {"html": <нормальная карточка>, "status": 439}, и
клиент avito/detail.py браковал её по одному коду, не заглянув в HTML.
Прод, прогон 5606 — одни и те же объявления:
13:15:23 сайдкар: PoW снят за ~9000мс, догидрация ...8242031370
13:15:28 скрапер: BLOCKED #1 HTTP 439 ...8242031370
13:22:33 сайдкар: PoW снят за ~3000мс, догидрация ...8272722582
13:22:37 скрапер: BLOCKED #11 HTTP 439 ...8272722582
Минимум 3 блока из 7 в прогоне — выброшенные страницы, уже вытащенные.
Ловить «свежий» статус нечем: PoW-страница чинит себя своим
window.location-редиректом, Response на который мы не наблюдаем, а
собственный page.reload() включается только после 8с — при снятии за 1-9с он
обычно не срабатывает вовсе. Поэтому на успешном выходе статус сбрасывается в
None («неизвестен»), а не тащится протухшим. Клиент None блоком не считает
(detail.py: `if status is not None`) и падает на html-эвристики, которые на
настоящем контенте не срабатывают.
Правка в общей функции, поэтому чинит и ветку DomClick. Провал ожидания
(ChallengeTimeoutError) остаётся отказом: сброс стоит после всех raise.
Клиента править не потребовалось — test_3044_avito_439_classified_as_block
зелёный без изменений.
Тесты сайдкара: 219 passed.