SPB Git forge

spb/job-ka

Public
229commits 1branches 0releases
38.1 MBsize
maindefault branch
1 h agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%

[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)

Simon-Pierre Boucher committed 15 days ago (Sep 9, 2026) parent e45adfd

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