Скрапинг объявлений о продаже автомобилей: Cars.com, Autotrader и CarGurus для получения ценовой информации

Информация о ценах дилеров находится на Cars.com, Autotrader и CarGurus — те же автомобили, но с разными ценами в зависимости от ZIP-кода и размещенные повсюду. Вот как их скрапить, удалять дубликаты по VIN и обходить антибот-защиту.

Информация о ценах дилеров не сосредоточена в одном месте. Один и тот же подержанный автомобиль одновременно размещен на Cars.com, Autotrader и CarGurus, с разными ценами в зависимости от ZIP-кода покупателя, и каждый сайт защищает свои страницы от ботов. Хороший скрапинг заключается не столько в парсинге страницы, сколько в трех вещах: фильтрации поисков, чтобы добраться до каждого объявления, удалении дубликатов одного и того же автомобиля по VIN и обходе защиты без сжигания множества IP-адресов. Это руководство охватывает все три аспекта, с кодом, который можно адаптировать для любого из крупных сайтов объявлений.

Что дает объявление о продаже автомобиля

Каждое объявление о транспортном средстве представляет собой плотную запись после парсинга: год, марка, модель и комплектация; цена и пробег; VIN; тип кузова, привод, топливо, трансмиссия, цилиндры и двери; цвет интерьера и экстерьера; номер на складе; список характеристик; изображения; и данные о дилере плюс рейтинг сделки на сайтах, которые его вычисляют. Это полный набор данных оценки на строку. Поля, вокруг которых вы строите свой конвейер, это цена, пробег, VIN и дилер — все остальное является обогащением.

Сначала фильтруйте: доберитесь до каждого объявления

Сайты объявлений разбивают страницы на фиксированные размеры (обычно 20 на страницу) и ограничивают глубину одного поиска — часто около 1,000 результатов всего. Если поиск соответствует большему количеству автомобилей, дополнительные просто недоступны через пагинацию. Решение — сегментация: разбейте широкий поиск на более узкие по марке, модели, диапазону годов, ценовому диапазону или ZIP, чтобы каждый оставался в пределах лимита, затем объедините результаты. Cars.com удобно кодирует все это в URL, так что вы можете строить поиски программно.

from urllib.parse import urlencode

def search_url(zip_code, make="", model="", max_price="", year_min=""):
    params = {
        "stock_type": "used",
        "makes[]": make,
        "models[]": model,
        "list_price_max": max_price,
        "year_min": year_min,
        "maximum_distance": "all",
        "zip": zip_code,
        "page_size": 20,
        "sort": "listed_at_desc",
    }
    return "https://www.cars.com/shopping/results/?" + urlencode(params)

print(search_url("10001", make="toyota", model="camry", year_min=2020))
Диаграмма статистики скрапинга объявлений о продаже автомобилей: 20 объявлений на страницу, 1000 доступных на поиск, задержки 2-5 секунд, VIN как ключ для удаления дубликатов между сайтами
Один поиск достигает около 1,000 результатов — сегментируйте по марке, году или ZIP, чтобы добраться до остальных, и регулируйте запросы, чтобы оставаться незамеченными.

Обходите защиту: резидентные прокси

Cars.com находится за Cloudflare; другие автомобильные сайты используют Imperva с hCaptcha или reCAPTCHA, которые срабатывают под нагрузкой. IP-адрес центра обработки данных, который бьет по страницам объявлений, быстро сталкивается с вызовом. Резидентные прокси от реальных интернет-провайдеров выглядят как обычные покупатели, и их ротация распределяет запросы, чтобы ни один адрес не превышал лимит частоты. Держите задержку между запросами 2-5 секунд — темп важен не меньше, чем IP. Для небольших, случайных запросов пул центра обработки данных подходит; для постоянного мониторинга в масштабе резидентные прокси — это разница между успешным запуском и зависанием на CAPTCHA.

import requests, time, random

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": PROXY, "https": PROXY}
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}

