Зарабатывайте на Python - проект спортивного арбитража

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

Итак, вы, наконец, закончили курс, который учит вас основам Python; вы узнали, как работают списки, словари, циклы и условные выражения, но вы все еще не можете зарабатывать деньги с помощью своих навыков Python. Я оказался в этой ситуации после 1 года изучения Python; К счастью, вы можете заработать дополнительные деньги, зная Python, Selenium и спортивный арбитраж.

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

В этом руководстве я расскажу вам полный код, необходимый для очистки данных о ставках в реальном времени с 3 сайтов ставок, которые найдут для нас вилки. Есть 2 типа вилок: предматчевые и лайв вилки. Мы сосредоточимся на живых вилках, потому что они наиболее прибыльны, но их немного сложно очистить, поскольку данные являются «динамическими».

Учебное пособие будет разделено на 4 раздела:

  1. Очистка данных о ставках Live с помощью Selenium: в Selenium мы будем использовать WebdriverWait, Ожидаемые условия (EC) и Select. Кроме того, мы настроим параметры хромодрайвера по умолчанию для очистки фона. Некоторые важные вещи Python, которые нам нужны, - это блоки и списки try-except.
  2. Очистка и преобразование данных о шансах в реальном времени: данные о шансах от разных букмекеров бывают разных форм, поэтому нам нужно правильно их отформатировать, чтобы иметь возможность сравнивать их и находить вилки. Для этого пригодится библиотека Pandas.
  3. Соответствующие названия команд: букмекеры различаются способом написания одних и тех же названий команд. Некоторые могут писать New York City FC, в то время как другие будут называть его только NYC FC, поэтому нам нужно сначала выполнить сопоставление строк. Мы будем использовать для этого Fuzzywuzzy.
  4. Поиск вилок и расчет ставок: мы создадим функции Python, которые находят вилки, рассчитывают ставки для нас и сообщают нам потенциальную прибыль.
проверка купона 1win

Вам не о чем беспокоиться, если вы никогда раньше не использовали расширенные инструменты на Selenium или библиотеки, такие как Pandas или Fuzzywuzzy. Я объясню, как они работают, шаг за шагом, когда они нам понадобятся.

Тем не менее, некоторые основы работы с Selenium потребуются, чтобы следовать этому руководству; в противном случае объяснение было бы слишком длинным. Я сделал еще один урок, в котором объяснил самые основы веб-парсинга на примере вилок перед матчем. Здесь у вас есть напоминание.

Основы веб-скрейпинга - парсинг сайта для ставок за 10 минут

В этом 10-минутном руководстве я покажу вам, как очищать веб-сайты с помощью Python, даже если вы вообще не программируете!

Кроме того, прежде чем мы начнем писать код, убедитесь, что вы полностью знакомы с концепцией вилок, чтобы код, который мы собираемся написать, имел для вас смысл.

Примечание: я создал прибыльный инструмент для ставок с помощью Python Selenium и Pandas. В статье ниже я показываю полный код и объясняю, как я это сделал.

Раньше я платил 180 долларов в год за инструмент для прибыльных ставок. В этом году я построил его на Python

Полный код для создания инструмента для ставок на футбол с помощью Pandas и Selenium.

Время писать код

Мы будем собирать данные в реальном времени с 3 сайтов ставок. Мы начнем с данных матчей в режиме реального времени на сайте ставок «Tipico». Для тех, кто следил за моим предыдущим руководством по парсингу, это будет аналогичный подход, но с расширенными инструментами, необходимыми для получения данных о шансах в реальном времени.

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

Приступим к кодированию! Полный код доступен в конце раздела 4.

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

Обновление 21 марта 2021 года:

  1. Я загрузил примеры вывода в формате CSV парсеров Tipico, Betfair и Bwin на myGithub, чтобы вы имели представление о том, как выглядит результат раздела 1 (Сбор данных о ставках Live с помощью Selenium). Однако эти данные все еще необходимо предварительно обработать в разделах 2 и 3 перед поиском вилок.
  2. В раскрывающихся списках сайта ставок Tipico имена немного изменились. Изначально название было «Обе команды забьют?» но теперь это «Обе команды забьют». В приведенном ниже коде учитываются новые имена.

