[ka2] fix connecteur realtor_ag_ca: coupures réseau transitoires vers api.scrapfly.io (ConnectTimeout 180 s, 2 syncs de suite) — un seul raté tuait les ~11 appels du fetch (0 fiche). Retry ×3 avec pause (20/40 s) sur ConnectionError/Timeout dans scrapfly(). Test réel : 2168 fiches (médiane 2160)
1 changed file +18 −0
modified
immoka/connectors/realtor_ca.py
+18 −0
@@ -36,6 +36,9 @@ from __future__ import annotations | ||
| 36 | 36 | |
| 37 | 37 | import json |
| 38 | 38 | import os |
| 39 | +import time | |
| 40 | + | |
| 41 | +import requests | |
| 39 | 42 | |
| 40 | 43 | from . import _detailutil as du |
| 41 | 44 | from .base import BaseConnector |
@@ -81,6 +84,21 @@ class RealtorCaConnector(BaseConnector): | ||
| 81 | 84 | # external_id -> Id interne Realtor (PropertyID requis par l'API détail) |
| 82 | 85 | self._prop_ids: dict[str, str] = {} |
| 83 | 86 | |
| 87 | + def scrapfly(self, url: str, **kw) -> dict: | |
| 88 | + # Coupures réseau transitoires vers api.scrapfly.io (ConnectTimeout | |
| 89 | + # 180 s observé 2×, 2026-09-13) : sans retentative, un seul raté tue | |
| 90 | + # les ~11 appels du sync → 0 fiche. On retente avec pause avant | |
| 91 | + # de laisser l'exception remonter. | |
| 92 | + last: Exception | None = None | |
| 93 | + for attempt in range(3): | |
| 94 | + try: | |
| 95 | + return super().scrapfly(url, **kw) | |
| 96 | + except (requests.ConnectionError, requests.Timeout) as exc: | |
| 97 | + last = exc | |
| 98 | + if attempt < 2: | |
| 99 | + time.sleep(20 * (attempt + 1)) | |
| 100 | + raise last # type: ignore[misc] | |
| 101 | + | |
| 84 | 102 | def _search(self, shard: tuple, page: int) -> dict: |
| 85 | 103 | _, south, west, north, east = shard |
| 86 | 104 | body = "&".join(f"{k}={v}" for k, v in { |
| 87 | 105 | |