Веб-сбор данных API

#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?

  1. Как бы я добавил отборочные турниры и eon в качестве пар ключ-значение в URL-адресе JSON?
  2. Возможно ли это вообще?

Или я должен вместо этого очистить его и попытаться использовать HTML (возможно, удастся захватить заголовки строк статистики)?

Включен снимок одной таблицы с веб-сайта

Снимок таблицы PGA

Ответ №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. Нет необходимости поворачивать заголовки. И спасибо за дополнение к картинке. 😉