Как сделать цикл, чтобы очистить разные страницы с помощью Python

#python #web-scraping #beautifulsoup #automation #stat

Вопрос:

Итак, моя цель с помощью этого кода-извлечь информацию о новичке в моей команде НФЛ. Я хочу сравнить его игру с игроками, которые закончили прошлый сезон в топ-10 по статистике на его позиции, когда они были в первом сезоне, где они сыграли более 10 игр.

Для этого я использовал в качестве ссылки пост в журнале «Наука о данных», где они объяснили, как очистить данные НФЛ.

Вот мой код:

 #url page
url_mac = 'https://www.pro-football-reference.com/years/2021/passing.htm'

#opening URL with BS
html_mac = urlopen(url_mac)
stats_macpage = BeautifulSoup(html_mac)

#collecting table rows
column_headers = stats_macpage.findAll('tr')[0]
column_headers = [i.getText() for i in column_headers.findAll('th')]


#getting stats of each row
rows = stats_macpage.findAll('tr')[1:]
qb_stats = []
for i in range(len(rows)):
    qb_stats.append([col.getText() for col in rows[i].findAll('td')])
    
#creating a data frame
data = pd.DataFrame(qb_stats, columns = column_headers[1:])

#rename column of sack yards from yards to y_sack

new_columns = data.columns.values
new_columns[-6] = 'y_sack'
data.columns = new_columns

#selecting specifics stats
categories = ['Cmp%', 'Yds', 'TD', 'Int', 'Y/A', 'Rate']

#first filter
data_radar = data[['Player', 'Tm']   categories]

#selecting specific player 
data_mac = data_radar[data_radar['Player'] == 'Mac Jones']
 

Я сделал это для всех 11 игроков, которые мне нужны, и я объединил данные в финале, но вы можете себе представить, как плохо выглядит мой код.

Как я могу улучшить его, чтобы создать цикл ? Я уже пробовал некоторые вещи, но для всех этих идей они либо не работали хорошо, либо были за пределами моих возможностей для успешного выполнения.

Между моими идеями было взять все данные за последние 20 лет и попытаться найти год за годом, но это выглядит немного излишним, потому что я уже знаю, какие годы мне нужны. Моя проблема конкретно в этой части, потому что в финале я мог бы создать список, а затем «если» и взять только первый год, когда каждый игрок в моем списке сыграл > 10 игр.

 url_mac = 'https://www.pro-football-reference.com/years/2021/passing.htm'
 

Спасибо вам всем.

Комментарии:

1. Так в чем же вопрос? Вы хотите получить таблицы https://www.pro-football-reference.com/years/<YEAR>/passing.htm за последние 10 лет и объединить их в одну?

2. Точно, но я не знаю, как это сделать в течение конкретных лет.

3. Причина не из последних 10 лет. Например, Том Брэди был задрафтован в 2000 году, а первый сезон, в котором он сыграл более 10 игр, приходится на 2001 год. Аарон Роджерс был задрафтован в 2005 году, но сыграл только более 10 матчей в 2008 году. Так что я не могу взять последние 10 лет

Ответ №1:

Чтобы загрузить все таблицы за 2011-2021 годы в один фрейм данных, вы можете использовать этот пример:

 import pandas as pd

# url page
url_mac = "https://www.pro-football-reference.com/years/{}/passing.htm"

all_dfs = []
for year in range(2011, 2022):
    print("Getting table for year {}".format(year))
    df = pd.read_html(url_mac.format(year))[0]
    df = df[~df["Rk"].eq("Rk")]
    df["Year"] = year
    all_dfs.append(df)

df = pd.concat(all_dfs)
print(df)
df.to_csv("data.csv", index=False)
 

С принтами:

       Rk                 Player   Tm Age  Pos   G  GS   QBrec  Cmp  Att   Cmp%   Yds  TD    TD% Int   Int%   1D Lng   Y/A   AY/A   Y/C    Y/G   Rate    QBR  Sk Yds.1   NY/A   ANY/A   Sk%  4QC  GWD  Year
0      1            Drew Brees*  NOR  32   QB  16  16  13-3-0  468  657   71.2  5476  46    7.0  14    2.1  279  79   8.3    8.8  11.7  342.3  110.6   82.3  24   158   7.81    8.23   3.5    3    4  2011
1      2             Tom Brady*  NWE  34   QB  16  16  13-3-0  401  611   65.6  5235  39    6.4  12    2.0  262  99   8.6    9.0  13.1  327.2  105.6   73.8  32   173   7.87    8.25   5.0    1    2  2011
2      3       Matthew Stafford  DET  23   QB  16  16  10-6-0  421  663   63.5  5038  41    6.2  16    2.4  243  73   7.6    7.7  12.0  314.9   97.2   60.5  36   257   6.84    6.98   5.2    3    4  2011
3      4           Eli Manning*  NYG  30   QB  16  16   9-7-0  359  589   61.0  4933  29    4.9  16    2.7  218  99   8.4    8.1  13.7  308.3   92.9   64.2  28   199   7.67    7.45   4.5    5    6  2011


...
 

и сохраняет data.csv (скриншот из LibreOffice):

введите описание изображения здесь

Комментарии:

1. о, я так понимаю. Спасибо, что уделили мне время

Ответ №2:

Продолжайте pandas разбирать эти таблицы. Просто пройдите по сезонам в URL-адресе (не забудьте добавить это в фреймы данных, иначе вы не узнаете, какие строки для каких сезонов:

 import pandas as pd

# To get last 10 seasons
years_look_back = 10
years_list = list(range(2021,2021-(years_look_back 1),-1))
years_list.reverse()


# Or just make a list of specific years:
years_list = [2001, 2005, 2008, 2010, 2011, 2015]

cols = ['Player', 'Tm','Cmp%', 'Yds', 'TD', 'Int', 'Y/A', 'Rate']
df_list = []
for year in years_list:
    url_mac = f'https://www.pro-football-reference.com/years/{year}/passing.htm'
    temp_df = pd.read_html(url_mac)[0][cols]
    temp_df['Season'] = year
    temp_df = temp_df[~temp_df["Player"].eq("Player")]
    df_list.append(temp_df)
    print(f'Collect: {year}')


data_radar = pd.concat(df_list)

#selecting specific player 
data_mac = data_radar[data_radar['Player'] == 'Mac Jones']