Cómo extraer listados de Craigslist: Vehículos, Alquileres y Trabajos

Craigslist es un tesoro de datos custodiado por límites agresivos de IP. Aquí está la estructura de URL por ciudad, el cálculo de paginación de 120 por página, el atajo de RSS que la mayoría pasa por alto y la configuración de proxy que te mantiene fuera de la lista de prohibidos.

Craigslist contiene una enorme cantidad de datos públicos utilizables — autos usados, alquileres de apartamentos, trabajos, artículos en venta, servicios — distribuidos en cientos de sitios por ciudad. También es una barrera para principiantes con CAPTCHAs y prohibiciones de IP, porque Craigslist limita fuertemente por dirección IP. La buena noticia: la estructura de URL del sitio es simple y predecible, hay un atajo de RSS que la mayoría de las guías omiten, y el problema de bloqueo es casi enteramente un problema de higiene de IP. Esta guía cubre el patrón de URL por ciudad, el cálculo de paginación, el análisis, la ruta de RSS y la configuración de proxy que mantiene un scraper fuera de la lista de prohibidos. Extrae para uso personal o de investigación, respeta los términos de Craigslist y trata esto como información general en lugar de consejo legal.

El patrón de URL es todo el juego

Craigslist se divide por subdominio de ciudad y código de categoría, y todo lo demás son parámetros de consulta. Aprende la forma una vez y puedes apuntar a cualquier ciudad y sección: https://{city}.craigslist.org/search/{category}?query={q}. Los códigos de categoría son cortos — sss para todo en venta, cto para autos por propietario, apa para apartamentos, ggg para trabajos. Añade min_price, max_price y otros filtros como parámetros. La paginación usa el parámetro s, y cada página muestra 120 resultados — así que la página dos es s=120, la página tres es s=240, y así sucesivamente.

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)

Analizando los listados

Las filas de resultados de búsqueda están marcadas con un conjunto estable de clases — el bloque de listados es .result-info, con .result-title, .result-price y .result-date dentro. Protege cada campo, porque no todos los listados tienen un precio:

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")

Para registros más ricos — kilometraje en un auto, habitaciones en un alquiler — sigue la URL de cada listado y analiza la página de detalles. Eso duplica tu conteo de solicitudes, por lo que es exactamente donde el ritmo y la rotación comienzan a importar.

Diagrama que descompone una URL de búsqueda de Craigslist en subdominio de ciudad, código de categoría, consulta y el parámetro de paginación s
Las URLs de Craigslist son completamente predecibles: subdominio de ciudad, código de categoría, luego consulta y el parámetro s en pasos de 120.

El atajo de RSS que la mayoría de las guías omiten

Craigslist no tiene una API pública general, pero expone un feed RSS para los resultados de búsqueda — añade &format=rss a cualquier URL de búsqueda y obtienes un feed XML estructurado en lugar de HTML para analizar. Es más ligero, menos probable de activar heurísticas anti-bot que cargar repetidamente la página completa de resultados, e ideal para monitoreo: consulta una búsqueda guardada en un horario y compara para nuevos elementos. Devuelve menos campos que la página HTML (título, enlace, marca de tiempo), así que úsalo para monitoreo de frescura y vuelve al HTML cuando necesites precio y detalle.

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)

Por qué Craigslist te prohíbe, y cómo evitar ser prohibido

Craigslist apila varias defensas, pero comparten una raíz: rastrea solicitudes por dirección IP y bloquea direcciones que lo golpean demasiado fuerte. Las medidas específicas son limitación de tasa de IP, desafíos CAPTCHA en tráfico sospechoso, monitoreo de User-Agent, seguimiento de sesiones y prohibiciones temporales de IP. Cada una de ellas se derrota pareciendo muchos visitantes ordinarios en lugar de una máquina implacable.

Debido a que las prohibiciones son basadas en IP, la IP de salida está haciendo la mayor parte del trabajo. Un grupo limpio de proxies residenciales parece conexiones reales de hogar, y la rotación por solicitud distribuye un rastreo multi-ciudad tan finamente que los contadores por IP de Craigslist nunca se activan. Si estás recopilando a través de muchas ciudades, nuestra guía sobre cómo solucionar límites de tasa 429 cubre el lado del ritmo y el presupuesto de concurrencia, y la lista de verificación anti-prohibición lo une todo.

Extrae Craigslist en IPs residenciales limpias

Escalando a través de ciudades

El verdadero poder de los datos de Craigslist es la comparación entre ciudades — el mismo auto usado o alquiler con precios en una docena de áreas metropolitanas. Recorre tu lista de ciudades, vincula una salida rotativa fresca por ciudad, limita la concurrencia y almacena la ciudad junto a cada registro. Para investigación de vehículos y alquileres específicamente, los mismos patrones alimentan una tubería de comparaciones; consulta nuestras guías sobre extraer listados de autos y datos inmobiliarios para convertir listados en bruto en señales de mercado.

Lista de verificación que mapea las defensas anti-extracción de Craigslist como la limitación de tasa de IP y CAPTCHAs a soluciones como rotación residencial y ritmo
Cada defensa de Craigslist es un problema de IP y ritmo — rota salidas residenciales y mantente por debajo de 1-2 solicitudes por segundo.

Preguntas frecuentes

¿Puedes extraer Craigslist?

Sí — las páginas públicas de búsqueda y listados son extraíbles, e incluso Craigslist expone un feed RSS para búsquedas. El obstáculo es la limitación agresiva de tasa por IP, no el análisis. Rota IPs residenciales, rítmate a 1-2 solicitudes por segundo, y puedes recopilar datos de vehículos, alquileres, trabajos y en venta de manera confiable. Respeta los términos de Craigslist y extrae solo datos públicos.

¿Craigslist tiene una API?

No hay una API de datos públicos general, pero cada URL de búsqueda puede devolver un feed RSS añadiendo &format=rss. Eso te da un feed XML estructurado con títulos, enlaces y marcas de tiempo — perfecto para monitorear nuevos listados — mientras que las páginas HTML llevan los campos más completos como precio y descripción.

¿Cómo evito ser prohibido por IP al extraer Craigslist?

Craigslist prohíbe por tasa de IP, por lo que las soluciones se tratan de distribuir y ralentizar la carga: rota IPs residenciales por solicitud, mantente a 1-2 solicitudes por segundo con variación, rota tu User-Agent, usa una sesión fresca por ciudad y retrocede inmediatamente cuando veas un CAPTCHA o 403. Una IP de centro de datos golpeando una ciudad se prohíbe más rápido.

¿Cómo funciona la paginación de Craigslist?

Craigslist muestra 120 resultados por página y pagina con el parámetro de consulta s como un desplazamiento. La página uno omite s, la página dos es s=120, la página tres s=240, y así sucesivamente. Incrementa en pasos de 120 hasta que una página devuelva menos de 120 resultados, lo que marca el final.

Craigslist es fácil de leer y fácil de ser prohibido — y el segundo problema se trata enteramente de la higiene de IP. Domina el patrón de URL, usa RSS para monitoreo, pagina en pasos de 120, y enruta todo a través de IPs residenciales rotativas a un ritmo humano. Haz eso y los CAPTCHAs simplemente dejan de aparecer.

Comienza con proxies residenciales rotativos