Обновление 22 апреля 2021 г .: (только на сайте Tipico)

  1. Судя по всему, доступ к сайту из некоторых стран невозможен. Если это так, используйте VPN и подключитесь к какой-нибудь стране в Европе (TunnelBear подходит для меня, и это бесплатно)
  2. На сайте были внесены серьезные изменения в живой раздел. Теперь раздел предварительного сопоставления и реального времени находится внутри одного контейнера с именем «Program_UPCOMING», поэтому, чтобы скребок работал, мне пришлось удалить и добавить несколько строк кода, которые я указал в полном коде, доступном в конце статьи, а также в фрагменты ниже.
  3. Похоже, что веб-сайт теперь работает с некоторой функцией, которая не позволяет отображать все события в живом разделе (если вы не прокрутите до конца). Если вы видите, что не все события были отменены, используйте приведенный ниже код, чтобы прокрутить все путь вниз и очистить все события. (Я включаю это только в полный код, на случай, если он вам понадобится)

4. Я обновил URL-адрес веб-сайта, чтобы очистить его, и теперь он попадает прямо в раздел «футбол» (это помогает упростить код).

Если код перестанет работать, дайте мне знать в комментариях!

1. Сбор данных о ставках Live с помощью Selenium

Импорт библиотек

Нам нужно импортировать параметры, чтобы изменить параметры хромодрайвера по умолчанию; Выберите для выбора в раскрывающихся меню и By, WebDriverWait, EC, время ожидания наступления определенного условия.

Изменение параметров Chromedriver по умолчанию

Чтобы продолжать парсить, делая что-то еще на компьютере, нам нужно использовать безголовый режим. Для этого напишем следующий код:

Нарушение кода:

  • options = Options () создает экземпляр класса Options
  • options.headless = True включает безголовый режим
  • options.add_argument ('window-size = 1920x1080') открывает окна настраиваемого размера на заднем плане.
  • webdriver.Chrome (path, options = options) применяет изменения, которые мы внесли в chromedriver
  • driver.get открывает браузер
  • web представляет собой URL-адрес сайта ставок, а path представляет путь хромодрайвера на вашем компьютере.

Если вы не хотите работать в безголовом режиме, напишите option.headless = False и используйте driver.maximize_window () вместо options.add_argument ('window-size = 1920x1080'), как показано в полном коде.

Выберите значения из раскрывающихся меню

Нам нужно выбрать рынки ставок, с которых мы хотим получить данные. Мы делаем это с помощью Select и Xpath раскрывающегося списка. Чтобы получить Xpath, сделайте следующее:

Но сначала имейте в виду, что каждый раз, когда вы открываете некоторые сайты ставок, отображается баннер cookie. Нам нужно избавиться от них, нажав кнопку «принять».

Чтобы нажать кнопку «принять», а затем выбрать в раскрывающемся меню, мы пишем следующий код:

Нарушение кода:

  • WebDriverWait (driver, 5) .until (EC.element_to_be_clickable ((By.XPATH, '// * [@ id = "_ evidon-accept-button"]'))) заставляет драйвер ждать, пока кнопка ОК Баннер cookie доступен для кликов. Если это вызывает ошибку, используйте вместо этого «вариант 2». Чтобы получить Xpath, щелкните правой кнопкой мыши кнопку «ОК» и проверьте, как мы делали раньше, для раскрывающегося меню.
  • WebDriverWait (driver, 5) .until (EC.presence_of_all_elements_located ((By.CLASS_NAME, '.'))) Заставляет драйвер ждать несколько секунд, пока не появятся раскрывающиеся меню
  • Выбрать ('.') Выбирает раскрывающиеся меню
  • first_dropdown одно из трех раскрывающихся списков, содержащих рынки ставок
  • first_dropdown.select_by_visible_text () выбирает элемент внутри выпадающего меню с помощью названия рынка ставок.

Я выбираю «Обе команды забьют» и «Больше / Меньше», в частности, потому что они представляют собой рынки ставок, на которых, как мне кажется, легко найти вилки.

Ищете "прямые трансляции" и "спортивные игры"

Прежде чем получить данные, нам нужно сначала найти живые события. Также для упрощения анализа выберем только «футбол» в названиях видов спорта. Для этого напишем следующий код:

