我正在使用nba统计信息进行网络抓取项目。当我抓取时,我可以获得所有信息。但是,所有统计信息都作为一个字符串返回,该字符串变成一个数据帧,将所有统计信息放在一列中。我正在尝试拆分此字符串。并将其替换为自己的嵌套区域。 希望图像可以更好地解释这一点。
我正在使用硒从https://stats.nba.com/players/traditional/?sort=PTS&dir=-1进行网络爬虫,因为我打算点击所有页面
这是我正在使用的功能: 在最后一行中,我想用创建的拆分版本替换z [2]。当我尝试z [2] = z [2] .split('')时,出现错误 AttributeError:'list'对象没有属性'split'
new_split = []
for i in player:
player_stats.append(i.text.split('\n'))
for z in player_stats:
new_split.append(z[2].split(' '))```
答案 0 :(得分:1)
您没有提到要从何处获取数据。(我在代码中更新了uint8
。它仍然是相同的API,可为所有对象返回信息457个播放器,因此无需使用硒导航到其他页面)。官方的nba网站似乎正在以JSON格式提供其数据,这在进行网络抓取时总是需要的:
url
输出:
import requests
import json
# url = "https://stats.nba.com/stats/leagueLeaders?LeagueID=00&PerMode=PerGame&Scope=S&Season=2019-20&SeasonType=Regular+Season&StatCategory=PTS"
url = "https://stats.nba.com/stats/leaguedashplayerstats?College=&Conference=&Country=&DateFrom=&DateTo=&Division=&DraftPick=&DraftYear=&GameScope=&GameSegment=&Height=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2019-20&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&TwoWay=0&VsConference=&VsDivision=&Weight="
response = requests.get(url)
response.raise_for_status()
data = json.loads(response.text)
players = []
for player_data in data["resultSet"]["rowSet"]:
player = dict(zip(data["resultSet"]["headers"], player_data))
players.append(player)
for player in players[:10]:
print(f"{player['PLAYER']} ({player['TEAM_ABBREVIATION']}) is rank {player['RANK']} with a GP of {player['GP']}")
注意:我不知道“ GP”是什么-我只是为了演示而选择了它。这是Chrome的网络记录器的屏幕快照,显示了扩展的JSON资源的一小部分( EDIT ),新的James Harden (HOU) is rank 1 with a GP of 18
Giannis Antetokounmpo (MIL) is rank 2 with a GP of 19
Luka Doncic (DAL) is rank 3 with a GP of 18
Bradley Beal (WAS) is rank 4 with a GP of 17
Trae Young (ATL) is rank 5 with a GP of 18
Damian Lillard (POR) is rank 6 with a GP of 18
Karl-Anthony Towns (MIN) is rank 7 with a GP of 16
Anthony Davis (LAL) is rank 8 with a GP of 18
Brandon Ingram (NOP) is rank 9 with a GP of 15
LeBron James (LAL) is rank 10 with a GP of 19
的json响应看起来完全一样,只是其中一些标头不同,例如“ TEAM”->“ TEAM_ABBREVIATION”):
您可以看到这些值-您正在努力从一个巨大的字符串中提取这些值-很好地分成了单独的元素。我上面发布的代码使用标头(在url
中找到的标头(“ PLAYER_ID”,“ RANK”等)和这些值创建键值对。
答案 1 :(得分:0)
如果第二列是字符串,则可以尝试将此字符串拆分为 一个列表,将该列表的每个元素转换为一系列,然后进行合并 这个新的数据帧带有原始数据帧的前两列。
df_stats = df["2"].apply(lambda x: x[0].split(" ")).apply(pd.Series)
df_end = pd.concat([df[["0","1"]].reset_index(drop=True), df_stats], axis=1)
示例:
df = pd.DataFrame({"0": [1, 2],
"1": ["Name1", "Name2"],
"2":[["HOU 30 80"], ["LA 30 50"]]})
df_stats = df["2"].apply(lambda x: x[0].split(" ")).apply(pd.Series)
df_end = pd.concat([df[["0","1"]].reset_index(drop=True), df_stats], axis=1)
0 1 0 1 2
0 1 Name1 HOU 30 80
1 2 Name2 LA 30 50