[ka2] fix connecteur res_cogir: retry (3 essais, backoff 5/10 s) du sitemap via Scrapfly — un raté transitoire (contenu vide, vu 2026-08-29 ~18:05) produisait un faux « 0 trouvé ok » (médiane 256); après 3 essais infructueux le connecteur lève une erreur franche, idem si 0 annonce extraite des fiches. Testé: 250 annonces (médiane 256), sitemap et parsing des fiches intacts
1 changed file +19 −3
modified
louka/connectors/res_cogir.py
+19 −3
@@ -19,6 +19,7 @@ from __future__ import annotations | ||
| 19 | 19 | |
| 20 | 20 | import html as _html |
| 21 | 21 | import re |
| 22 | +import time | |
| 22 | 23 | |
| 23 | 24 | from bs4 import BeautifulSoup |
| 24 | 25 | |
@@ -160,10 +161,22 @@ class ResidencesCogirConnector(BaseConnector): | ||
| 160 | 161 | return out |
| 161 | 162 | |
| 162 | 163 | def fetch(self) -> list[Listing]: |
| 164 | + # Un raté transitoire Scrapfly sur le sitemap (contenu vide, vu | |
| 165 | + # 2026-08-29) produisait un faux « 0 trouvé ok » : retry court, puis | |
| 166 | + # erreur franche plutôt qu'un zéro silencieux. | |
| 167 | + urls: list[str] = [] | |
| 168 | + for attempt in range(3): | |
| 169 | + xml = self._get_html(SITEMAP) | |
| 170 | + urls = sorted({u for u in re.findall(r"<loc>([^<]+)</loc>", xml) | |
| 171 | + if _RES_URL_RE.match(u) and "-ontario/" not in u}) | |
| 172 | + if urls: | |
| 173 | + break | |
| 174 | + if attempt < 2: | |
| 175 | + time.sleep(5 * (attempt + 1)) | |
| 176 | + else: | |
| 177 | + raise RuntimeError( | |
| 178 | + "sitemap sans URL de résidence après 3 essais Scrapfly") | |
| 163 | 179 | out: list[Listing] = [] |
| 164 | − xml = self._get_html(SITEMAP) | |
| 165 | − urls = sorted({u for u in re.findall(r"<loc>([^<]+)</loc>", xml) | |
| 166 | − if _RES_URL_RE.match(u) and "-ontario/" not in u}) | |
| 167 | 180 | for url in urls: |
| 168 | 181 | try: |
| 169 | 182 | html = self._get_html(url) |
@@ -171,4 +184,7 @@ class ResidencesCogirConnector(BaseConnector): | ||
| 171 | 184 | out.extend(self._parse_residence(url, html)) |
| 172 | 185 | except Exception: |
| 173 | 186 | continue |
| 187 | + if not out: | |
| 188 | + raise RuntimeError( | |
| 189 | + f"0 annonce extraite des {len(urls)} fiches du sitemap") | |
| 174 | 190 | return out |
| 175 | 191 | |