Я хочу очистить данные на http://fantasy.nfl.com/research/projection в простой фрейм данных pandas, используя Python Beautiful Soup и библиотеки запросов. Я использовал следующий код:
a = "http://fantasy.nfl.com/research/projections"
req = requests.get(a)
soup = bs4.BeautifulSoup(req.text,"html.parser")
Моя цель - еженедельно собирать данные для каждой позиции. Однако данные, полученные из этого, являются итогом сезона 2018 года. Похоже, что никаких расколов нет. Как я могу разделить его так, чтобы данные, которые я очищаю, отображались, если выбран вариант «Неделя 1» (например).
Вы можете сделать это довольно легко, проанализировав URL-адреса из раздела пагинации.
Вы можете видеть, что у них есть конечная точка statWeek=
. Мы можем просто включить желаемую неделю и получить результаты с этой страницы. Вот пример сценария, который захватывает имя игрока, очки фантазии (прогнозируемые?) И номер недели для первых 25 недель и сохраняет их в фреймворке Pandas.
def get_weekly_players(res):
res_list = list()
week = url.split('statWeek=')[1]
player_rows = res.find_all('tr')
for row in player_rows:
name = row.find('a', 'playerCard')
points = row.find('td', 'stat_30')
if name and points:
res_list.append((name.text, float(points.text), int(week)))
return res_list
Мы определяем функцию для извлечения желаемой информации из проанализированного HTML.
Затем мы просто перебираем номера недель и расширяем результаты кортежа до списка.
all_res = list()
for week in range(0, 25):
url = '''http://fantasy.nfl.com/research/projections?position=O&sort=projectedPts&statCategory=projectedStats&statSeason=2018&statType=weekProjectedStats&statWeek = {}'''.format(week)
req = requests.get(url)
soup = BeautifulSoup(req.text,"html.parser")
res = get_weekly_players(soup)
all_res.extend(res)
Затем мы можем передать результаты конструктору фрейма данных Pandas, и все готово.
player_df = pd.DataFrame(all_res, columns=['player', 'points', 'week'])
Вы можете видеть, что у нас есть результаты за все 25 недель.
player_df.describe()
points week
count 625.00000 625.000000
mean 3.22840 12.000000
std 0.37989 7.216878
min 2.14000 0.000000
25% 3.17000 6.000000
50% 3.30000 12.000000
75% 3.40000 18.000000
max 3.66000 24.000000
Упс, забыл добавить туда ступеньку. Я отредактировал пост. Сообщите мне, работает ли это для вас (вы можете принять ответ).
Спасибо, @ Стивен! У меня есть несколько вопросов. "player_rows" не определено в функции, но я предполагаю, что это список? Правильно ли я предположил, что функция должна принимать дополнительный аргумент «суп», который затем каким-то образом разбивается на переменную «player_rows». Я не уверен, как сделать этот последний шаг?