Hoe Sportsbook Odds te Scrapen voor Modellen en Arbing Onderzoek
Odds veranderen per seconde, en de schone data staat niet in de HTML - het zit in de interne JSON die de frontend van de sportsbook zelf aanroept. Hier is hoe je het kunt opvragen, normaliseren over verschillende boeken, en geblokkeerd blijven terwijl je het doet.
Sportsbook odds zijn de snelst veranderende openbare data die de meeste mensen ooit proberen te scrapen - lijnen verschuiven per seconde, en een verouderd getal is een verkeerd getal. Het goede nieuws voor iedereen die modellen bouwt of arbitrage onderzoekt: je hoeft bijna nooit de scoreboard HTML te parseren. Elke moderne sportsbook frontend wordt gevoed door een interne JSON API, en daar leven de schone, gestructureerde odds. Deze gids behandelt hoe je sportsbook odds kunt scrapen van die APIs, ze snel genoeg kunt polleren om nuttig te zijn, normaliseren over boeken, en geblokkeerd blijven terwijl je het doet.
Vind de interne odds API
Open een sportsbook evenementpagina met je browser dev tools op het Netwerk tabblad, filter op XHR/Fetch, en bekijk de requests. Je zult JSON endpoints zien die evenementen, markten en prijzen retourneren - dezelfde data die de pagina rendert, maar gestructureerd. Community scrapers die meer dan tien Noord-Amerikaanse en Australische boeken dekken (DraftKings, BetMGM, Caesars, BetRivers, PointsBet, en anderen) werken allemaal op deze manier: ze roepen de niet-gedocumenteerde interne API aan in plaats van HTML te parseren, omdat de JSON stabiel en compleet is. Lees het een keer, en één request geeft je elke markt voor een evenement.
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

Poll snel, maar niet dom
Voor modeltraining is een momentopname elke minuut voldoende; een openbare MLB scraper die elke 60 seconden moneylines pollt over een venster van vier uur is een verstandige referentie cadans. Voor live arbitrage onderzoek wil je strakker, maar strakker polleren van een enkel IP is precies het kenmerk waar boeken op letten. Het antwoord is om de belasting te spreiden: roteer het exit IP elke cyclus zodat geen enkel adres de endpoint hamert. Normaliseer alles naar decimale odds en één rij per selectie zodat boeken direct vergelijkbaar zijn:
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)
Een roterende residentiële gateway maakt dit een one-liner: richt elke request naar één endpoint en het geeft je automatisch een nieuw IP, zodat een minuut-tot-minuut poll nooit als één machine lijkt. Wanneer een flow hetzelfde IP nodig heeft voor een korte uitbarsting - bijvoorbeeld, een sessiegebonden markt - schakel dan over naar een sticky sessie. Onze gids over sticky vs roterende sessies behandelt wanneer elk past.
Verkrijg roterende residentiële IP's voor odds data
Geo-licenties zijn ook een dataprobleem
Sportweddenschappen zijn per jurisdictie gelicentieerd, dus de odds die een boek toont - en of het je überhaupt bedient - hangen af van waar de request vandaan komt. Een DraftKings lijn in New Jersey kan verschillen van dezelfde markt in een andere staat, en sommige boeken blokkeren volledig op basis van geolocatie. Dat is niet alleen een nalevingsdetail; het verandert de data. Als je benchmarks of arbing over regio's doet, pin dan de proxy exit naar de markt die je bestudeert zodat de odds zijn zoals een echte gokker daar ze zou zien. QuantumProxies dekt 200+ landen en Amerikaanse staten, zodat je regio-nauwkeurige lijnen kunt trekken zonder een rek vol lokale machines. Zie onze locatie-gebaseerde scraping gids voor hetzelfde geo-principe toegepast op tarieven.
Sla odds op zodat lijnbewegingen opvraagbaar zijn
Odds data is alleen nuttig als je vragen kunt stellen over de geschiedenis ervan, dus sla het vanaf dag één op als tijdreeks. Voeg elke momentopname toe in plaats van te overschrijven - één rij per boek, markt, selectie en tijdstempel - zodat je precies kunt reconstrueren wat elk boek op elk moment aanbood. Die append-only vorm is wat je in staat stelt om lijnbewegingen te berekenen (hoe een prijs dreef voor de aftrap), stoombewegingen te detecteren (veel boeken die samen verschuiven), en een model te back-testen tegen de odds die daadwerkelijk beschikbaar waren, niet die van vandaag. Overschrijf alleen de laatste prijs en je gooit het meest waardevolle signaal in de hele dataset weg.
Twee praktische notities. Ten eerste, timestamp bij capture, niet bij parse, en registreer de exitlocatie naast elke rij - odds zijn regio-specifiek, dus "DraftKings, NJ, 14:32:05" is een ander datapunt dan hetzelfde boek in een andere staat. Ten tweede, deduplicateer op de natuurlijke sleutel (boek + markt + selectie + tijdstempel) zodat een herhaalde request na een timeout een prijs niet dubbel telt. Met die structuur wordt het vergelijken van boeken voor cross-market edges een eenvoudige query in plaats van een scramble, en je arbing of modellering onderzoek draait tegen een schone, controleerbare geschiedenis. Het is dezelfde monitoringdiscipline die onze gids over restock en beschikbaarheidsmonitoring toepast op voorraad - alleen hier bewegen de waarden per seconde.
Botmuren en wanneer een API te gebruiken
Niet elk boek is even gemakkelijk. Sommige zitten achter sterke botdetectie en zullen een naïeve scraper snel blokkeren; anderen zijn gewoon traag, wat één request per marktgroeping afdwingt. Wanneer een doelwit odds alleen rendert na zware JavaScript, of je bestrijdt met fingerprinting, is een ruwe request niet genoeg. Een Scraper API die een echte browser fingerprint draagt, IP's roteert en JS op aanvraag rendert is meestal minder werk dan die stack zelf onderhouden - en het retourneert de geparseerde payload. Eén regel aan de juridische kant: het scrapen van openbare odds voor analyses is gebruikelijk, maar sportsbook voorwaarden beperken vaak geautomatiseerde toegang en de activiteit is gereguleerd - dit is een leidraad, geen gok- of juridisch advies, dus controleer je jurisdictie.