Нарушение кода:

  • box представляет собой поле, содержащее спортивные события. На сайте также есть предстоящие события, которые нам не нужны для этого анализа.
  • driver.find_ element_by_xpath () помогает нам найти элемент на веб-сайте через «Xpath» этого элемента.

В отличие от Xpath из большинства элементов, с которыми мы работали раньше, элемент «живые события» получить сложнее. По этой причине нам нужно быть очень конкретными. Затем мы используем параметр contains для сопоставления элемента, который содержит Program_LIVE внутри testid в теге div. Проверьте изображение ниже, чтобы найти Program_UPCOMING (Program_LIVE больше не отображается после изменений, внесенных на веб-сайте)

Прежде чем мы продолжим код, нам нужно понять схему, которая поможет нам очистить данные в реальном времени.

Схема для парсинга живых игр

Схема очистки живых игр аналогична той, которая используется для очистки предматчевых игр. Однако живые игры на сайте ставок Tipico включают в себя «двухрядные события» и «пустые события», которые нам необходимо исключить.

  • Спортивное название: представляет спортивный раздел. На сайте доступно множество видов спорта, но мы сосредоточимся только на футболе, поскольку это самый популярный вид спорта.
  • Двухрядные соревнования: Футбольные прямые трансляции в первом тайме (0–45) состоят из 2 рядов. Первая строка содержит коэффициенты на полную игру, а вторая - только на первую половину. Будем работать только с первым рядом.
  • Однорядное событие: футбольные live-события во второй половине (45'-90 ') содержат только одну строку, которая содержит коэффициенты на оставшуюся часть игры.
  • odds_event: представляет шансы, доступные в строке. Каждая строка имеет 1 «odds_event», а каждое «odds_event» имеет 3 поля с рынками «3-ходовые», «Больше / Меньше» и «Гандикап» по умолчанию.
  • Пустые события: ставки Live могут быть приостановлены на пару секунд по многим причинам. Мы не будем рассматривать строки с пустыми событиями, чтобы упростить анализ.

Найдите "пустые события"

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

Нарушение кода:

  • для спорта в sport_title перемещается по ранее полученному списку видов спорта (обновление: больше не требуется)
  • parent представляет «родительский узел» спортивного элемента, а grandparent - его «дедушка и бабушка», который представляет весь контейнер «футбол» внутри живых событий (обновление: теперь мы должны сделать это 3 раза, чтобы добраться до желаемого узла, как показано в коде)
  • empty_groups представляет каждый футбольный матч с приостановленными или пустыми коэффициентами
  • granparent.find_elements_by_class_name () дает список всех пустых коэффициентов с именем класса «EventOddGroup-styles-empty-group» внутри футбольной секции live. Вы можете получить имя класса, выполнив следующие действия:

  • empty_events представляет каждую строку или футбольный матч с хотя бы одним пустым рынком коэффициентов (3 исхода, больше / меньше и т. д.)
  • [empty_group.find_element_by_xpath ('./ ..') для empty_group в empty_groups] - это понимание списка, которое просматривает список empty_groups для получения «родительского узла» каждого элемента, то есть empty_events
  • except обрабатывает ошибки, которые могут возникнуть в блоке try. Нам это нужно для обработки ошибок, когда нет ни одной игры с пустыми шансами.

Удалите empty_events из single_row_events

Мы находим события одной строки и удаляем все пустые события внутри с помощью следующего кода:

Нарушение кода:

  • single_row_events представляют первую строку событий с двумя строками или уникальную строку событий с одной строкой. Как мы объясняли ранее, оба представляют собой коэффициенты для всей игры, и мы фокусируемся на них, потому что чаще встречаются вилки в коэффициентах, рассчитанных для всей игры. Найдите имя класса однорядных событий, проверив любую отдельную строку. Вы должны найти имя этого класса 'EventRow-styles-event-row'
  • [single_row_event для single_row_event в single_row_events, если single_row_event не в empty_events] понимание списка, которое исключает любые пустые игры внутри single_row_events
  • try / except обрабатывает ошибки, которые могли возникнуть, когда нет ни одной игры с пустыми шансами

Получение живых коэффициентов

