Как собирать коэффициенты букмекерских контор для моделей и арбитражных исследований

Коэффициенты меняются каждую секунду, и чистые данные находятся не в HTML - они в внутреннем JSON, который запрашивает интерфейс букмекерской конторы. Вот как их опрашивать, нормализовать по книгам и оставаться незаблокированным при этом.

Коэффициенты букмекерских контор - это самые быстро меняющиеся публичные данные, которые большинство людей когда-либо пытаются собирать - линии меняются каждую секунду, и устаревшее число - это неверное число. Хорошая новость для тех, кто строит модели или исследует арбитраж: почти никогда не нужно разбирать HTML табло. Каждый современный интерфейс букмекерской конторы питается от внутреннего JSON API, и именно там находятся чистые, структурированные коэффициенты. Это руководство охватывает, как собирать коэффициенты букмекерских контор из этих API, опрашивать их достаточно быстро, чтобы это было полезно, нормализовать по книгам и оставаться незаблокированным при этом.

Найдите внутренний API коэффициентов

Откройте страницу события букмекерской конторы с инструментами разработчика вашего браузера на вкладке Network, отфильтруйте по XHR/Fetch и следите за запросами. Вы увидите JSON endpoints, возвращающие события, рынки и цены - те же данные, которые отображает страница, но в структурированном виде. Сообщества скраперов, охватывающие более десяти североамериканских и австралийских книг (DraftKings, BetMGM, Caesars, BetRivers, PointsBet и другие), работают именно так: они обращаются к недокументированному внутреннему API, а не разбирают HTML, потому что JSON стабилен и полон. Прочтите его один раз, и один запрос даст вам все рынки для события.

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
Диаграмма цикла скрапинга коэффициентов букмекерской конторы от нахождения внутреннего JSON API до нормализации и сравнения книг
Собственный JSON API интерфейса - это чистый источник - опрашивайте его, не перерисовывая страницу каждый цикл.

Опрашивайте быстро, но не глупо

Для обучения моделей снимок каждую минуту вполне достаточен; публичный скрапер MLB, который опрашивает коэффициенты на победу каждые 60 секунд в течение четырехчасового окна, является разумной ссылкой. Для исследований живого арбитража вам потребуется более плотный опрос, но плотный опрос с одного IP - это именно та сигнатура, которую книги отслеживают. Ответ - распределить нагрузку: вращайте выходной IP каждый цикл, чтобы ни один адрес не нагружал endpoint. Нормализуйте все до десятичных коэффициентов и одной строки на выбор, чтобы книги были напрямую сравнимы:

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)

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

Получите вращающиеся резидентные IP для данных коэффициентов

Геолицензирование - это тоже проблема данных

Ставки на спорт лицензируются по юрисдикциям, поэтому коэффициенты, которые показывает книга - и вообще, обслуживает ли она вас - зависят от того, откуда исходит запрос. Линия DraftKings в Нью-Джерси может отличаться от того же рынка в другом штате, и некоторые книги полностью блокируют гео. Это не просто вопрос соблюдения требований; это меняет данные. Если вы проводите бенчмаркинг или арбитраж по регионам, закрепите выход прокси за рынком, который вы изучаете, чтобы коэффициенты были такими, какие увидел бы реальный игрок там. QuantumProxies охватывает более 200 стран и штатов США, так что вы можете получать регионально точные линии без целого ряда локальных машин. См. наше руководство по скрапингу на основе местоположения для применения того же геопринципа к тарифам.

Храните коэффициенты, чтобы изменения линий были доступны для запросов

Данные коэффициентов полезны только если вы можете задавать вопросы о их истории, поэтому храните их как временные ряды с первого дня. Добавляйте каждый снимок, а не перезаписывайте - одна строка на книгу, рынок, выбор и временную метку - чтобы вы могли точно восстановить, что каждая книга предлагала в любой момент. Эта структура только для добавления позволяет вычислять движение линий (как цена изменилась до начала игры), обнаруживать паровые движения (многие книги меняются вместе) и тестировать модель на коэффициентах, которые действительно были доступны, а не на сегодняшних. Перезаписывайте только последнюю цену, и вы выбрасываете самый ценный сигнал во всем наборе данных.

