[ka6] fix connecteur jobillico: un 410/404 sur une page détail (offre retirée entre le sitemap et la visite) n'avorte plus tout le sync — skip de l'offre; erreurs serveur/réseau ponctuelles → repli cache périmé (pattern guichet_emplois)
1 changed file +18 −2
modified
jobka/connectors/jobillico.py
+18 −2
@@ -5,7 +5,7 @@ | |||||
| 5 | # Fichier : jobka/connectors/jobillico.py | 5 | # Fichier : jobka/connectors/jobillico.py | ||
| 6 | # Rôle : Connecteur portail — Jobillico (grand portail d'emploi québécois). | 6 | # Rôle : Connecteur portail — Jobillico (grand portail d'emploi québécois). | ||
| 7 | # AGRÉGATEUR : moins autoritaire qu'une page carrière (dedup). | 7 | # AGRÉGATEUR : moins autoritaire qu'une page carrière (dedup). | ||
| 8 | −# Créé : 2026-08-18 Modifié : 2026-08-18 | 8 | +# Créé : 2026-08-18 Modifié : 2026-08-25 | ||
| 9 | # ============================================================================= | 9 | # ============================================================================= | ||
| 10 | """Portail Jobillico (jobillico.com). | 10 | """Portail Jobillico (jobillico.com). | ||
| 11 | 11 | ||||
@@ -23,6 +23,8 @@ from __future__ import annotations | |||||
| 23 | import os | 23 | import os | ||
| 24 | import re | 24 | import re | ||
| 25 | 25 | ||||
| 26 | +import requests | ||||
| 27 | + | ||||
| 26 | from ..schema import JobPosting, is_quebec_location | 28 | from ..schema import JobPosting, is_quebec_location | ||
| 27 | from .base import BaseConnector | 29 | from .base import BaseConnector | ||
| 28 | from . import _jsonld | 30 | from . import _jsonld | ||
@@ -78,7 +80,21 @@ class JobillicoConnector(BaseConnector): | |||||
| 78 | fresh[0] = True | 80 | fresh[0] = True | ||
| 79 | return self._fetch_detail(u) | 81 | return self._fetch_detail(u) | ||
| 80 | 82 | ||||
| 81 | − fields = self.detail(eid, key, _fn) | 83 | + try: | ||
| 84 | + fields = self.detail(eid, key, _fn) | ||||
| 85 | + except requests.HTTPError as exc: | ||||
| 86 | + code = getattr(exc.response, "status_code", 0) | ||||
| 87 | + if code in (404, 410): | ||||
| 88 | + # offre retirée entre le sitemap et la visite — | ||||
| 89 | + # normal et non bloquant : on saute cette offre | ||||
| 90 | + if fresh[0]: | ||||
| 91 | + details_used += 1 | ||||
| 92 | + continue | ||||
| 93 | + # erreur serveur ponctuelle (520…) : cache périmé, | ||||
| 94 | + # l'offre sera re-tentée au prochain cycle | ||||
| 95 | + fields = self.stale_detail(eid) | ||||
| 96 | + except (requests.ConnectionError, requests.Timeout): | ||||
| 97 | + fields = self.stale_detail(eid) | ||||
| 82 | if fresh[0]: | 98 | if fresh[0]: | ||
| 83 | details_used += 1 | 99 | details_used += 1 | ||
| 84 | else: | 100 | else: | ||
| 85 | 101 | ||||