我正在寻找使用Python的Beautiful Soup和请求库将http://fantasy.nfl.com/research/projections上的数据刮到一个简单的熊猫数据框中。我使用了以下代码:
a = "http://fantasy.nfl.com/research/projections"
req = requests.get(a)
soup = bs4.BeautifulSoup(req.text,"html.parser")
我的目标是逐周收集每个职位的数据。但是,此返回的数据是2018赛季的总数。似乎没有任何分裂。如果选择了“第1周”选项,该如何分解才能使我抓取的数据显示出来。
答案 0 :(得分:2)
通过分页部分中的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