Comment extraire les annonces Craigslist : véhicules, locations et emplois
Craigslist est une mine d'or de données protégée par des limites de taux IP agressives. Voici la structure d'URL par ville, le calcul de pagination de 120 par page, le raccourci RSS que la plupart des gens manquent, et la configuration de proxy qui vous garde hors de la liste noire.
Craigslist contient une énorme quantité de données publiques utilisables — voitures d'occasion, locations d'appartements, emplois, objets à vendre, services — réparties sur des centaines de sites de villes. C'est aussi un mur de CAPTCHAs et d'interdictions IP pour les débutants, car Craigslist limite sévèrement par adresse IP. La bonne nouvelle : la structure d'URL du site est simple et prévisible, il y a un raccourci RSS que la plupart des guides omettent, et le problème de blocage est presque entièrement un problème d'hygiène IP. Ce guide couvre le modèle d'URL par ville, le calcul de pagination, le parsing, la route RSS, et la configuration de proxy qui garde un extracteur hors de la liste noire. Extraire pour un usage personnel ou de recherche, respecter les conditions de Craigslist, et considérer cela comme une information générale plutôt qu'un conseil juridique.
Le modèle d'URL est tout le jeu
Craigslist se divise par sous-domaine de ville et code de catégorie, et tout le reste est des paramètres de requête. Apprenez la forme une fois et vous pouvez cibler n'importe quelle ville et section : https://{city}.craigslist.org/search/{category}?query={q}. Les codes de catégorie sont courts — sss pour tout ce qui est à vendre, cto pour les voitures par propriétaire, apa pour les appartements, ggg pour les emplois. Ajoutez min_price, max_price et d'autres filtres en tant que paramètres. La pagination utilise le paramètre s, et chaque page affiche 120 résultats — donc la page deux est s=120, la page trois est s=240, et ainsi de suite.
import requests
from bs4 import BeautifulSoup
PROXY = "http://USER:PASS@rotating.quantumproxies.io:8000"
PROXIES = {"http": PROXY, "https": PROXY}
UA = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36")
def build_url(city, category, query, page=0, min_price=None, max_price=None):
base = f"https://{city}.craigslist.org/search/{category}"
params = [f"query={query}"]
if min_price: params.append(f"min_price={min_price}")
if max_price: params.append(f"max_price={max_price}")
if page: params.append(f"s={page * 120}") # 120 results per page
return base + "?" + "&".join(params)
url = build_url("minneapolis", "cto", "bmw", page=0, max_price=8000)
r = requests.get(url, headers={"User-Agent": UA}, proxies=PROXIES, timeout=20)
Analyser les annonces
Les lignes de résultats de recherche sont marquées avec un ensemble stable de classes — le bloc d'annonce est .result-info, avec .result-title, .result-price et .result-date à l'intérieur. Protégez chaque champ, car toutes les annonces n'ont pas un prix :
def parse_listings(html):
soup = BeautifulSoup(html, "html.parser")
out = []
for row in soup.select(".result-info"):
title_el = row.select_one(".result-title")
price_el = row.select_one(".result-price")
date_el = row.select_one(".result-date")
if not title_el:
continue
out.append({
"title": title_el.get_text(strip=True),
"url": title_el.get("href"),
"price": price_el.get_text(strip=True) if price_el else None,
"date": date_el.get("datetime") if date_el else None,
})
return out
listings = parse_listings(r.text)
print(len(listings), "listings on this page")
Pour des enregistrements plus riches — kilométrage d'une voiture, chambres d'une location — suivez chaque URL d'annonce et analysez la page de détails. Cela double votre nombre de requêtes, c'est donc exactement là où le rythme et la rotation commencent à compter.

