#python #api #web-scraping
#python #API #очистка веб-страниц
Вопрос:
Я пытаюсь получить статистику гольфа для аналитического проекта.
TL; DR резюме: должен ли я очистить или использовать цикл с API, который я нашел в сетевой консоли?
Я хочу получить данные для 6 или 7 категорий статистики, по годам (2015-настоящее время) и, желательно, по турнирам, чтобы лучше классифицировать производительность игроков в турнирах. Базовый URL-адрес: https://www.pgatour.com/stats
На сайте множество страниц, и как только вы нажимаете на конкретную страницу статистики, на ней появляются три выпадающих поля: сезон (содержит год), период времени (только турнир или с начала года) и турнир (название турнира)
Найден возможный скрытый API:
https://statdata-api-prod.pgatour.com/api/clientfile/YTDEventStats?T_CODE=ramp;STAT_ID=02671amp;YEAR=2021amp;format=json
Но здесь есть только данные для самого последнего турнира, и они не очень чистые (нет названий категорий статистики для табличных данных):
Я могу внести коррективы в JSON API, изменив идентификатор статистики = значение, а также год. Так что это вариант, но мне нужно было бы выяснить, как добавить идентификационный номер турнира и статистику турнира только в виде пар ключ-значение.
URL-адрес для примера выглядит следующим образом: https://www.pgatour.com/content/pgatour/stats/stat.02674.y2017.eon.t030.html
eon создает только турнирную статистику (eoff для начала года), а t030 является маркером турнира.
Должен ли я просто создавать циклы и изменять год, номер турнира и номер статистики, получать всю информацию в формате JSON и пытаться перенести ее в df?
- Как бы я добавил отборочные турниры и eon в качестве пар ключ-значение в URL-адресе JSON?
- Возможно ли это вообще?
Или я должен вместо этого очистить его и попытаться использовать HTML (возможно, удастся захватить заголовки строк статистики)?
Включен снимок одной таблицы с веб-сайта
Ответ №1:
Я бы выбрал очистку, поскольку сам URL-адрес дает вам больше контроля над тем, что вам нужно. Кроме того, вы можете легко получить табличные данные с помощью pandas.
Например:
import requests
import pandas as pd
headers = {
"accept": "application/json, text/javascript, */*; q=0.01",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-GB,en-US;q=0.9,en;q=0.8",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.99 Safari/537.36",
"x-requested-with": "XMLHttpRequest",
}
url = "https://www.pgatour.com/content/pgatour/stats/stat.02674.y2017.eon.t030.html"
html = requests.get(url).text
df = pd.read_html(html, flavor="html5lib")
df = pd.concat(df).drop([0, 1, 2], axis=1)
df.to_csv("golf.csv", index=False)
Дает вам это:
Затем вы можете продолжать менять местами URL-адреса или изменять stat.
, y
, и eon
часть URL-адреса, чтобы получить другую статистику. Например, это Открытый чемпионат США 2018 года — https://www.pgatour.com/content/pgatour/stats/stat.02674.y2017.eon.t030.html
Комментарии:
1. Спасибо. Нужно ли мне поворачивать заголовки, если я просматриваю страницы нескольких лет и турниров?
2. Ваша фотография великолепна
3. Нет необходимости поворачивать заголовки. И спасибо за дополнение к картинке. 😉