def fetch(url):
    r = requests.get(url, proxies=proxies, headers=HEADERS, timeout=20)
    r.raise_for_status()
    time.sleep(random.uniform(2, 5))   # polite, and harder to fingerprint
    return r.text

Если цель отображает объявления с помощью JavaScript или выдает постоянные CAPTCHA, Scraper API, который использует настоящий отпечаток браузера и решает антибот-защиту за вас, менее уязвим, чем поддержка собственного браузерного парка. Наше руководство по обходу Cloudflare в 2026 году охватывает, где проходит эта граница.

Получите резидентные прокси для сайтов объявлений о продаже автомобилей

Удаление дубликатов по VIN между источниками

Самый полезный столбец в автомобильных данных — это VIN. Поскольку дилеры размещают один и тот же автомобиль на каждом рынке, ваш сырой скрапинг полон дубликатов, которые выглядят как отдельные объявления. VIN — это глобально уникальный идентификатор для физического транспортного средства, поэтому ключевание по нему сворачивает эти дубликаты в одну запись — и позволяет сравнивать, как один и тот же автомобиль оценивается на Cars.com, Autotrader и CarGurus, или каким дилером. Сохраняйте самую низкую цену на VIN, или сохраняйте все из них с пометкой по источнику, в зависимости от того, что вы измеряете.

def dedupe_by_vin(rows):
    best = {}
    for r in rows:
        vin = r.get("vin")
        if not vin:
            continue
        price = int(r["price"])
        if vin not in best or price < int(best[vin]["price"]):
            best[vin] = r          # keep the cheapest listing per car
    return list(best.values())
Диаграмма потока конвейера объявлений о продаже автомобилей: создайте URL фильтрованного поиска, получите через резидентный прокси, обходя Cloudflare, распарсите поля объявления, удалите дубликаты по VIN
Фильтруйте, получайте через резидентный выход, парсите, затем сворачивайте дубликаты по VIN, чтобы сравнивать автомобили, а не считать объявления дважды.

Гео-ценообразование: один и тот же автомобиль, разные ZIP

Цены на автомобили локальны. Одна и та же модель показывает разные цены и наличие в зависимости от ZIP, из которого вы ищете, потому что дилеры и спрос варьируются по регионам. Чтобы зафиксировать это распределение, просмотрите набор ZIP и, где сайт персонализирует по местоположению посетителя, направьте каждый запрос через выход в соответствующем регионе. Резидентный пул с таргетингом по стране и городу позволяет вам видеть цены так, как их видит местный покупатель — это необходимо для арбитража, бенчмаркинга дилеров или построения модели оценки, которая не искажена в пользу одного рынка.

zips = ["10001", "90001", "60601", "77001"]  # NY, LA, Chicago, Houston
spread = {}
for z in zips:
    url = search_url(z, make="toyota", model="camry", year_min=2021)
    rows = parse_listings(fetch(url))          # exit geo-matched to the ZIP
    spread[z] = [int(r["price"]) for r in rows]

