我希望使用Python的Beautiful Soup和requests库将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赛季的总数。似乎没有任何分裂。如果选择了Week 1选项(例如),我如何将其拆分,以使我抓取的数据与显示的数据相同。
发布于 2018-08-11 00:22:36
您可以通过解析分页部分中的URL来很容易地做到这一点。
您可以看到它们具有端点statWeek=
。我们只需输入我们想要的一周,并从该页面获得结果。这是一个示例脚本,它获取了玩家的名字,幻想点数(projected?)和前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 dataframe构造函数,我们就完成了。
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
https://stackoverflow.com/questions/51785640
复制相似问题