Tony Wang6 min de lecturaCómo hacer scraping de anuncios de coches usados en 2026 (API y Python)
Scraping de coches usados en CarMax, Autotrader y Cars.com — precio, kilometraje, dealer e historial — DIY, no-code o API estructurada.
La forma más rápida de hacer scraping de anuncios de coches usados en 2026 es llamar a una API estructurada que devuelve JSON normalizado de los principales sitios — en lugar de construir y mantener un parser distinto para las páginas de inventario, muy cargadas de JavaScript, de cada uno. CarMax, Autotrader y Cars.com son los tres marketplaces de coches usados más grandes de EE. UU., ninguno tiene una API pública de autoservicio, y cada uno defiende sus páginas con infraestructura anti-bot real. Esta guía cubre los tres enfoques en los tres sitios, qué devuelve cada uno, dónde falla el DIY y lo básico en lo legal.
¿Por qué hacer scraping de anuncios de coches usados?
Los datos de anuncios de vehículos de CarMax, Autotrader y Cars.com impulsan:
- Inteligencia de precios — seguir cómo se mueve el precio pedido de un modelo según kilometraje, versión y mercado, y detectar anuncios con precio por debajo del mercado.
- Investigación de inventario y mercado — medir cuántos vehículos de una marca/modelo hay en el mercado y dónde.
- Herramientas de búsqueda de ofertas — construir una función de "marcar buenas ofertas" usando las mismas señales de precio que calculan los propios sitios.
- Analítica de concesionarios — seguir la rotación de inventario, la estrategia de precios y la valoración de un dealer a lo largo del tiempo.
- Modelado de depreciación y demanda — combinar datos de anuncios entre sitios para modelar cómo se mueve el valor de un vehículo con la edad y el kilometraje.
¿Es legal hacer scraping de anuncios de coches usados?
Opción 1: DIY en Python (y por qué falla)
Los tres sitios renderizan sus anuncios a partir de JSON del lado del cliente en lugar de HTML plano, así que un scraper DIY tiene que llegar a la API subyacente que llama cada página:
import requests
# Cars.com renders from a public GraphQL endpoint
resp = requests.post(
"https://graph.cars.com/graphql/api",
json={"query": "...", "variables": {"stockType": "used", "zip": "78701"}},
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
Funciona en la demo y luego se rompe:
- Los términos de servicio son explícitos. Los términos de Autotrader nombran "robots, screen scrapers, or spiders" directamente — no es un caso ambiguo.
- Anti-bot real en el edge. Una solicitud simple y sin autenticar a CarMax se bloquea antes de que llegue siquiera a la página (su edge devolvió un "Access Denied" al estilo Akamai ante una petición rutinaria de
robots.txtdurante la investigación de esta guía), y Cars.com pone un challenge de Cloudflare ante esa misma solicitud. Las llamadasrequestssin más se bloquean rápido; un scraper basado en navegador necesita mantenimiento constante a medida que esas defensas se actualizan. - Tres backends distintos, tres formas distintas. CarMax corre su API móvil sobre Azure Front Door con
stock_numbercomo clave primaria; Autotrader anidamake/model/trimcomo objetos con camposcode/nameseparados y sirve inventario nuevo y usado desde un mismo endpoint; Cars.com corre una API pública GraphQL con unlisting_idUUID como clave. No hay un esquema compartido — escribes y mantienes tres parsers, no uno. - Sin API oficial de terceros. Los feeds de inventario reales se mueven a través de integraciones dealer/DMS (vAuto, HomeNet) vía FTP/CSV o APIs de partner — reservadas a concesionarios con licencia, no disponibles para un desarrollador externo que construye un producto de inteligencia de precios.
Opción 2: Herramientas no-code
Existen actors de scraping de marketplace para cada sitio por separado y sirven para extracciones puntuales, pero vuelves a tener tres herramientas separadas con tres esquemas separados para una vista cruzada entre sitios, y heredan la misma fragilidad anti-bot que el DIY.
Opción 3: Una API estructurada de coches usados
Para un flujo repetible y cruzado entre sitios, las APIs de scraping de CarMax, Autotrader y Cars.com devuelven cada una JSON normalizado sin necesidad de parsear páginas ni mantener defensas de edge. Busca en CarMax por marca y rango de precio:
curl "https://api.crawlora.net/api/v1/carmax/search?make=Toyota&max_price=25000&zip=78701" \
-H "x-api-key: $CRAWLORA_API_KEY"
Obtén el detalle de los tres en Python — cada búsqueda devuelve el id que necesitas para su propia llamada de detalle:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1"
carmax_hits = requests.get(f"{base}/carmax/search", headers=h, params={"make": "Toyota", "max_price": 25000}).json()["data"]["vehicles"]
carmax_detail = requests.get(f"{base}/carmax/vehicle/{carmax_hits[0]['stock_number']}", headers=h).json()["data"]
autotrader_hits = requests.get(f"{base}/autotrader/search", headers=h, params={"make": "Toyota", "zip": "78701"}).json()["data"]["vehicles"]
autotrader_detail = requests.get(f"{base}/autotrader/vehicle/{autotrader_hits[0]['id']}", headers=h).json()["data"]
carsdotcom_hits = requests.get(f"{base}/carsdotcom/search", headers=h, params={"zip": "78701", "stock_type": "used"}).json()["data"]["vehicles"]
carsdotcom_detail = requests.get(f"{base}/carsdotcom/vehicle/{carsdotcom_hits[0]['listing_id']}", headers=h).json()["data"]
Una respuesta de búsqueda de CarMax es JSON normalizado (campos reales — revisa la documentación):
{
"code": 200,
"msg": "OK",
"data": {
"total_count": 91136,
"vehicles": [
{
"stock_number": 28187774,
"vin": "1FMJK1K89REA27006",
"year": 2024,
"make": "Ford",
"model": "Expedition Max",
"mileage": 41406,
"price_info": { "price": 45998, "is_price_reduced": true, "previous_price": 46998 },
"store": { "id": 7124, "name": "Canoga Park" },
"prior_uses": ["Leased Vehicle", "Rental"],
"url": "https://www.carmax.com/car/28187774"
}
]
}
}
El detalle de vehículo de CarMax añade history (conteo de accidentes y propietarios) y warranties; el detalle de Autotrader lleva vehicle_history_flags (p. ej. NO_SALVAGE_TITLE, NO_ACCIDENTS_REPORTED) y tanto msrp como sale_price para inventario nuevo; el detalle de Cars.com es el más centrado en precio de los tres — incluye un deal_rating calculado:
{
"deal_rating": {
"rating": "fair",
"good_price_min": 17591,
"good_price_max": 19566,
"predicted_price": 17950,
"predicted_price_difference": -4042
}
}
Guarda una fila por anuncio y por sitio, indexada por VIN donde esté presente (el único campo directamente comparable entre los tres), y vuelve a ejecutarlo con un calendario para seguir cambios de precio y nuevo inventario.
Qué puedes recopilar
Datos públicos de anuncios por sitio: resultados de búsqueda (año, marca, modelo, versión, kilometraje, precio, color exterior/interior, transmisión, tipo de combustible, dealer/store); detalle completo del vehículo (especificaciones, características, garantías donde CarMax las lista, deal_rating en Cars.com, vehicle_history_flags en Autotrader); ubicaciones de tiendas de CarMax y su taxonomía "shop by brand"; y perfiles de dealer de Autotrader (nombre, valoración, dirección, conteo de inventario actual). Solo datos públicos del anuncio — no un reporte completo de historial del vehículo.
Limitaciones y desafíos comunes
- Sin esquema compartido entre sitios. Normaliza al ingerir — haz match por VIN donde esté disponible, ya que los stock numbers y listing ids son específicos de cada sitio.
- Anti-bot real en los tres. Espera challenges a nivel edge (clase Akamai en CarMax, Cloudflare en Cars.com) ante solicitudes ingenuas.
- Autotrader mezcla nuevo y usado. Filtra por
listing_type/conditionsi solo quieres inventario usado. - Precios e inventario rotan rápido. Un dealer vende o repriza un coche en días, no en meses — vuelve a extraer con un calendario en lugar de confiar en una instantánea.
- Solo datos públicos. Son datos de la página de anuncio, no un reporte de historial del vehículo de pago, y no una forma de llegar a datos de contacto personales de dealer o comprador.
Dónde se usa esto
- Inteligencia de precios — seguir el precio pedido frente a kilometraje y versión, y marcar anuncios con precio por debajo del mercado usando la misma señal tipo
deal_ratingque expone Cars.com. - Investigación de mercado — medir profundidad y rotación de inventario por marca, modelo y región.
- Analítica de concesionarios — vigilar el precio y el inventario de un dealer específico a lo largo del tiempo.
Fuentes
Empieza a recopilar
Pruébalo primero, gratis: pasa cualquier URL pública por el Free Web Scraper, o comprueba si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints de búsqueda en el Playground, revisa el esquema en la documentación de la API, y consulta precios. Para el otro lado de la transacción, how to scrape job postings cubre el mismo problema — "sin API de autoservicio, integrar por proveedor" — para un mercado completamente distinto. Para la versión de bienes raíces del mismo patrón portal por portal, consulta how to scrape real estate listings. Consulta también how to choose a web scraping API e is web scraping legal.
Parte de nuestra serie de guías how-to-scrape — cada plataforma que cubrimos, en un solo índice.
Preguntas frecuentes
¿CarMax, Autotrader y Cars.com tienen APIs oficiales?
Ninguno de los tres tiene una API pública de autoservicio. Los feeds de inventario reales pasan por partnerships de dealer/DMS (vAuto, HomeNet) vía FTP/CSV o APIs de partner, reservados a concesionarios con licencia — no disponibles para un desarrollador externo. Una API estructurada es la vía práctica para investigar precio e inventario entre sitios.
¿Es legal hacer scraping de anuncios de coches usados?
Los datos del anuncio (año, marca, modelo, precio, kilometraje, VIN) no están protegidos por derechos de autor, pero los términos de cada sitio restringen el acceso automatizado — los términos de Autotrader nombran explícitamente robots, screen scrapers y spiders. Cíñete a los datos públicos del anuncio, respeta los límites de tasa y nunca intentes obtener un reporte completo de historial del vehículo de pago a través de una página de anuncio. No es asesoría legal.
¿Cómo comparo el precio de un anuncio entre varios sitios?
Haz match por VIN — es el único campo directamente comparable entre CarMax, Autotrader y Cars.com, ya que los stock numbers y listing ids son específicos de cada sitio. Busca en cada sitio, extrae el VIN de los resultados y luego únelos por ahí.
¿Qué sitio me dice si un anuncio es una buena oferta?
Cars.com devuelve en el detalle del vehículo un deal_rating calculado (fair/good/great), con un predicted_price y un rango good_price_min/max que puedes usar directamente. CarMax y Autotrader no calculan esto, pero puedes construir tú mismo la misma señal a partir de precio vs. kilometraje vs. versión en sus anuncios.
¿Puedo obtener el inventario completo de un dealer?
En dos de los tres, sí. El /autotrader/dealer/{id} de Autotrader devuelve el perfil del dealer más una primera página del inventario actual; los /carmax/stores y /carmax/store/{id} de CarMax devuelven ubicaciones físicas de tiendas. La búsqueda de Cars.com acepta un filtro zip/radius en lugar de una búsqueda directa de dealer.
¿Incluye reportes de historial del vehículo como Carfax?
No. Esto solo devuelve lo que la propia página de anuncio de cada sitio muestra públicamente — conteo de accidentes/propietarios y flags de uso previo donde el sitio mismo los expone (el objeto history de CarMax, el vehicle_history_flags de Autotrader) — no un reporte completo de Carfax o AutoCheck, que son productos de pago con licencia separada.
¿Se incluyen anuncios de coches nuevos?
Autotrader mezcla inventario nuevo y usado en un mismo endpoint de búsqueda — filtra por listing_type o condition si solo quieres inventario usado. El inventario usado de CarMax y Cars.com en los endpoints de esta guía es, por diseño, solo usado.