如何从网络抓取创建熊猫数据框?
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.json
和 json_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...非常感谢您的帮助 =)以上是关于如何从网络抓取创建熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章
如何请求一个 zip 文件,提取它,然后从 csv 文件创建熊猫数据框?