Jak zeskrobać kursy bukmacherskie do modeli i badań arbitrażowych
Kursy zmieniają się co sekundę, a czyste dane nie znajdują się w HTML-u - są w wewnętrznym JSON-ie, który wywołuje front-end bukmachera. Oto jak je pobierać, normalizować między bukmacherami i unikać blokad podczas tego procesu.
Kursy bukmacherskie to najszybciej zmieniające się dane publiczne, które większość ludzi próbuje zeskrobać - linie zmieniają się co sekundę, a nieaktualna liczba to błędna liczba. Dobra wiadomość dla każdego, kto buduje modele lub bada arbitraż: prawie nigdy nie musisz analizować HTML-u tablicy wyników. Każdy nowoczesny front-end bukmachera jest zasilany wewnętrznym JSON API, i to tam znajdują się czyste, uporządkowane kursy. Ten przewodnik obejmuje, jak zeskrobywać kursy bukmacherskie z tych API, pobierać je wystarczająco szybko, aby były użyteczne, normalizować między bukmacherami i unikać blokad podczas tego procesu.
Znajdź wewnętrzne API kursów
Otwórz stronę wydarzenia bukmachera z narzędziami deweloperskimi przeglądarki na karcie Sieć, przefiltruj do XHR/Fetch i obserwuj żądania. Zobaczysz punkty końcowe JSON zwracające wydarzenia, rynki i ceny - te same dane, które strona renderuje, ale uporządkowane. Społecznościowe skrobaczki obejmujące ponad dziesięć północnoamerykańskich i australijskich bukmacherów (DraftKings, BetMGM, Caesars, BetRivers, PointsBet i inne) działają w ten sposób: wywołują nieudokumentowane wewnętrzne API zamiast analizować HTML, ponieważ JSON jest stabilny i kompletny. Przeczytaj go raz, a jedno żądanie daje ci każdy rynek dla wydarzenia.
import requests
proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}
# endpoint + params come from watching the site's own network calls
API = "https://sportsbook.example.com/api/v2/events/{event_id}/markets"
def get_markets(event_id):
r = requests.get(API.format(event_id=event_id), proxies=proxies,
timeout=15, headers={"User-Agent": "Mozilla/5.0"})
return r.json() # events -> markets -> selections with prices

Pobieraj szybko, ale nie głupio
Do treningu modeli wystarczy migawka co minutę; publiczna skrobaczka MLB, która pobiera kursy co 60 sekund przez czterogodzinne okno, to rozsądny punkt odniesienia. Do badań nad arbitrażem na żywo potrzebujesz ciaśniejszych interwałów, ale szybkie pobieranie z jednego IP to dokładnie sygnał, na który bukmacherzy zwracają uwagę. Odpowiedzią jest rozłożenie obciążenia: rotuj wyjściowe IP w każdym cyklu, aby żaden pojedynczy adres nie obciążał punktu końcowego. Normalizuj wszystko do kursów dziesiętnych i jednej linii na wybór, aby bukmacherzy byli bezpośrednio porównywalni:
import time
def american_to_decimal(a):
return round(1 + (a/100 if a > 0 else 100/abs(a)), 4)
def snapshot(event_id):
rows = []
for m in get_markets(event_id)["markets"]:
for sel in m["selections"]:
rows.append({
"ts": time.time(),
"market": m["name"],
"runner": sel["name"],
"decimal": american_to_decimal(sel["priceAmerican"]),
})
return rows
# poll on a steady interval; a rotating gateway gives a fresh IP each loop
while True:
save(snapshot("mlb-12345"))
time.sleep(60)
Rotacyjna brama rezydencyjna sprawia, że to jedno polecenie: skieruj każde żądanie na jeden punkt końcowy, a on automatycznie przydzieli ci nowe IP, więc pobieranie co minutę nigdy nie wygląda jak z jednej maszyny. Gdy przepływ wymaga tego samego IP na krótki czas - na przykład dla rynku związanego z sesją - przełącz się na sesję stałą. Nasz przewodnik po sesjach stałych vs rotacyjnych wyjaśnia, kiedy każda z nich pasuje.
Uzyskaj rotacyjne rezydencyjne IP dla danych kursów
Licencjonowanie geograficzne to również problem danych
Zakłady sportowe są licencjonowane w poszczególnych jurysdykcjach, więc kursy, które pokazuje bukmacher - i czy w ogóle cię obsługuje - zależą od miejsca, z którego pochodzi żądanie. Linia DraftKings w New Jersey może różnić się od tego samego rynku w innym stanie, a niektórzy bukmacherzy całkowicie blokują geograficznie. To nie tylko szczegół zgodności; to zmienia dane. Jeśli porównujesz lub arbitrażujesz między regionami, przypnij wyjściowy proxy do rynku, który studiujesz, aby kursy były takie, jakie widziałby prawdziwy gracz tam. QuantumProxies obejmuje ponad 200 krajów i stanów USA, więc możesz pobierać linie dokładne dla regionu bez stosu lokalnych maszyn. Zobacz nasz przewodnik po zeskrobywaniu opłat lokalizacyjnych dla tej samej zasady geograficznej zastosowanej do taryf.
Przechowuj kursy, aby ruchy linii były zapytaniami
Dane kursów są użyteczne tylko wtedy, gdy możesz zadawać pytania o ich historię, więc przechowuj je jako szereg czasowy od pierwszego dnia. Dodawaj każdą migawkę zamiast nadpisywać - jedna linia na bukmachera, rynek, wybór i znacznik czasu - abyś mógł dokładnie odtworzyć, co każdy bukmacher oferował w danym momencie. Ta struktura tylko do dodawania pozwala obliczyć ruchy linii (jak cena dryfowała przed rozpoczęciem), wykryć ruchy parowe (wiele bukmacherów zmieniających się razem) i przetestować model wstecznie na kursach, które były faktycznie dostępne, a nie dzisiejszych. Nadpisanie tylko najnowszej ceny i tracisz najcenniejszy sygnał w całym zbiorze danych.
Dwie praktyczne uwagi. Po pierwsze, oznaczaj czas przy przechwytywaniu, a nie przy analizie, i zapisuj lokalizację wyjściową obok każdej linii - kursy są specyficzne dla regionu, więc "DraftKings, NJ, 14:32:05" to inny punkt danych niż ten sam bukmacher w innym stanie. Po drugie, deduplikuj na naturalnym kluczu (bukmacher + rynek + wybór + znacznik czasu), aby ponowione żądanie po upływie czasu nie podwajało ceny. Z tą strukturą porównywanie bukmacherów pod kątem przewag międzyrynkowych staje się prostym zapytaniem zamiast chaosem, a twoje badania nad arbitrażem lub modelowaniem działają na czystej, audytowalnej historii. To ta sama dyscyplina monitorowania, którą nasz przewodnik po monitorowaniu zapasów i dostępności stosuje do inwentarza - tylko tutaj wartości zmieniają się co sekundę.
Ściany botów i kiedy sięgnąć po API
Nie każdy bukmacher jest równie łatwy. Niektórzy są za silną detekcją botów i szybko zablokują naiwną skrobaczkę; inni są po prostu wolni, wymuszając jedno żądanie na grupowanie rynku. Gdy cel renderuje kursy dopiero po ciężkim JavaScript, lub walczy z tobą za pomocą odcisków palców, surowe żądanie przestaje być wystarczające. Scraper API, które przenosi prawdziwy odcisk przeglądarki, rotuje IP i renderuje JS na żądanie, jest zazwyczaj mniej pracochłonne niż utrzymywanie tego stosu samodzielnie - i zwraca przetworzone dane. Jedna linia po stronie prawnej: zeskrobywanie publicznych kursów do analizy jest powszechne, ale regulaminy bukmacherów często ograniczają automatyczny dostęp, a działalność jest regulowana - to wskazówki, a nie porady prawne czy dotyczące zakładów, więc sprawdź swoją jurysdykcję.

