[ka6] fix connecteur groupe_bellemare: retry avec ré-amorçage de session Scrapfly dans la plateforme njoyn — échec transitoire du 2026-09-09 12h26 (Scrapfly a renvoyé 0 octet aux 2 essais, bellemare et groupe_master tombés ensemble, repartis seuls au sync suivant) ; le retry unique de _fetch_listing rejouait la MÊME session Scrapfly (proxy collant + cookies), donc le même proxy défaillant ; désormais 3 essais, backoff 10-20 s, session Scrapfly ré-amorcée entre les essais (nouveau proxy) ; syncs rejoués : bellemare 31 offres (médiane 31.0), groupe_master 15 (médiane 14.0)
1 changed file +11 −5
modified
jobka/connectors/njoyn.py
+11 −5
@@ -302,8 +302,16 @@ class NjoynConnector(BaseConnector): | ||
| 302 | 302 | anti-bot (Scrapfly en échec renvoie "" — voir base.get_scrapfly) ne |
| 303 | 303 | doit JAMAIS passer pour un babillard vide. Toute page Njoyn légitime, |
| 304 | 304 | même sans offre, contient le formulaire xweb.asp — sinon on retente |
| 305 | − une fois puis on lève une erreur (sync en échec, pas « 0 trouvé »).""" | |
| 306 | − for attempt in range(2): | |
| 305 | + (3 essais, backoff 10-20 s) puis on lève une erreur (sync en échec, | |
| 306 | + pas « 0 trouvé »). ⚠ Entre deux essais, ré-amorcer la session | |
| 307 | + Scrapfly : la session colle cookies + IP de proxy, donc retenter sur | |
| 308 | + la même session rejoue le même proxy défaillant (constaté 2026-09-09 | |
| 309 | + 12h26 : bellemare et groupe_master tombés ensemble, 0 octet aux deux | |
| 310 | + essais de la même session, repartis au sync suivant).""" | |
| 311 | + for attempt in range(3): | |
| 312 | + if attempt: | |
| 313 | + time.sleep(10 * attempt) | |
| 314 | + self._sf_session_name = None # nouvelle session = nouveau proxy | |
| 307 | 315 | page = self._html(self._url("joblisting")) |
| 308 | 316 | if _MAINT_RE.search(page): |
| 309 | 317 | # Maintenance plateforme : inutile de retenter dans 10 s (la |
@@ -324,10 +332,8 @@ class NjoynConnector(BaseConnector): | ||
| 324 | 332 | or self._parse_rows(page)) |
| 325 | 333 | if items or re.search(r"xweb\.asp", page, re.I): |
| 326 | 334 | return page, items |
| 327 | − if attempt == 0: | |
| 328 | − time.sleep(10) | |
| 329 | 335 | raise RuntimeError( |
| 330 | − f"njoyn {self.source_id}: page liste illisible " | |
| 336 | + f"njoyn {self.source_id}: page liste illisible après 3 essais " | |
| 331 | 337 | f"(vide ou anti-bot, {len(page)} octets) — sync avorté") |
| 332 | 338 | |
| 333 | 339 | def fetch(self) -> list[JobPosting]: |
| 334 | 340 | |