Scraping ogłoszeń samochodowych: Cars.com, Autotrader i CarGurus dla informacji o cenach

Informacje o cenach dealerów są dostępne na Cars.com, Autotrader i CarGurus — te same samochody, wyceniane różnie w zależności od kodu pocztowego i publikowane wszędzie. Oto jak je zeskrobać, usunąć duplikaty według VIN i przejść przez zabezpieczenia antybotowe.

Informacje o cenach dealerów nie są dostępne w jednym miejscu. Ten sam używany samochód jest jednocześnie wystawiany na Cars.com, Autotrader i CarGurus, wyceniany różnie w zależności od kodu pocztowego kupującego, a każda strona chroni swoje strony przed botami. Dobre scraping to mniej kwestia parsowania strony, a bardziej trzy rzeczy: filtrowanie wyszukiwań, aby faktycznie dotrzeć do każdego ogłoszenia, usuwanie duplikatów tego samego pojazdu z różnych źródeł według VIN i przechodzenie przez zabezpieczenia bez floty spalonych IP. Ten przewodnik obejmuje wszystkie trzy aspekty, z kodem, który można dostosować do dowolnej z dużych stron z ogłoszeniami.

Co daje ogłoszenie samochodowe

Każde ogłoszenie pojazdu to gęsty zapis po jego zparsowaniu: rok, marka, model i wersja; cena i przebieg; VIN; typ nadwozia, napęd, paliwo, skrzynia biegów, cylindry i drzwi; kolor wnętrza i zewnętrzny; numer magazynowy; lista funkcji; zdjęcia; oraz szczegóły dealera plus ocena oferty na stronach, które ją obliczają. To pełny zestaw danych wyceny na wiersz. Pola, wokół których budujesz swój pipeline, to cena, przebieg, VIN i dealer — wszystko inne to wzbogacenie.

Najpierw filtruj: dotrzyj do każdego ogłoszenia

Strony z ogłoszeniami paginują w stałych rozmiarach stron (zwykle 20 na stronę) i ograniczają, jak głęboko może sięgać pojedyncze wyszukiwanie — często do około 1 000 wyników łącznie. Jeśli wyszukiwanie pasuje do większej liczby samochodów, dodatkowe są po prostu nieosiągalne przez paginację. Rozwiązaniem jest segmentacja: podziel szerokie wyszukiwanie na węższe według marki, modelu, zakresu lat, przedziału cenowego lub kodu pocztowego, aby każde pozostało poniżej limitu, a następnie połącz wyniki. Cars.com, co jest przydatne, koduje to wszystko w URL, więc budujesz wyszukiwania programowo.

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))
Diagram statystyk scraping ogłoszeń samochodowych: 20 ogłoszeń na stronę, 1000 osiągalnych na wyszukiwanie, opóźnienia 2-5 sekund, VIN jako klucz do usuwania duplikatów między stronami
Pojedyncze wyszukiwanie osiąga maksymalnie około 1 000 wyników — segmentuj według marki, roku lub kodu pocztowego, aby dotrzeć do reszty, i dostosuj tempo żądań, aby nie zostać wykrytym.

Przejdź przez zabezpieczenia: proxy rezydencjalne

Cars.com jest chronione przez Cloudflare; inne strony motoryzacyjne używają Imperva z hCaptcha lub reCAPTCHA, które uruchamiają się pod obciążeniem. IP z centrum danych, które bombarduje strony z ogłoszeniami, szybko zostaje wyzwane. Proxy rezydencjalne od prawdziwych ISP wyglądają jak zwykli kupujący, a ich rotacja rozprasza żądania, więc żaden pojedynczy adres nie przekracza limitu szybkości. Zachowaj opóźnienie 2-5 sekund między żądaniami — tempo jest tak samo ważne jak IP. Dla małych, okazjonalnych pobrań pula z centrum danych jest wystarczająca; dla ciągłego monitorowania na dużą skalę, proxy rezydencjalne stanowią różnicę między zakończonym a zablokowanym na CAPTCHA zadaniem.

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

