代码之家  ›  专栏  ›  技术社区  ›  OD1995

使用Python抓取NFL.com幻想足球计划

  •  1
  • OD1995  · 技术社区  · 8 年前

    http://fantasy.nfl.com/research/projections 变成一个简单的pandas数据框架,使用Python的漂亮的Soup和requests库。我使用了以下代码:

    a = "http://fantasy.nfl.com/research/projections"
    req = requests.get(a)
    soup = bs4.BeautifulSoup(req.text,"html.parser")
    

    我的目标是每周收集每个职位的数据。然而,由此返回的数据是2018赛季的总数据。似乎没有任何分裂。如果选择了第1周选项(例如),我如何将其拆分,以使我收集的数据显示出来。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Steven    8 年前

    通过解析pagination部分的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)
    

    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