В каждом выбранном ранее раскрывающемся списке будут указаны коэффициенты для трех рынков, которые извлекаются с помощью следующего кода:

Нарушение кода:

  • for match in single_row_events перебирает все совпадения внутри списка single_row_events
  • odd_events представляют каждое событие с доступными шансами
  • match.find_elements_by_class_name ('EventOddGroup-styles-odd-groups') помогает нам найти все 'odds_event' в каждом матче. Чтобы найти имя класса 'EventOddGroup-styles-odd-groups', просто щелкните правой кнопкой мыши и проверьте код за 'odds box', как мы делали раньше для пустых коэффициентов.
  • for team в match.find_elements_by_class_name ('EventTeams-styles-title') перебирает элементы с именем класса 'EventTeams-styles-title' в узле 'match'. В матчах участвуют 2 команды (хозяева и гости); вот почему нам нужно перебрать их и получить их имя с помощью team.text. Затем они сохраняются с помощью метода добавления в список команд.
  • for odd_event в odds_events перебирает общее количество живых матчей на сайте ставок.
  • for n, box в enumerate (odds_events) перебирает все «коробки шансов» внутри матча. Вначале мы изменили выпадающие списки на «3 исхода», «Больше / меньше» и «Обе команды забьют», так что это те шансы, которые мы будем очищать.
  • rows = box.find_elements_by_xpath ('.//*') дает все дочерние узлы (шансы) внутри элемента box.
  • n == 0 означает «принимать значения только из первого поля». В этом случае первое поле является трехсторонним и сохраняется в списке x12.
  • rows [0] сообщает Python, что «выбирает только первую строку в каждом поле шансов». При этом мы проигнорировали вторую строку в двухрядных событиях.

Тот же процесс выполняется для n == 1 (больше / меньше) и n == 2 (BTTS), но в n == 1 нам также необходимо сохранить «линию целей». Это общее количество голов, которое вам нужно, чтобы выиграть ставку.

Например, более 2,5 голов означают как минимум 3 гола для выигрыша ставки. Давайте разберем код для n == 1.

  • box.find_element_by_xpath ('./ ..') задает «родительский узел» элемента box, который содержит коэффициенты.
  • goal = parent.find_element_by_class_name ('EventOddGroup-styles-fixed-param-text'). text находит линию цели, задавая имя класса. Просто щелкните правой кнопкой мыши и осмотрите линию ворот (показанную на рисунке выше), чтобы узнать название класса. Затем мы получаем данные с .text
  • over_under.append (goal + '\ n' + rows [0] .text) добавляет данные строки целей в стандартном формате. Формат коэффициентов больше / меньше будет выглядеть так: 2.5 \ n2.4 \ n1.5
  • driver.quit () закрывает браузер Chrome

На этом зачистка готова! Теперь нам нужно сделать данные доступными для чтения и выполнить некоторую предварительную очистку с помощью Pandas. Затем мы сохраним данные с помощью Pickle.

Нарушение кода:

  • dict_gambling - это словарь, в котором хранятся все списки, содержащие извлеченные коэффициенты
  • pd.DataFrame.from_dict (dict_gambling) превращает словарь в фрейм данных df_tipico, чтобы мы могли его читать и легко с ним работать
  • df_tipico.applymap (lambda x: x.strip () if isinstance (x, str) else x) очищает все начальные и конечные пробелы, которые могут иметь шансы с методом полосы.
  • open ('.', 'wb') открывает файл с именем df_tipico в режиме 'запись байтов' (wb). Мы сохраняем это в переменной output
  • pickle.dump (df_tipico, output) сохраняет фрейм данных, созданный в файле с именем df_tipico. Мы использовали одно и то же имя и для файла, и для фрейма данных, но они могли называться по-разному.
  • output.close () закрывает файл

Большой! Закончили очищать первую букмекерскую контору. Букмекерскую контору 2 и 3 наскрести легче. Полный код букмекеров 1, 2 и 3 находится в конце статьи.

Теперь поработаем с полученными данными, чтобы автоматически найти вилку!

Часть 2, 3 и 4

С этого момента мы начнем с другого файла .py для сбора и работы с данными о ставках, полученными от букмекерских контор 1, 2 и 3. В этот файл мы импортируем следующие библиотеки.