Jeśli cel renderuje ogłoszenia za pomocą JavaScript lub rzuca uporczywe CAPTCHAs, Scraper API, które posiada prawdziwy odcisk palca przeglądarki i rozwiązuje warstwę antybotową za Ciebie, jest mniej podatne na awarie niż utrzymywanie własnej farmy przeglądarek. Nasz przewodnik na temat przechodzenia przez Cloudflare w 2026 roku obejmuje, gdzie przebiega ta linia.

Zdobądź proxy rezydencjalne dla stron z ogłoszeniami samochodowymi

Usuń duplikaty według VIN z różnych źródeł

Najbardziej przydatną kolumną w danych motoryzacyjnych jest VIN. Ponieważ dealerzy publikują ten sam samochód na każdym rynku, Twoje surowe dane są pełne duplikatów, które wyglądają jak osobne ogłoszenia. VIN jest globalnie unikalnym identyfikatorem fizycznego pojazdu, więc kluczowanie na jego podstawie redukuje te duplikaty do jednego rekordu — i pozwala porównać, jak ten sam samochód jest wyceniany na Cars.com, Autotrader i CarGurus, lub przez którego dealera. Zachowaj najniższą cenę na VIN, lub zachowaj wszystkie oznaczone według źródła, w zależności od tego, co mierzysz.

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())
Diagram przepływu pipeline ogłoszeń samochodowych: zbuduj filtrowany URL wyszukiwania, pobierz przez wyjście rezydencjalne za Cloudflare, zparsuj pola ogłoszenia, usuń duplikaty według VIN
Filtruj, pobierz przez wyjście rezydencjalne, zparsuj, a następnie zredukuj duplikaty według VIN, aby porównać samochody zamiast liczyć ogłoszenia dwa razy.

Wyceny geograficzne: ten sam samochód, różne kody pocztowe

Ceny motoryzacyjne są lokalne. Ten sam model pokazuje różne ceny i dostępność w zależności od kodu pocztowego, z którego wyszukujesz, ponieważ dealerzy i popyt różnią się w zależności od regionu. Aby uchwycić ten rozrzut, przeszukaj zestaw kodów pocztowych i, tam gdzie strona personalizuje według lokalizacji odwiedzającego, kieruj każde żądanie przez wyjście w pasującym regionie. Pula rezydencjalna z targetowaniem kraju i miasta pozwala zobaczyć ceny tak, jak widzi je lokalny kupujący — niezbędne dla arbitrażu, benchmarkingu dealerów lub budowania modelu wyceny, który nie jest zniekształcony na jeden rynek.

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

To ten sam wzorzec zorientowany na lokalizację, który stoi za monitorowaniem cen konkurencji i zbieraniem danych o nieruchomościach — gdziekolwiek cena zależy od miejsca, w którym znajduje się kupujący, wyjścia z targetowaniem geograficznym są niezbędne.

Źródła aukcyjne i hurtowe

Strony z ogłoszeniami detalicznymi mówią, czego żądają dealerzy; platformy aukcyjne jak Copart pokazują, za ile samochody faktycznie zmieniają właściciela na poziomie hurtowym — druga połowa modelu wyceny. Te strony są bardziej chronione: Copart, na przykład, używa ochrony webowej Imperva z behawioralnym odciskiem palca, a wyzwania hCaptcha lub reCAPTCHA pojawiają się przy większych wolumenach żądań. Paginacja jest również bardziej restrykcyjna — 20 pojazdów na stronę z twardym limitem około 50 stron, więc pojedyncze wyszukiwanie ogranicza się do około 1 000 partii. Dotarcie do pełnego inwentarza oznacza segmentację zapytań według marki, modelu, zakresu lat, placu aukcyjnego lub stanu, dokładnie tak jak na stronach detalicznych, i uruchamianie każdego segmentu na własną rękę.