# now compare median price by market
for z, prices in spread.items():
    prices.sort()
    print(z, "median", prices[len(prices)//2])

Это тот же подход с ориентацией на местоположение, который лежит в основе мониторинга цен конкурентов и сбора данных о недвижимости — где бы цена ни зависела от местоположения покупателя, выходы с гео-таргетингом обязательны.

Источники аукционов и оптовой торговли

Сайты розничных объявлений показывают, что запрашивают дилеры; аукционные платформы, такие как Copart, показывают, за сколько автомобили действительно продаются на оптовом уровне — другая половина модели ценообразования. Эти сайты более защищены: например, Copart использует веб-защиту Imperva с поведенческим отпечатком, и вызовы hCaptcha или reCAPTCHA появляются при большом объеме запросов. Пагинация также более жесткая — 20 автомобилей на страницу с жестким лимитом около 50 страниц, так что один поиск ограничивается примерно 1,000 лотов. Достижение полного инвентаря означает сегментацию запросов по марке, модели, диапазону годов, аукционному двору или состоянию, точно так же, как и на розничных сайтах, и выполнение каждого сегмента отдельно.

Поскольку эти платформы загружают результаты и пагинацию с помощью JavaScript и вызывают подозрительный трафик, им нужны резидентные IP и минимальный интервал между запросами 2-5 секунд. Прокси центра обработки данных справляются с небольшими, случайными запросами; все, что требует постоянства, должно выполняться на резидентных выходах. Вознаграждение — это реальный сигнал: история ставок, статус продажи и состояние лота питают прогнозирование спроса и анализ экспорта-импорта, который розничные запрашиваемые цены не могут дать.

Мониторинг, а не просто разовый скрапинг

Одноразовый дамп мгновенно устаревает на рынке, где объявления обновляются ежедневно. Долговечный шаблон — это запланированный скрапинг, который делает снимки ваших целевых поисков и сравнивает последовательные запуски — новые объявления, снижение цен и проданные автомобили. Ключуйте каждую строку по VIN, чтобы изменение цены на одно и то же транспортное средство было однозначным, отмечайте временной меткой каждый снимок, и у вас будет временной ряд, который можно анализировать: насколько быстро обесцениваются конкретные модели, какие дилеры снижают цены, где накапливается инвентарь. Направляйте эти запланированные запуски через вращающиеся резидентные IP, чтобы ежедневная задача с одного и того же адреса не приводила к постепенной блокировке.

Часто задаваемые вопросы

Можно ли скрапить Cars.com и Autotrader?

Да — страницы объявлений показывают общедоступные данные о транспортных средствах. Практическая проблема — это защита от ботов: Cars.com использует Cloudflare, а другие используют Imperva с CAPTCHA. Резидентные прокси, реалистичные заголовки и задержка 2-5 секунд между запросами поддерживают работу скрапинга. Соблюдайте условия использования каждого сайта и избегайте сбора личных данных.

Как избежать блокировки при скрапинге объявлений о продаже автомобилей?

Ротируйте резидентные IP, чтобы ни один адрес не делал слишком много запросов, регулируйте запросы с помощью случайной задержки 2-5 секунд, отправляйте реальный User-Agent браузера и сегментируйте большие поиски на более мелкие, вместо того чтобы пролистывать тысячи страниц. Если CAPTCHA продолжают появляться, переключитесь на Scraper API, который справляется с антибот-защитой и рендерингом JavaScript.

Почему я получаю дубликаты автомобилей при скрапинге?

Дилеры размещают один и тот же автомобиль на нескольких рынках, поэтому одно физическое транспортное средство появляется как несколько объявлений. Удаляйте дубликаты по VIN, который уникально идентифицирует транспортное средство независимо от сайта. Ключевание по VIN превращает дубликаты в сравнение цен на один и тот же автомобиль между источниками, а не в завышенные подсчеты.

Действительно ли цены на автомобили меняются в зависимости от местоположения?

Да. Наличие и ценообразование варьируются по регионам, и многие сайты персонализируют результаты в зависимости от ZIP-кода искателя. Чтобы зафиксировать реальное распределение, ищите по нескольким ZIP и направляйте каждый запрос через выход в соответствующем регионе, используя резидентные прокси с гео-таргетингом, чтобы видеть местные цены, а не искаженный национальный обзор.

Скрапинг автомобильных объявлений сводится к достижению каждого автомобиля (сегментация за пределами лимита ~1,000 результатов), обходу антибот-защиты (ротация резидентных IP, вежливое регулирование), удалению дубликатов по VIN и захвату гео-распределений с выходами с таргетингом по местоположению. Постройте конвейер вокруг цены, пробега, VIN и дилера, и у вас будет информация о ценах дилеров на всех крупных рынках одновременно.

Начните скрапинг объявлений о продаже автомобилей с QuantumProxies