Le raccourci RSS que la plupart des guides omettent
Craigslist n'a pas d'API publique générale, mais il expose un flux RSS pour les résultats de recherche — ajoutez &format=rss à n'importe quelle URL de recherche et vous obtenez un flux XML structuré au lieu de HTML à analyser. C'est plus léger, moins susceptible de déclencher les heuristiques anti-bot que de charger à plusieurs reprises la page complète des résultats, et idéal pour la surveillance : interrogez une recherche enregistrée selon un calendrier et comparez pour les nouveaux éléments. Il renvoie moins de champs que la page HTML (titre, lien, horodatage), donc utilisez-le pour la surveillance de fraîcheur et revenez au HTML lorsque vous avez besoin de prix et de détails.
import feedparser
# Any Craigslist search becomes a feed with &format=rss
feed_url = build_url("sfbay", "apa", "loft", max_price=3500) + "&format=rss"
raw = requests.get(feed_url, headers={"User-Agent": UA}, proxies=PROXIES, timeout=20)
feed = feedparser.parse(raw.content)
for entry in feed.entries[:5]:
print(entry.updated, entry.title, entry.link)
Pourquoi Craigslist vous bannit, et comment ne pas être banni
Craigslist empile plusieurs défenses, mais elles partagent une racine : il suit les requêtes par adresse IP et bloque les adresses qui le sollicitent trop. Les mesures spécifiques sont la limitation de taux IP, les défis CAPTCHA sur le trafic suspect, la surveillance de l'User-Agent, le suivi de session, et les interdictions IP temporaires. Chacune d'elles est vaincue en ressemblant à de nombreux visiteurs ordinaires plutôt qu'à une machine implacable.
- Faites tourner les IP et répartissez la charge — une seule IP parcourant une ville est la voie la plus rapide vers une interdiction. La rotation par requête à travers un pool résidentiel signifie qu'aucune sortie ne semble anormale.
- Rythmez les requêtes — 1-2 requêtes par seconde est un plafond sûr pour les petites exécutions ; ajoutez du jitter et reculez dès que vous voyez un CAPTCHA ou un 403.
- Faites tourner l'User-Agent — un UA constant ou par défaut est un signe ; variez-le et gardez-le à jour.
- Une session par ville — commencez de nouveaux cookies par ville ou par exécution plutôt que de transporter une identité unique partout.
Parce que les interdictions sont basées sur l'IP, l'IP de sortie fait la majeure partie du travail. Un pool de proxies résidentiels propre ressemble à de vraies connexions domestiques, et la rotation par requête répartit une exploration multi-villes si finement que les compteurs par IP de Craigslist ne se déclenchent jamais. Si vous collectez à travers de nombreuses villes, notre guide sur la résolution des limites de taux 429 couvre le côté rythme et budget de concurrence, et la checklist anti-interdiction lie le tout ensemble.
Extraire Craigslist sur des IPs résidentielles propres
Évoluer à travers les villes
La véritable puissance des données Craigslist est la comparaison inter-villes — la même voiture d'occasion ou location tarifée à travers une douzaine de métropoles. Bouclez votre liste de villes, liez une sortie rotative fraîche par ville, limitez la concurrence, et stockez la ville avec chaque enregistrement. Pour la recherche de véhicules et de locations spécifiquement, les mêmes modèles alimentent un pipeline de comparaisons ; consultez nos guides sur l'extraction des annonces de voitures et les données immobilières pour transformer les annonces brutes en signaux de marché.

Questions fréquemment posées
Pouvez-vous extraire Craigslist ?
Oui — les pages de recherche et d'annonces publiques sont extractibles, et Craigslist expose même un flux RSS pour les recherches. L'obstacle est la limitation de taux agressive par IP, pas le parsing. Faites tourner les IPs résidentielles, rythmez les requêtes à 1-2 par seconde, et vous pouvez collecter des données sur les véhicules, les locations, les emplois et les objets à vendre de manière fiable. Respectez les conditions de Craigslist et n'extrayez que les données publiques.
Craigslist a-t-il une API ?
Il n'y a pas d'API de données publiques générale, mais chaque URL de recherche peut renvoyer un flux RSS en ajoutant &format=rss. Cela vous donne un flux XML structuré avec des titres, des liens et des horodatages — parfait pour surveiller les nouvelles annonces — tandis que les pages HTML contiennent les champs plus complets comme le prix et la description.
Comment éviter d'être banni par IP en extrayant Craigslist ?
Craigslist bannit par taux IP, donc les solutions concernent toutes la répartition et le ralentissement de la charge : faites tourner les IPs résidentielles par requête, maintenez 1-2 requêtes par seconde avec du jitter, faites tourner votre User-Agent, utilisez une session fraîche par ville, et reculez immédiatement lorsque vous voyez un CAPTCHA ou un 403. Une IP de centre de données martelant une ville est bannie le plus rapidement.
Comment fonctionne la pagination sur Craigslist ?
Craigslist affiche 120 résultats par page et pagine avec le paramètre de requête s comme un décalage. La page un omet s, la page deux est s=120, la page trois s=240, et ainsi de suite. Incrémentez par pas de 120 jusqu'à ce qu'une page renvoie moins de 120 résultats, ce qui marque la fin.
Craigslist est facile à lire et facile à être banni — et le second problème est entièrement une question d'hygiène IP. Maîtrisez le modèle d'URL, utilisez le RSS pour la surveillance, paginez par pas de 120, et routez tout à travers des IPs résidentielles rotatives à un rythme humain. Faites cela et les CAPTCHAs cessent simplement d'apparaître.