Ponieważ te platformy ładują wyniki i paginację za pomocą JavaScript i wyzywają podejrzany ruch, potrzebują rezydencjalnych IP i 2-5 sekundowej przerwy między żądaniami jako minimum. Proxy z centrum danych obsługują małe, okazjonalne pobrania; wszystko, co trwałe, należy do wyjść rezydencjalnych. Nagroda to prawdziwy sygnał: historia licytacji, status sprzedaży i stan partii zasilają prognozowanie popytu i analizę eksport-import, której same ceny detaliczne nie mogą dostarczyć.

Monitoruj, nie tylko skrob raz

Jednorazowy zrzut starzeje się natychmiast na rynku, gdzie ogłoszenia zmieniają się codziennie. Trwały wzorzec to zaplanowany scraping, który robi zrzuty Twoich wyszukiwań docelowych i porównuje kolejne uruchomienia — nowe ogłoszenia, spadki cen i sprzedane samochody. Kluczuj każdy wiersz według VIN, aby zmiana ceny na tym samym pojeździe była jednoznaczna, oznaczaj czasem każdy zrzut, a masz serię czasową, którą możesz śledzić: jak szybko deprecjonują się konkretne modele, które dealerzy obniżają ceny, gdzie rośnie zapas. Kieruj te zaplanowane uruchomienia przez rotujące rezydencjalne IP, aby codzienna praca z tego samego adresu nie zdobyła powoli blokady.

Często zadawane pytania

Czy można skrobać Cars.com i Autotrader?

Tak — strony z ogłoszeniami pokazują publicznie dostępne dane o pojazdach. Praktycznym wyzwaniem jest ochrona antybotowa: Cars.com używa Cloudflare, a inne używają Imperva z CAPTCHA. Proxy rezydencjalne, realistyczne nagłówki i 2-5 sekundowe opóźnienie między żądaniami utrzymują scraping w działaniu. Szanuj warunki korzystania z usług każdej strony i unikaj zbierania danych osobowych.

Jak uniknąć blokady podczas skrobania ogłoszeń samochodowych?

Rotuj rezydencjalne IP, aby żaden pojedynczy adres nie wykonywał zbyt wielu żądań, dostosuj tempo żądań z 2-5 sekundowym losowym opóźnieniem, wysyłaj prawdziwy User-Agent przeglądarki i segmentuj duże wyszukiwania na mniejsze zamiast przeglądać tysiące stron. Jeśli CAPTCHA nadal się pojawiają, przełącz się na Scraper API, które obsługuje warstwę antybotową i renderowanie JavaScript.

Dlaczego dostaję duplikaty samochodów podczas skrobania?

Dealerzy publikują ten sam pojazd na wielu rynkach, więc jeden fizyczny samochód pojawia się jako kilka ogłoszeń. Usuń duplikaty na podstawie VIN, który unikalnie identyfikuje pojazd niezależnie od strony. Kluczowanie według VIN zamienia duplikaty w porównanie cen dla tego samego samochodu w różnych źródłach, a nie w zawyżone liczby.

Czy ceny samochodów naprawdę zmieniają się w zależności od lokalizacji?

Tak. Inwentarz i ceny różnią się w zależności od regionu, a wiele stron personalizuje wyniki do kodu pocztowego wyszukującego. Aby uchwycić prawdziwy rozrzut, przeszukaj wiele kodów pocztowych i kieruj każde żądanie przez wyjście w pasującym regionie, używając rezydencjalnych proxy z targetowaniem geograficznym, aby zobaczyć lokalne ceny zamiast jednej zniekształconej krajowej perspektywy.

Scraping ogłoszeń motoryzacyjnych sprowadza się do dotarcia do każdego samochodu (segmentacja poza limitem ~1 000 wyników), przejścia przez zabezpieczenia antybotowe (rotujące rezydencjalne IP, uprzejme tempo), redukcji duplikatów według VIN i uchwycenia rozrzutu geograficznego za pomocą wyjść z targetowaniem lokalizacji. Zbuduj pipeline wokół ceny, przebiegu, VIN i dealera, a masz informacje o cenach dealerów na wszystkich głównych rynkach jednocześnie.

Rozpocznij scraping ogłoszeń samochodowych z QuantumProxies