Очистить результаты календаря

Я хочу получить исторические данные из:

https://www.racenet.com.au/results/horse-racing

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

Вы заметите, что такое взаимодействие с календарем не меняет URL-адрес, поэтому я не понимаю, как перемещаться по календарю и вызывать расписание на определенную дату, а затем как получить доступ к результатам, т. е. когда Я выбираю дату из календаря вручную, а затем «Просмотреть источник» на возвращенной странице, я не вижу ссылок, соответствующих конкретным расам.

Пример: случайным образом выберите из календаря 11 мая 2021 года. Mackay (QLD) — первый трек в списке. Щелчок правой кнопкой мыши на этой странице и поиск «Маккей» не дают совпадений. При нажатии вручную на первую гонку «R1» URL-адрес меняется на: https://www.racenet.com.au/results/horse-racing/mackay-20210511/smartstate-rentals-bm65-race-1 что тогда мне нормально потреблять, моя проблема - это шаги, связанные с циклическим переключением календарных дат и получением информации об этих URL-адресах гонок.

Я надеюсь, что есть решение на Python, любые советы/предложения о том, как решить эту проблему, будут очень признательны.

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

Community 09.06.2024 17:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это сохранит все данные за определенную дату в файл JSON. Измените определение DATE, чтобы выбрать другие даты. Или поместите все это в функцию, чтобы можно было легко перебирать несколько дат.

Доступ к данным, возвращаемым вызовом API, можно получить как словарь через response.json(). Вы можете манипулировать этим, чтобы извлечь только нужные данные.

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

import requests
import json

DATE = "2024-06-07"

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0",
    "Accept": "*/*",
    "authorization": "Bearer none",
}

params = {
    "operationName": "meetingsIndexByStartEndDate",
    "variables": '{"startDate": "' + DATE + '", "endDate": "' + DATE + '", "limit": 100}',
    "extensions": '{"persistedQuery": {"version": 1, "sha256Hash": "998212fede87c9261e0f18e9d8ced2ed04a915453dcd64ae1b5cf5a72cf25950"}}',
}

response = requests.get("https://puntapi.com/graphql-horse-racing", params=params, headers=headers)

with open(f"race-data-{DATE}.json", "wt") as file:
    file.write(json.dumps(response.json(), indent=2))

Примеры данных, полученных с помощью этого подхода (это большие куски JSON, поэтому я не буду их сюда вставлять):

Хотя этот код может предоставить данные, которые ищет @JL89, он не отвечает на вопрос, как парсить Racenet.com.au/results/horse-racing

SIGHUP 09.06.2024 09:26

Спасибо, это почти идеально, однако я заметил в результате только первые 4 лошади. Например, Ипсвич, Гонка 1 (Racenet.com.au/results/horse-racing/ipswich-20240607/…), ваш файл содержит всю информацию, необходимую для лошадей Вермеера, Саламанки, Луисаны, Фионте, но не захватить детали Химедзи, Девочки Кэсси, Кейти Саннилайн, Мучений Терпина, Шамболика, Пуш Турбо. Можно ли изменить ваш код, чтобы он соответствовал требованиям?

JL89 09.06.2024 10:57

@ JL89 JL89 Я почти уверен, что мы сможем получить эти данные, используя аналогичный подход. ИМХО, использование API динамического сайта, как правило, является более эффективным и прямым способом получения необходимых вам данных. Я посмотрю на это чуть позже!

datawookie 09.06.2024 14:37

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

datawookie 09.06.2024 14:42

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

JL89 09.06.2024 15:08

@ JL89 JL89 Я опубликовал второй, более полный ответ, который включает в себя очистку отдельных страниц событий. Эти страницы статичны, поэтому правильным подходом будет парсинг, а не обращение к API.

datawookie 09.06.2024 18:21
Ответ принят как подходящий

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

import requests
import time
from bs4 import BeautifulSoup

DATE = "2024-06-07"

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0",
    "Accept": "*/*",
    "authorization": "Bearer none",
}

params = {
    "operationName": "meetingsIndexByStartEndDate",
    "variables": '{"startDate": "' + DATE + '", "endDate": "' + DATE + '", "limit": 100}',
    "extensions": '{"persistedQuery": {"version": 1, "sha256Hash": "998212fede87c9261e0f18e9d8ced2ed04a915453dcd64ae1b5cf5a72cf25950"}}',
}

response = requests.get("https://puntapi.com/graphql-horse-racing", params=params, headers=headers)

races = response.json()

for group in races["data"]["meetingsGrouped"]:
    for meeting in group["meetings"]:
        for event in meeting["events"]:
            time.sleep(5)
            print("🟦 "+meeting["name"]+" — "+event["name"]+"\n")

            URL = "https://www.racenet.com.au/results/horse-racing/"+meeting["slug"]+"/"+event["slug"]

            print("URL: "+URL+"\n")

            response = requests.get(URL, headers=headers)

            soup = BeautifulSoup(response.text, "html.parser")

            names = soup.select("h4.selection-result__info-competitor-name")

            for name in names:
                print(name.get_text().strip())

            print()
  1. Использует базовый API для получения списка собраний и событий на определенную дату.
  2. Перебирает встречи и события, получая статический HTML-код для каждого события и извлекая лошадей. Также получает название собрания и название гонки из ответа API.

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

Вывод выглядит следующим образом:

🟦 Ipswich — Tab Ipswich Cup Tickets On Sale Mdn Plate                                                                                                                                                                                  
                                                                                                                                                                                                                                        
URL: https://www.racenet.com.au/results/horse-racing/ipswich-20240607/tab-ipswich-cup-tickets-on-sale-mdn-plate-race-1                                                                                                                  
                                                                                                                                                                                                                                        
6. Vermeer                                                                                                                                                                                                                              
5. Salamancas                                                                                                                                                                                                                           
9. Luisana                                                                                                                                                                                                                              
8. Fionte                                                                                                                                                                                                                               
4. Himeji                                                                                                                                                                                                                               
7. Cassie's Girl                                                                                                                                                                                                                        
10. Kaytee Sunnyline                                                                                                                                                                                                                    
3. Turpin's Torment                                                                                                                                                                                                                     
2. Shambolic                                                                                                                                                                                                                            
1. Push Turbo                                                                                                                                                                                                                           
                                                                                                                                                                                                                                        
🟦 Ipswich — Put It On Black Mdn Hcp                                                                                                                                                                                                    
                                                                                                                                                                                                                                        
URL: https://www.racenet.com.au/results/horse-racing/ipswich-20240607/put-it-on-black-mdn-hcp-race-2                                                                                                                                    
                                                                                                                                                                                                                                        
3. Find Your Own                                                                                                                                                                                                                        
4. Hydros                                                                                                                                                                                                                               
8. Look It's Lucy                                                                                                                                                                                                                       
9. Starspangle Planet                                                                                                                                                                                                                   
7. Literacy                                                                                                                                                                                                                             
1. Arnie's Army

Другие вопросы по теме