Подпроцесс позволяет нам запускать скрипты параллельно; то есть мы можем очищать букмекерские конторы 1, 2 и 3 одновременно. Pickle позволяет загружать парсинг данных в каждую букмекерскую контору; Панды помогают нам очищать и преобразовывать эти данные, а FuzzyWuzzy сопоставляет строки, необходимые для названий команд.

Хотя мы очистили разные рынки ставок, чтобы упростить задачу, мы сосредоточимся только на рынке «Обе команды забьют» (BTTS). Вы можете следовать за любым другим рынком, если хотите. Процесс похожий.

2. Очистите и преобразуйте данные о шансах в реальном времени с помощью Pandas.

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

У BTTS есть два возможных исхода, поэтому шансы выглядят примерно так: 1.8 \ n1.7. По этой причине нам необходимо форматировать все заблокированные коэффициенты '' как обычные коэффициенты без значений '0 \ n0'.

С другой стороны, время от времени шансы на один исход огромны, а другой настолько мал, что может вообще не проявиться. Они выглядят примерно так: 40 \ n, что эквивалентно 40 \ n1.01. Мы никогда не найдем вилок в этом сценарии, поэтому нам нужно снова превратить их в '0 \ n0'. Мы делаем это с помощью следующего кода:

Нарушение кода:

  • pickle.load (open ('df_tipico', 'rb')) загружает фрейм данных df_tipico, созданный в части 1
  • df_tipico [['Teams', 'btts']] выбирает 2 столбца, на которых мы сосредоточимся для этого анализа
  • df_tipico.replace (r '', '0 \ n0', regex = True) превращает заблокированные коэффициенты в '0 \ n0'
  • df_tipico.replace (r '^ \ d + \. \ d + $', '0 \ n0', regex = True) превращает огромные шансы, такие как 40 \ n, в '0 \ n0'. Мы используем регулярные выражения, чтобы уловить закономерность этих разногласий.

Мы даем одинаковый формат для данных внутри трех фреймов данных.

3. Сопоставление строк с помощью нечеткого |

Букмекеры часто расходятся во мнениях относительно названий команд. Чтобы сопоставить названия команд, которые выглядят одинаково, мы используем Fuzzywuzzy. Это дает оценку от 1 до 100, которая говорит нам, насколько похожи два имени.

Я буду использовать 60 в качестве минимального балла, необходимого для того, чтобы считать два имени одинаковыми. Однако иногда это все же может совпадать с разными командами. Как только вилка будет найдена, используйте здравый смысл, чтобы увидеть, совпадают ли команды на самом деле.

После сопоставления строк мы объединяем фреймы данных, чтобы позже искать вилки.

