[ka2] fix connecteur location_saguenay: cache-buster sur les retries — le retry simple relisait 3 fois la même copie cachée sans menu. Le sync du 2026-09-08 03:31 a échoué honnêtement (RuntimeError « menu introuvable après 3 essais », ok=0) alors que le site est sain : reproduit en live, la page d'accueil (200, 92 Ko) contient bien le menu « Logements disponibles » et ses 21 fiches. Cause probable : le site sert ses pages via un cache HTTP (cache-control: max-age=600, vary: User-Agent) — une variante partielle figée pour l'UA LouKaBot faisait échouer les 3 essais du retry de 2026-08-29 sur la MÊME copie (fenêtre ~30 s « 10 s de throttling), insuffisant contre un cache de 10 min. Fix (changement d'angle, même pattern que brio 2c52899) : les essais 2 et 3 passent un paramètre cache-buster (?lkb=<ts>) pour forcer un rendu frais ; l'erreur franche après 3 essais est conservée. Testé : LIST_URL?lkb=… → menu présent ; run.py sync location_saguenay → found=21 ok (médiane 21), pm2 restart lou-ka-sync, site :8095 → 200.
1 changed file +8 −2
modified
louka/connectors/location_saguenay.py
+8 −2
@@ -18,6 +18,7 @@ from __future__ import annotations | ||
| 18 | 18 | |
| 19 | 19 | import hashlib |
| 20 | 20 | import re |
| 21 | +import time | |
| 21 | 22 | |
| 22 | 23 | from bs4 import BeautifulSoup |
| 23 | 24 | |
@@ -41,8 +42,13 @@ class LocationSaguenayConnector(BaseConnector): | ||
| 41 | 42 | # vu 2026-08-29) produisait un faux « 0 trouvé ok » : retry court, puis |
| 42 | 43 | # erreur franche plutôt qu'un zéro silencieux. Le throttling de get() |
| 43 | 44 | # (10 s) espace naturellement les essais. |
| 44 | − for _ in range(3): | |
| 45 | − html = self.get(LIST_URL).text | |
| 45 | + # Vu 2026-09-08 : le site cache ses pages (cache-control max-age=600, | |
| 46 | + # vary: User-Agent) — une variante partielle figée pour notre UA fait | |
| 47 | + # échouer les 3 essais sur la MÊME copie. Les essais 2 et 3 passent | |
| 48 | + # donc un cache-buster pour forcer un rendu frais (pattern brio). | |
| 49 | + for attempt in range(3): | |
| 50 | + params = {"lkb": int(time.time())} if attempt else None | |
| 51 | + html = self.get(LIST_URL, params=params).text | |
| 46 | 52 | soup = BeautifulSoup(html, "html.parser") |
| 47 | 53 | root = self._find_menu_root(soup) |
| 48 | 54 | if root is not None: |
| 49 | 55 | |