Veelgestelde vragen
Hoe kan ik betting odds scrapen met Python?
Bekijk het Netwerk tabblad van de sportsbook om de interne JSON API te vinden die de frontend aanroept, vraag dan dat endpoint direct aan via een proxy en parseer de gestructureerde respons. Normaliseer alles naar decimale odds met één rij per selectie zodat boeken vergelijkbaar zijn. Dit is veel stabieler dan het parseren van de gerenderde scoreboard HTML, die constant verandert.
Hoe vaak moet ik polleren voor odds?
Voor modeltraining is elke 30-60 seconden meestal genoeg; een veelgebruikte referentie is een moneyline momentopname elke minuut. Arbitrage onderzoek vereist strakkere intervallen, maar snel polleren vanaf één IP wordt geflagd - roteer het exit IP elke cyclus door een residentieel pool zodat de belasting over veel adressen wordt verspreid in plaats van één.
Waarom verschillen odds wanneer ik scrape vanaf een andere locatie?
Sportsbooks zijn per jurisdictie gelicentieerd, dus lijnen en beschikbaarheid variëren per staat of land, en sommige boeken blokkeren volledig op basis van geolocatie. De exitlocatie van de request bepaalt welke markt je ziet. Om regio-nauwkeurige odds te verzamelen, pin je proxy exit naar de jurisdictie die je bestudeert in plaats van aan te nemen dat er één wereldwijde prijs bestaat.
Is het legaal om sportsbook odds te scrapen?
Het verzamelen van openbaar weergegeven odds voor analyses wordt veel gedaan, maar sportsbook voorwaarden verbieden vaak geautomatiseerde toegang, en sportweddenschappen zijn zwaar gereguleerd per regio. Behandel de data als openbare onderzoeksinput, respecteer de voorwaarden en robots richtlijnen van elke site, en controleer de regels waar je opereert. Dit is algemene richtlijn, geen juridisch of gokadvies.
Odds goed scrapen komt neer op vier stappen: lees de interne JSON, poll op een constante cadans, roteer residentiële IP's zodat geen enkel adres opvalt, en match de exit geo met de markt. Krijg die goed en je hebt een schone, regio-nauwkeurige odds feed - het ruwe materiaal voor elk model of edge-jacht onderzoek.