Często zadawane pytania
Jak zeskrobać kursy bukmacherskie za pomocą Pythona?
Obserwuj kartę Sieć bukmachera, aby znaleźć wewnętrzne JSON API, które wywołuje jego front-end, a następnie bezpośrednio żądaj tego punktu końcowego przez proxy i analizuj uporządkowaną odpowiedź. Normalizuj wszystko do kursów dziesiętnych z jedną linią na wybór, aby bukmacherzy byli porównywalni. To jest znacznie bardziej stabilne niż analizowanie renderowanego HTML-u tablicy wyników, który ciągle się zmienia.
Jak często powinienem pobierać kursy?
Do treningu modeli wystarczy zazwyczaj co 30-60 sekund; powszechnym punktem odniesienia jest migawka kursów co minutę. Badania nad arbitrażem wymagają ciaśniejszych interwałów, ale szybkie pobieranie z jednego IP jest flagowane - rotuj wyjściowe IP w każdym cyklu przez pulę rezydencyjną, aby obciążenie rozkładało się na wiele adresów zamiast jednego.
Dlaczego kursy różnią się, gdy zeskrobuję je z innej lokalizacji?
Bukmacherzy są licencjonowani na poziomie jurysdykcji, więc linie i dostępność różnią się w zależności od stanu lub kraju, a niektórzy bukmacherzy całkowicie blokują geograficznie. Lokalizacja wyjściowa żądania decyduje, który rynek widzisz. Aby zebrać kursy dokładne dla regionu, przypnij wyjściowe proxy do jurysdykcji, którą studiujesz, zamiast zakładać, że istnieje jedna globalna cena.
Czy zeskrobywanie kursów bukmacherskich jest legalne?
Zbieranie publicznie wyświetlanych kursów do analizy jest powszechnie praktykowane, ale regulaminy bukmacherów często zabraniają automatycznego dostępu, a zakłady sportowe są ściśle regulowane przez region. Traktuj dane jako publiczne wejście do badań, respektuj regulaminy każdej strony i dyrektywy robots, i sprawdź zasady w miejscu, w którym działasz. To ogólne wskazówki, a nie porady prawne czy dotyczące zakładów.
Dobre zeskrobywanie kursów sprowadza się do czterech kroków: odczytaj wewnętrzny JSON, pobieraj dane w stałym tempie, rotuj rezydencyjne IP, aby żaden adres się nie wyróżniał, i dopasuj wyjściowe geo do rynku. Zrób to dobrze, a otrzymasz czysty, dokładny dla regionu strumień kursów - surowiec dla każdego modelu lub badań nad przewagami.