diff --git a/tradein-mvp/scripts/local-avito-msk/.gitignore b/tradein-mvp/scripts/local-avito-msk/.gitignore new file mode 100644 index 00000000..a1e03960 --- /dev/null +++ b/tradein-mvp/scripts/local-avito-msk/.gitignore @@ -0,0 +1 @@ +runs/ diff --git a/tradein-mvp/scripts/local-avito-msk/collect.py b/tradein-mvp/scripts/local-avito-msk/collect.py index 8df91f48..7a2ff186 100644 --- a/tradein-mvp/scripts/local-avito-msk/collect.py +++ b/tradein-mvp/scripts/local-avito-msk/collect.py @@ -270,10 +270,32 @@ class Loader: await self._page.wait_for_selector('[data-marker="item"]', timeout=7_000) except Exception: # noqa: BLE001 — пустая/блочная страница разбирается ниже pass - html = await self._page.content() + html = await self._read_content() _guard(html, status) return html, status + async def _read_content(self, attempts: int = 4) -> str: + """page.content() с узким ретраем на гонку клиентской перенавигации. + + Авито дорисовывает выдачу после domcontentloaded, и content() иногда + попадает ровно в момент смены документа: "Unable to retrieve content + because the page is navigating and changing the content". Это НЕ отказ + площадки — гвардов не касается, поэтому ретраим только эту ошибку и + только её, а любую другую поднимаем как есть. + """ + last: Exception | None = None + for i in range(attempts): + try: + return await self._page.content() + except Exception as exc: # noqa: BLE001 — сузили проверкой текста ниже + if "page is navigating" not in str(exc): + raise + last = exc + print(f" content() поймал перенавигацию, попытка {i + 2}/{attempts}", + flush=True) + await asyncio.sleep(1.5) + raise RuntimeError(f"page.content() не отдал документ за {attempts} попыток") from last + # --- заливка в msk_raw -----------------------------------------------------