Scraping

Surveiller un pipeline de scraping : les métriques qui vous disent qu'il casse avant vos données

Un scraper échoue en silence : le cron se déclenche, les logs disent 200, les données se gâtent. Les métriques et alertes qui l'attrapent dans le pipeline, pas au conseil.

Chris Collins

Chris Collins

4 août 2026 · 8 min de lecture

Un pipeline de scraping échoue rarement dans un fracas. Le cron continue de se déclencher, le processus continue de sortir avec zéro, les logs sont pleins de 200 OK, et tout a l’air sain jusqu’à ce que quelqu’un à trois équipes de distance remarque que les chiffres d’un rapport ont dérapé il y a une semaine. À ce moment-là vous avez perdu des jours de données et ne pouvez pas en recollecter la plupart, parce que les pages sont passées à autre chose.

C’est la jambe observabilité de faire tourner la collecte à l’échelle. Si Kubernetes vous donne l’orchestration et que la validation par réponse attrape la page mauvaise individuelle, le monitoring est la couche qui surveille toute la flotte dans le temps et vous dit qu’une cible s’est retournée contre vous avant que la corruption n’atteigne votre entrepôt. Voici les métriques qui comptent, comment leur faire une ligne de base, et comment alerter sans se noyer dans le bruit.

Les logs ne sont pas du monitoring

La première chose à accepter est que les logs et les codes de sortie ne vous disent presque rien sur si le scraping marche. Un processus qui sort avec zéro et logue un 200 vous a dit qu’il a fait une requête et obtenu une réponse, pas qu’il a obtenu la bonne réponse. Comme couvert dans détecter du contenu bloqué ou faux, une page de blocage, une coquille tronquée, et de vraies données reviennent toutes en 200. Monitorer signifie des métriques : des nombres émis par requête, agrégés dans le temps, ventilés par dimension, et comparés à une ligne de base. C’est une discipline différente du logging, et c’est celle qui attrape l’échec silencieux.

Les métriques qui comptent

Émettez celles-ci par requête, étiquetées par hôte cible et par géo de sortie, et agrégez-les. Rien de tout cela n’a besoin de machine learning, juste des compteurs et des histogrammes.

Taux de succès. La métrique vedette, et celle que tout le monde définit mal. Le succès n’est pas HTTP 200, c’est passer la validation : la réponse contenait le champ ou l’élément qu’une vraie page a toujours. Suivez le pourcentage de requêtes qui passent votre assertion de contenu, par hôte cible. Une baisse sur un hôte tandis que les autres restent stables, c’est cet hôte qui change de comportement envers vous, et c’est le nombre le plus important de votre tableau de bord.

Taux de blocage. La part des réponses que votre couche de détection signale comme blocages doux ou défis. C’est votre alerte précoce qu’une cible est devenue plus agressive ou que votre réputation de pool a glissé. Un taux de blocage qui grimpe est ce qui précède un bannissement dur, alors surveillez sa pente, pas juste sa valeur, et corrélez-le avec la réputation d’IP et les blocages que vous essayez d’éviter.

Percentiles de latence. Suivez p50, p95 et p99, jamais la moyenne, qui cache la queue lente où vivent les vrais problèmes. Un p95 qui monte signifie qu’une cible vous étrangle, qu’un pool se dégrade, ou qu’une route est congestionnée. C’est la vue au niveau de la flotte du même signal derrière les timeouts de requête et le réglage de latence.

Taux de remplissage des champs. Pour chaque champ que vous extrayez, le pourcentage d’enregistrements où il s’est vraiment peuplé. C’est votre canari de qualité de données : un champ qui était rempli à 98 pour cent hier et à 20 pour cent aujourd’hui n’est pas devenu plus rare, vous avez commencé à recevoir des pages tronquées ou partielles. Le taux de remplissage attrape une dégradation que le taux de succès peut manquer.

Débit face au backlog. Requêtes et enregistrements par minute, surveillés face à la profondeur de votre file de travail. Un débit qui monte avec un backlog qui rétrécit est sain. Un débit plat avec un backlog qui croît signifie que vous prenez du retard et devez scaler horizontalement, le signal qui alimente l’autoscaling sur la profondeur de file.

Fraîcheur. À quel point l’enregistrement le plus récent est vieux pour chaque source. Une source dont la fraîcheur cesse d’avancer a cessé de produire en silence, même si toute autre métrique a l’air bien. C’est celle qui attrape un flux qui est mort sans erreur.

Coût par enregistrement. Bande passante et dépense divisées par les enregistrements utilisables collectés. Au-delà de l’efficacité, c’est un détecteur d’anomalies : un bond soudain en octets-par-enregistrement signifie souvent que vous téléchargez des pages de blocage ou du déchet gonflé au lieu de données, donc un problème de santé apparaît d’abord comme un pic de coût. Il garde aussi la facture de bande passante honnête.