Два практических замечания. Во-первых, временная метка при захвате, а не при разборе, и записывайте местоположение выхода вместе с каждой строкой - коэффициенты специфичны для региона, так что "DraftKings, NJ, 14:32:05" - это другая точка данных, чем та же книга в другом штате. Во-вторых, удаляйте дубликаты по естественному ключу (книга + рынок + выбор + временная метка), чтобы повторный запрос после тайм-аута не удваивал цену. С этой структурой сравнение книг для межрыночных преимуществ становится простым запросом, а не суетой, и ваши арбитражные или моделирующие исследования работают с чистой, проверяемой историей. Это та же дисциплина мониторинга, которую наше руководство по мониторингу запасов и доступности применяет к инвентаризации - только здесь значения меняются каждую секунду.

Бот-стены и когда обратиться к API

Не каждая книга одинаково проста. Некоторые находятся за сильной защитой от ботов и быстро блокируют наивного скрапера; другие просто медленные, вынуждая делать один запрос на каждую группу рынков. Когда цель отображает коэффициенты только после тяжелого JavaScript или борется с вами с помощью отпечатков пальцев, простого запроса недостаточно. Scraper API, который использует настоящий отпечаток браузера, вращает IP и рендерит JS по запросу, обычно требует меньше усилий, чем поддержка этого стека самостоятельно - и он возвращает разобранный полезный груз. Одна строка на легальной стороне: сбор публичных коэффициентов для аналитики распространен, но условия использования букмекерских контор часто ограничивают автоматизированный доступ, и эта деятельность регулируется - это руководство, а не советы по ставкам или юридические консультации, так что проверьте свою юрисдикцию.

Список сравнения эффективных практик скрапинга коэффициентов букмекерских контор с шаблонами, которые блокируют скрапер
Книги следят за всплесками с одного IP и игнорированием гео-блокировок - вращайте, соответствуйте гео и темпу, чтобы оставаться в.

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

Как собрать коэффициенты ставок с помощью Python?

Следите за вкладкой Network букмекерской конторы, чтобы найти внутренний JSON API, который вызывает ее интерфейс, затем запрашивайте этот endpoint напрямую через прокси и разбирайте структурированный ответ. Нормализуйте все до десятичных коэффициентов с одной строкой на выбор, чтобы книги были сравнимы. Это гораздо стабильнее, чем разбор отрисованного HTML табло, который постоянно меняется.

Как часто я должен опрашивать коэффициенты?

Для обучения моделей каждые 30-60 секунд обычно достаточно; общая ссылка - снимок коэффициентов на победу каждую минуту. Исследования арбитража требуют более плотных интервалов, но быстрый опрос с одного IP вызывает флаги - вращайте выходной IP каждый цикл через резидентный пул, чтобы нагрузка распределялась по многим адресам, а не одному.

Почему коэффициенты отличаются, когда я собираю их из другого местоположения?

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

Является ли сбор коэффициентов букмекерских контор законным?

Сбор публично отображаемых коэффициентов для аналитики широко распространен, но условия использования букмекерских контор часто запрещают автоматизированный доступ, и ставки на спорт строго регулируются по регионам. Рассматривайте данные как входные данные для публичных исследований, уважайте условия каждого сайта и директивы robots, и проверьте правила в месте вашей деятельности. Это общее руководство, а не юридическая или консультация по ставкам.

Хороший сбор коэффициентов сводится к четырем шагам: читайте внутренний JSON, опрашивайте с устойчивой частотой, вращайте резидентные IP, чтобы ни один адрес не выделялся, и соответствуйте выходное гео рынку. Если вы сделаете это правильно, у вас будет чистая, регионально точная лента коэффициентов - сырье для любой модели или исследования поиска преимуществ.

Собирайте коэффициенты в масштабе с помощью Scraper API