使用Python抓取NFL.com幻想足球的预测

时间:2018-08-10 11:34:54

标签: python beautifulsoup python-requests

我正在寻找使用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周”选项,该如何分解才能使我抓取的数据显示出来。

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