Hoe Craigslist-advertenties te scrapen: Voertuigen, Verhuur en Klussen
Craigslist is een datagoudmijn bewaakt door agressieve IP-limieten. Hier is de per-stad URL-structuur, de 120-per-pagina paginering, de RSS-snelkoppeling die de meeste mensen missen, en de proxy-instelling die je van de banlijst houdt.
Craigslist bevat een enorme hoeveelheid bruikbare openbare data — tweedehands auto's, appartementverhuur, klussen, te koop aangeboden items, diensten — verspreid over honderden stadswebsites. Het is ook een beginnersmuur van CAPTCHA's en IP-bans, omdat Craigslist hard rate-limiteert per IP-adres. Het goede nieuws: de URL-structuur van de site is eenvoudig en voorspelbaar, er is een RSS-snelkoppeling die de meeste gidsen overslaan, en het blokkeerprobleem is bijna volledig een IP-hygiëneprobleem. Deze gids behandelt het per-stad URL-patroon, de paginering, het parsen, de RSS-route en de proxy-instelling die een scraper van de banlijst houdt. Scrape voor persoonlijk of onderzoeksgebruik, respecteer de voorwaarden van Craigslist, en beschouw dit als algemene informatie in plaats van juridisch advies.
Het URL-patroon is het hele spel
Craigslist splitst per stad subdomein en categoriecode, en al het andere zijn queryparameters. Leer de vorm eenmaal en je kunt elke stad en sectie targeten: https://{city}.craigslist.org/search/{category}?query={q}. Categoriecodes zijn kort — sss voor alles te koop, cto voor auto's van eigenaar, apa voor appartementen, ggg voor klussen. Voeg min_price, max_price en andere filters toe als parameters. Paginering gebruikt de s parameter, en elke pagina toont 120 resultaten — dus pagina twee is s=120, pagina drie is s=240, enzovoort.
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)
Het parsen van de advertenties
Zoekresultaatrijen zijn gemarkeerd met een stabiele set van klassen — het advertentieblok is .result-info, met .result-title, .result-price en .result-date binnenin. Beveilig elk veld, want niet elke advertentie heeft een prijs:
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")
Voor rijkere gegevens — kilometerstand van een auto, slaapkamers van een huurwoning — volg elke advertentie-URL en parse de detailpagina. Dat verdubbelt je aantal verzoeken, dus daar beginnen pacing en rotatie precies van belang te worden.

De RSS-snelkoppeling die de meeste gidsen overslaan
Craigslist heeft geen algemene openbare API, maar het biedt wel een RSS-feed voor zoekresultaten — voeg &format=rss toe aan elke zoek-URL en je krijgt een gestructureerde XML-feed in plaats van HTML om te parsen. Het is lichter, minder geneigd om anti-bot heuristieken te activeren dan herhaaldelijk de volledige resultatenpagina laden, en ideaal voor monitoring: poll een opgeslagen zoekopdracht op een schema en diff voor nieuwe items. Het retourneert minder velden dan de HTML-pagina (titel, link, tijdstempel), dus gebruik het voor versheidsmonitoring en val terug op HTML wanneer je prijs en detail nodig hebt.
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)
Waarom Craigslist je bant, en hoe je niet geband wordt
Craigslist stapelt verschillende verdedigingen, maar ze delen één wortel: het volgt verzoeken per IP-adres en blokkeert adressen die het te hard raken. De specifieke maatregelen zijn IP-rate limiting, CAPTCHA-uitdagingen bij verdacht verkeer, User-Agent monitoring, sessie tracking, en tijdelijke IP-bans. Elk van hen wordt verslagen door eruit te zien als veel gewone bezoekers in plaats van één meedogenloze machine.
- Roteer IP's en verdeel de belasting — een enkel IP dat door een stad bladert is de snelste route naar een ban. Per-verzoek rotatie over een residentieel pool betekent dat geen enkele exit er abnormaal uitziet.
- Tempo verzoeken — 1-2 verzoeken per seconde is een veilige limiet voor kleine runs; voeg jitter toe en stop zodra je een CAPTCHA of 403 ziet.
- Roteer de User-Agent — een constante of standaard UA is een aanwijzing; varieer het en houd het actueel.
- Eén sessie per stad — start verse cookies per stad of per run in plaats van één identiteit over alles mee te nemen.
Omdat bans IP-gebaseerd zijn, doet de exit-IP het meeste werk. Een schone residentiële proxy pool ziet eruit als echte thuisverbindingen, en per-verzoek rotatie verspreidt een multi-stad crawl zo dun dat Craigslist's per-IP tellers nooit afgaan. Als je over veel steden verzamelt, behandelt onze gids over het oplossen van 429 rate limits de pacing en concurrency-budget kant, en de anti-ban checklist bindt het allemaal samen.
Craigslist scrapen op schone residentiële IP's
Schaal over steden heen
De echte kracht van Craigslist-data is cross-stad vergelijking — dezelfde tweedehands auto of huurwoning geprijsd over een dozijn metro's. Loop je stadslijst, bind een verse roterende exit per stad, beperk de gelijktijdigheid, en sla de stad op bij elk record. Voor voertuig- en huuronderzoek specifiek, voeden dezelfde patronen een vergelijkingspijplijn; zie onze gidsen over het scrapen van autoadvertenties en vastgoeddata voor het omzetten van ruwe advertenties in marktsignalen.

Veelgestelde vragen
Kun je Craigslist scrapen?
Ja — de openbare zoek- en advertentiepagina's zijn te scrapen, en Craigslist biedt zelfs een RSS-feed voor zoekopdrachten. Het obstakel is agressieve per-IP rate limiting, niet het parsen. Roteer residentiële IP's, tempo verzoeken tot 1-2 per seconde, en je kunt voertuigen, verhuur, klussen en te koop data betrouwbaar verzamelen. Respecteer de voorwaarden van Craigslist en scrape alleen openbare data.
Heeft Craigslist een API?
Er is geen algemene openbare data API, maar elke zoek-URL kan een RSS-feed retourneren door &format=rss toe te voegen. Dat geeft je een gestructureerde XML-feed met titels, links en tijdstempels — perfect voor het monitoren van nieuwe advertenties — terwijl de HTML-pagina's de vollere velden zoals prijs en beschrijving bevatten.
Hoe voorkom ik dat ik een IP-ban krijg bij het scrapen van Craigslist?
Craigslist bant op IP-snelheid, dus de oplossingen gaan allemaal over het spreiden en vertragen van de belasting: roteer residentiële IP's per verzoek, houd het bij 1-2 verzoeken per seconde met jitter, roteer je User-Agent, gebruik een verse sessie per stad, en stop onmiddellijk als je een CAPTCHA of 403 ziet. Een datacenter IP die één stad hamerend krijgt het snelst een ban.
Hoe werkt de paginering van Craigslist?
Craigslist toont 120 resultaten per pagina en pagineert met de s queryparameter als een offset. Pagina één laat s weg, pagina twee is s=120, pagina drie s=240, enzovoort. Verhoog in stappen van 120 totdat een pagina minder dan 120 resultaten retourneert, wat het einde markeert.
Craigslist is gemakkelijk te lezen en gemakkelijk om van geband te worden — en het tweede probleem gaat volledig over IP-hygiëne. Beheers het URL-patroon, gebruik RSS voor monitoring, pagineer in stappen van 120, en routeer alles via roterende residentiële IP's op een menselijk tempo. Doe dat en de CAPTCHA's verschijnen gewoon niet meer.