如何从网络抓取创建熊猫数据框?

Posted

技术标签:

【中文标题】如何从网络抓取创建熊猫数据框?【英文标题】:How to create pandas dataframe from web scrape? 【发布时间】:2019-04-02 16:56:21 【问题描述】:

我想使用这个网络抓取来创建一个熊猫数据框,这样我就可以将数据导出到 Excel。有人熟悉这个吗?我在网上和这个网站上看到了不同的方法,但无法用这个刮擦成功地复制结果。

这是目前为止的代码:

import requests

source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()

for team in source['data']:
    print("\n%s players\n" % team['home_route'].capitalize())
    for player in team['home_players']:
        print(player['name'])
    print("\n%s players\n" % team['away_route'].capitalize())
    for player in team['away_players']:
        print(player['name'])

这个网站看起来很有用,但例子不同:

https://www.tutorialspoint.com/python_pandas/python_pandas_dataframe.htm

这是来自 ***.com 的另一个示例:

Loading web scraping results into Pandas DataFrame

我是编码/抓取的新手,因此我们将不胜感激。提前感谢您的时间和精力!

【问题讨论】:

@Able 提供了下面的答案,这将有助于我相信,但我看到 the link about json data 【参考方案1】:

我添加了一个解决方案,让dataframe 成为团队成员,我希望这会有所帮助。 Updated代码

import requests 

source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()
players = []
teams = []
for team in source['data']:
    print("\n%s players\n" % team['home_route'].capitalize())
    teams.append(team['home_route'].capitalize())
    teams.append(team['away_route'].capitalize())
    temp = []
    temp1 = []
    for player in team['home_players']:
        print(player['name'])
        temp.append(player['name'])
    print("\n%s players\n" % team['away_route'].capitalize())
    for player in team['away_players']:
        print(player['name'])
        temp1.append(player['name'])

    players.append(temp)
    players.append(temp1)

import pandas as pd
df = pd.DataFrame(columns=teams)
for i in range(0, len(df.columns)):
    df[df.columns[i]] = players[i]

df

为了导出到excel,你可以这样做

df.to_excel('result.xlsx')

【讨论】:

非常感谢@Harry_pb!这信息量很大=) 看起来两个团队合二为一。前 5 名球员(索引 0-4)被列出在正确的球队中......但是,最后 5 名球员(索引 5-9)实际上在不同的球队中。是否也包括排名倒数 5 名球员的球队?例如,前 5 名球员(富尔茨到恩比德)都在 76 人队。排名垫底的 5 名球员(Young 到 Dedmon)在老鹰队。如果我们也可以包括底部球员的球队,我会很高兴。非常感谢您的宝贵时间!【参考方案2】:

Python requests 方便地将 json 呈现为 dict,因此您可以在 pd.DataFrame 构造函数中使用 dict。

import pandas as pd
df = pd.DataFrame([dict1, dict2, dict3])
# Do your data processing here
df.to_csv("myfile.csv")

Pandas 也有 pd.io.jsonjson_normalize 这样的助手,因此一旦您的数据在数据框中,您就可以将嵌套的 json 处理成表格数据,等等。

【讨论】:

这似乎非常有用,但是,我收到一个错误'dict1' is not defined。 这些只是虚拟名称,代表您调用requests.get(some_url).json()返回的字典 @AbleArcher,只需使用source,因为这本身就是一个dict,您将能够从中创建一个数据框。我刚刚说明了这一点。【参考方案3】:

你可以试试下面的..

>>> import pandas as pd
>>> import json
>>> import requests

>>> source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()
>>> df = pd.DataFrame.from_dict(source) # directly use source as itself is a dict

现在您可以通过df.to_csv 将数据帧转换为 csv 格式,如下所示:

>>> df.to_csv("nba_play.csv")

以下只是您可以根据需要处理数据的列..

>>> df.columns
Index(['bottom_header', 'bottom_paragraph', 'data', 'heading',
       'intro_paragraph', 'page_title', 'twitter_link'],
      dtype='object')

不过,正如 Charles 所说,您可以使用 json_normalize,它可以让您以表格形式更好地查看数据..

>>> from pandas.io.json import json_normalize


>>> json_normalize(df['data']).head()
  away_bets.key  away_bets.moneyline away_bets.over_under  \
0           ATL                  500               o232.0
1           POR                  165               o217.0
2           SAC                  320               o225.0
3           BKN                  110               o216.0
4           TOR                 -140               o221.0

   away_bets.over_under_moneyline  away_bets.spread  \
0                            -115              11.0
1                            -115               4.5
2                            -105               9.0
3                            -105               2.0
4                            -105              -2.0

   away_bets.spread_moneyline  away_bets.total  \
0                        -110           121.50
1                        -105           110.75
2                        -115           117.00
3                        -110           109.00
4                        -115           109.50

                                       away_injuries  \
0  ['name': 'J. Collins', 'profile_url': '/nba/p...
1  ['name': 'M. Harkless', 'profile_url': '/nba/...
2  ['name': 'K. Koufos', 'profile_url': '/nba/pl...
3  ['name': 'T. Graham', 'profile_url': '/nba/pl...
4  ['name': 'O. Anunoby', 'profile_url': '/nba/p...

                                        away_players              away_route  \
0  ['draftkings_projection': 30.04, 'yahoo_posit...           atlanta-hawks
1  ['draftkings_projection': 47.33, 'yahoo_posit...  portland-trail-blazers
2  ['draftkings_projection': 28.88, 'yahoo_posit...        sacramento-kings
3  ['draftkings_projection': 37.02, 'yahoo_posit...           ***lyn-nets
4  ['draftkings_projection': 45.2, 'yahoo_positi...         toronto-raptors

   ...   nav.matchup_season           nav.matchup_time  \
0  ...                 2019  2018-10-29T23:00:00+00:00
1  ...                 2019  2018-10-29T23:00:00+00:00
2  ...                 2019  2018-10-29T23:30:00+00:00
3  ...                 2019  2018-10-29T23:30:00+00:00
4  ...                 2019  2018-10-30T00:00:00+00:00

   nav.status.away_team_score nav.status.home_team_score nav.status.minutes  \
0                        None                       None               None
1                        None                       None               None
2                        None                       None               None
3                        None                       None               None
4                        None                       None               None

  nav.status.quarter_integer  nav.status.seconds nav.status.status  \
0                                           None         Scheduled
1                                           None         Scheduled
2                                           None         Scheduled
3                                           None         Scheduled
4                                           None         Scheduled

                 nav.updated order
0  2018-10-29T17:51:05+00:00     0
1  2018-10-29T17:51:05+00:00     1
2  2018-10-29T17:51:05+00:00     2
3  2018-10-29T17:51:05+00:00     3
4  2018-10-29T17:51:05+00:00     4

[5 rows x 383 columns]

希望,这会有所帮助

【讨论】:

非常感谢@pygo...非常感谢您的帮助 =)

以上是关于如何从网络抓取创建熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据框熊猫创建列表

Python:如何从熊猫数据框创建字典? [复制]

从数据框列表创建单个熊猫数据框

如何请求一个 zip 文件,提取它,然后从 csv 文件创建熊猫数据框?

从 Google BigQuery 创建熊猫数据框时如何执行 na_values

从熊猫数据框创建嵌套字典