Нарушение кода:

  • df_tipico ['Teams']. tolist () превращает массив в список под названием team_1
  • process.extractOne (x, team_2, scorer = fuzz.token_set_ratio сравнивает имя команды x со списком с именами team_2 и дает два вывода: имя внутри team_2, которое наиболее похоже на название команды x, и ее результат
  • df_tipico ['Teams']. apply (lambda x: process.extractOne (x, team_2, scorer = fuzz.token_set_ratio)) применяет предыдущую формулу к каждой строке массива df_tipico ['Teams']
  • .apply (pd.Series) преобразует 2 вывода в фрейм данных, которые назначаются столбцам df_tipico [['Teams_matched_bwin', 'Score_bwin']]
  • pd.merge (df_tipico, df_bwin, left_on = 'Teams_matched_bwin', right_on = 'Teams') объединяет 2 фрейма данных, используя имена команд в качестве ключа
  • df_surebet [df_surebet ['Score_bwin']>60] отфильтровывает оценки меньше 60
  • df_surebet [['Teams_x', 'btts_x', 'Teams_y', 'btts_y']] выбирает определенные столбцы, которые мы будем использовать позже

Соответствие строк одинаково для 3 букмекеров. Нам нужно формировать пары, чтобы потом находить вилки. Пары букмекер1-букмекер2, букмекер1-букмекер3 и букмекер2-букмекер3.

4. Найдите вилки и рассчитайте ставки.

Для поиска вилок и расчета ставок воспользуемся двумя формулами. Формулы показаны ниже. Если вы хотите узнать, как я пришел к этим формулам, ознакомьтесь с этой статьей.

Найдите вилки

Разбивая формулу find_surebets:

  • frame [['btts_x_1', 'btts_x_2']] = frame ['btts_x']. apply (lambda x: x.split ('\ n')). ​​apply (pd.Series) .astype (float) разделяет шансы на 2 элемента. Первый хранится в столбце «btts_x_1», а второй - в «btts_x_2». Оба столбца создаются по мере применения формулы
  • (1 / frame ['btts_x_1']) + (1 / frame ['btts_y_2']) - формула для поиска вилок. Вы также можете найти вилки в паре коэффициентов btts_x_2 и btts_y_1.
  • frame [(frame ['sure_btts1'] отбирает только те совпадения, результаты которых меньше 1, что является требованием для вилки. Символ '|' является условным 'или'.
  • frame.reset_index (drop = True, inplace = True) сбрасывает индекс. Нам это нужно, чтобы идентифицировать совпадения, в которых код нашел вилку.

После этого мы применяем формулу к фрейму данных каждого букмекера с помощью find_surebet ('.'). Наконец, кадры хранятся в словаре dict_surebet.

Рассчитайте ставки

Мы применим формулу beat_bookies к каждому элементу словаря dict_surebet. Мы делаем это, чтобы найти необходимые ставки и прибыль, которую мы получим.

Нарушение кода:

  • total_stake - это общая сумма, которую вы готовы поставить в каждой игре. Вы должны определить подходящую для вас сумму. В этом примере я выбрал 100
  • for frame в dict_surebet проходит через фреймы всех букмекеров, которые мы наскребли
  • if len (dict_surebet [frame])>= 1: отфильтровывает кадры, в которых не было ни одной вилки
  • для i, значение в enumerate (dict_surebet [frame] ['sure_btts1']): проходит через каждую строку столбца 'sure_btts1' внутри фрейма данных. enumerate дает два вывода: номер итерации i и значение строки. Нам нужен i, чтобы определить шансы и название команды, в которой была найдена вилка (i - эквивалент индекса фрейма данных)
  • если значение отфильтровывает неуверенные ставки внутри "sure_btts1" или "sure_btts2"
  • odds1 = float (dict_surebet [frame] .at [i, 'btts_x']. split ('\ n') [0]) находит первые шансы с помощью метода .at и индекса i. Поскольку шансы бывают парами, мы должны разделить их и выбрать тот, который нам нужен, через [0] или [1]. После этого убеждаемся, что полученный результат - это число с плавающей запятой.
  • team = dict_surebet [frame] .at [i, 'Teams_x']. split ('\ n') находит названия команд с помощью метода .at и индекса i. Когда мы печатаем названия команд, нам не нужен '\ n', поэтому мы избавляемся от них с помощью split
  • dict_1 = beat_bookies (odds1, odds2, total_stake) применяет формулу beat_bookies к найденной нами вилке. Формула возвращает словарь
  • print (str (i) + '' + '-'. join (team) + '---->' + '' .join ('<>:<>'. format (x, y) для x, y) in dict_1.items ())) печатает все данные, необходимые для получения прибыли независимо от результата. .Item () распаковывает элемент внутри созданного словаря. Мы перебираем элементы и печатаем их в определенном формате.

Наконец, вы можете добавить этот код в начало файла, над которым мы начали работать в Части 2, чтобы очистить 3 букмекера одновременно:

Этот последний код работает на Mac. Однако похоже, что есть проблема с Windows. Сообщите мне, сработало ли это для вас в Windows.

Поздравляю! Теперь вилки можно найти в любом букмекере! Ниже вы найдете руководство по автоматизации этого скрипта, а также полный код двух файлов, над которыми мы работали (код букмекера 1 + код из Части 2,3,4), а также полный код букмекерской конторы 2 и букмекерской конторы 3.

Последний шаг: автоматизация скрипта Python

Последний шаг этого руководства - автоматизация скрипта Python, чтобы вы могли запускать его ежедневно, еженедельно или в определенное время. Вот руководство о том, как автоматизировать сценарии Python на Mac и Windows за 3 простых шага.

Популярные слоты

Автор: Ринат Пономарёв
Дата публикации: 05.27.2021
Рейтинг:
3.5