Я хочу получить исторические данные из:
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, любые советы/предложения о том, как решить эту проблему, будут очень признательны.






Это сохранит все данные за определенную дату в файл 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
Спасибо, это почти идеально, однако я заметил в результате только первые 4 лошади. Например, Ипсвич, Гонка 1 (Racenet.com.au/results/horse-racing/ipswich-20240607/…), ваш файл содержит всю информацию, необходимую для лошадей Вермеера, Саламанки, Луисаны, Фионте, но не захватить детали Химедзи, Девочки Кэсси, Кейти Саннилайн, Мучений Терпина, Шамболика, Пуш Турбо. Можно ли изменить ваш код, чтобы он соответствовал требованиям?
@ JL89 JL89 Я почти уверен, что мы сможем получить эти данные, используя аналогичный подход. ИМХО, использование API динамического сайта, как правило, является более эффективным и прямым способом получения необходимых вам данных. Я посмотрю на это чуть позже!
Для ясности: после того, как вы выбрали дату в календаре, вы получите список гонок на эту дату. Чтобы получить данные, которые вам нужны, я полагаю, вы затем нажимаете на конкретную расу? Потому что я не вижу данных по всем лошадям в списке забегов.
Правильно, ваш код возвращает некоторые данные для первых четырех лошадей в одном забеге. Если щелкнуть ссылку на конкретную гонку, отобразятся все лошади и некоторые дополнительные данные. Если вы сможете сгенерировать JSON для конкретной страницы расы, это было бы идеально. Если нет, я все равно могу получить URL-адрес из того, что вы уже предоставили, и перейти оттуда. Еще раз спасибо.
@ JL89 JL89 Я опубликовал второй, более полный ответ, который включает в себя очистку отдельных страниц событий. Эти страницы статичны, поэтому правильным подходом будет парсинг, а не обращение к API.
Вот более полный ответ, который позволит получить информацию обо всех лошадях, участвовавших в каждом соревновании на каждом соревновании в выбранный день.
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()
Как в ответе 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
Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой и указать достаточно подробностей, чтобы найти адекватный ответ.