Taux de réessai et taxonomie des erreurs. Tentatives par enregistrement réussi, ventilées par type d’échec : timeout, 429, connection reset, DNS, blocage détecté. La forme de vos erreurs est un diagnostic. Un pic de 429 signifie que vous poussez une cible trop fort ; un pic de connection resets pointe vers la couche réseau ou proxy ; un pic de blocages détectés pointe vers la réputation. Un seul compteur d’erreurs agrégé vous dit que quelque chose ne va pas ; la taxonomie vous dit quoi.

Ligne de base par cible, alertez sur l’écart

L’erreur qui rend le monitoring inutile est d’alerter sur des seuils absolus. Un taux de blocage de 3 pour cent est parfaitement normal pour un site et un feu à cinq alarmes pour un autre. Un p95 de deux secondes est bien pour une page lourde et terrible pour une API légère. Les seuils absolus soit manquent les vrais problèmes, soit crient au loup constamment, et la fatigue d’alerte signifie que la seule vraie page finit par être ignorée.

Faites une ligne de base de chaque métrique par hôte cible, puis alertez sur l’écart par rapport à cette ligne de base : une baisse soutenue du taux de succès, un taux de blocage qui grimpe plus vite que sa bande normale, un p95 qui a doublé par rapport à la semaine dernière. Le taux de changement et l’écart par cible attrapent les choses qui comptent et restent silencieux quand un site est simplement différent d’un autre. Alertez sur un écart soutenu plutôt que sur une seule mauvaise minute, et réservez le fait d’appeler un humain à ce qui en a vraiment besoin, tout le reste peut être un tableau de bord ou un résumé.

# Émettez par réponse ; agrégez en une série temporelle, dimensionnée par host + geo.
def record(metrics, host, geo, resp, validation):
tags = {"host": host, "geo": geo}
metrics.incr("requests", tags)
metrics.incr("success" if validation.ok else "failure", tags)
if validation.blocked:
metrics.incr("blocked", tags) # taux de blocage = blocked / requests
metrics.observe("latency_ms", resp.elapsed_ms, tags) # histogramme -> p50/p95/p99
metrics.observe("bytes", resp.size, tags) # -> cout/octets par enregistrement
for field, present in validation.fields.items():
metrics.incr(f"field.{field}." + ("filled" if present else "empty"), tags)

Canaris et la dimension proxy

Deux choses aiguisent tout ce qui précède. D’abord, faites tourner des canaris : récupérez une page dont vous connaissez déjà le contenu correct, selon un horaire et par géo, et affirmez qu’elle correspond toujours. Un canari bascule de sain à cassé à l’instant où une cible change, sans attendre qu’un lent déclin des métriques agrégées devienne évident, et le faire par géo attrape un site qui bloque les IP de sortie d’un pays tout en laissant un autre intact.

Ensuite, dimensionnez chaque métrique par géo de sortie et pool, pas juste par cible. Les problèmes sont fréquemment localisés : les IP d’un pays se font défier tandis que le reste passe sans problème, ou un segment d’un pool se dégrade. Sans la ventilation par géo et pool, cela apparaît comme un creux doux et déroutant dans la moyenne globale au lieu du signal net et actionnable qu’il est vraiment. Comme la qualité du pool est un indicateur avancé du taux de blocage, surveiller le succès et le taux de blocage par pool vous renseigne sur un pool résidentiel qui se dégrade avant qu’il ne tire toute la course vers le bas, et vous donne l’option de déplacer la charge ou de basculer avant que les utilisateurs ne le remarquent.

En résumé

Un pipeline de scraping qui n’est pas surveillé est un pipeline qui échoue en silence et cher. Instrumentez le succès comme validation-passée plutôt qu’HTTP 200, et suivez le taux de blocage, les percentiles de latence, le taux de remplissage des champs, le débit face au backlog, la fraîcheur, le coût par enregistrement, et une taxonomie d’erreurs correcte, chacun ventilé par hôte cible et géo de sortie. Faites une ligne de base de chaque métrique par cible et alertez sur l’écart par rapport à cette ligne de base, pas sur des nombres absolus, pour attraper les vraies casses sans vous noyer dans les fausses. Ajoutez des canaris pour une alerte précoce instantanée. Faites cela et l’échec silencieux cesse d’être silencieux : vous l’apprenez dans le pipeline, en minutes, au lieu d’un rapport en aval, en semaines.

Comme le taux de blocage et la latence remontent tous deux à la qualité des IP par lesquelles vous sortez, un pool résidentiel propre est ce qui garde ces métriques saines au départ, et la tarification au Go fait du coût par enregistrement que vous surveillez maintenant quelque chose que vous pouvez réellement optimiser.

Prêt à commencer ?

Essayez les proxies résidentiels de Shifter, 205M+ IPs, 195+ pays, à partir de $0.75/GB.

Commencer