我目前正在尝试通过从PrizePicks 中抓取投影来简化我的投影模型过程。 我一直遇到一个错误,提示语法无效。 任何帮助将不胜感激。 这是我的代码
import requests
import pandas as pd
pp_props_url = 'https://api.prizepicks.com/projections?league_id=7&per_page=250&single_stat=true'
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
'Access-Control-Allow-Credentials': 'true',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Referer': 'https://app.prizepicks.com/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9'
}
response = requests.get(url=pp_props_url, headers=headers).json()
player_prop = response
player_prop
columns_list = [
"League",
"League_Id",
"Market",
"Name",
"Position",
"Team",
"Team_Name"
"Stat_Type"
"Line_Score",
"Points",
"Rebounds",
"Assists",
"Pts+Rebs+Asts",
"3-Pt Made"
]
pp_df = pd.DataFrame(player_prop, columns = columns_list)
pp_df.to_csv('player_props_20221030.csv', index=False)
当我打开 csv 时,唯一打印的是列标题。 这次网络抓取交易是全新的,所以我真的很感激任何帮助。
你的问题让我很烦恼。首先,我在检索 .json 文件时收到提示错误。从标题中删除
'Accept-Encoding': 'gzip, deflate, br'
后,这些问题得到了解决。之后确实会返回一个有效的 .json 文件,但也许您已经是这种情况了。
然后在检索这个 .json 文件后,我可以看到您的许多
columns_list
标头并不在实际的 .json 文件中。以League为例,在.json文件中定义为league。首都很重要。
此外,.json 文件会在
included
部分下呈现所有感兴趣的玩家,因此您可以这样检索它们:player_prop["included"]
。然后,对于每个玩家,您都对属性部分感兴趣,因此我们需要这样过滤它们:[i["attributes"] for i in player_prop["included"]]
。
现在您可以创建 pd.DataFrame,您将看到为每个玩家创建了一行。我只更改了几个列标题,并且您放置的一些列标题似乎不在 .json 文件中,因此最好检查一下(例如 3-PT Made 似乎是名称值),但它按预期返回数据:
>>> pd.DataFrame([i["attributes"] for i in player_prop["included"]], columns=columns_list)
league league_id market name ... rebounds assists pts+rebs+asts 3-pt made
0 NBA 7.0 Houston Jalen Green ... NaN NaN NaN NaN
1 NBA 7.0 Phoenix Chris Paul ... NaN NaN NaN NaN
2 NBA 7.0 Phoenix Cameron Johnson ... NaN NaN NaN NaN
3 NaN NaN NaN Blocked Shots ... NaN NaN NaN NaN
4 NaN NaN NaN NBA ... NaN NaN NaN NaN
5 NaN NaN NaN Fantasy Score ... NaN NaN NaN NaN
6 NBA 7.0 Houston Kevin Porter Jr. ... NaN NaN NaN NaN
7 NBA 7.0 Phoenix Mikal Bridges ... NaN NaN NaN NaN
8 NaN NaN NaN Single Stat ... NaN NaN NaN NaN
9 NaN NaN NaN 3-PT Made ... NaN NaN NaN NaN
10 NaN NaN NaN Assists ... NaN NaN NaN NaN
11 NaN NaN NaN Points ... NaN NaN NaN NaN
12 NBA 7.0 Denver Nikola Jokic ... NaN NaN NaN NaN
13 NBA 7.0 Denver Jamal Murray ... NaN NaN NaN NaN
14 NBA 7.0 Los Angeles Lonnie Walker IV ... NaN NaN NaN NaN
15 NBA 7.0 Los Angeles Patrick Beverley ... NaN NaN NaN NaN
16 NaN NaN NaN Steals ... NaN NaN NaN NaN
17 NaN NaN NaN Pts+Rebs+Asts ... NaN NaN NaN NaN
18 NaN NaN NaN Pts+Asts ... NaN NaN NaN NaN
19 NaN NaN NaN Fantasy Score ... NaN NaN NaN NaN
20 NBA 7.0 Houston Alperen Sengun ... NaN NaN NaN NaN
21 NaN NaN NaN Blks+Stls ... NaN NaN NaN NaN
22 NBA 7.0 Los Angeles LeBron James\t ... NaN NaN NaN NaN
23 NBA 7.0 Denver Michael Porter Jr. ... NaN NaN NaN NaN
24 NaN NaN NaN Turnovers ... NaN NaN NaN NaN
25 NaN NaN NaN Pts+Rebs ... NaN NaN NaN NaN
26 NaN NaN NaN Rebs+Asts ... NaN NaN NaN NaN
27 NBA 7.0 Phoenix Devin Booker ... NaN NaN NaN NaN
28 NaN NaN NaN Rebounds ... NaN NaN NaN NaN
29 NBA 7.0 Denver Aaron Gordon ... NaN NaN NaN NaN
30 NBA 7.0 Los Angeles Anthony Davis ... NaN NaN NaN NaN
[31 rows x 12 columns]
现在以类似的方式写入.csv 应该会成功。
这对于新手来说是很棘手的。不确定你真正想要什么数据,但你需要提取 json 中的嵌套数据。 Pandas 可以使用 json_normalize 来做到这一点
import requests
import pandas as pd
pp_props_url = 'https://api.prizepicks.com/projections?league_id=7&per_page=250&single_stat=true'
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
'Access-Control-Allow-Credentials': 'true',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Referer': 'https://app.prizepicks.com/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9'}
response = requests.get(url=pp_props_url, headers=headers).json()
df = pd.json_normalize(response,
record_path =['data'])
df.to_csv('player_props_20221030.csv')
输出:
print(df)
type ... relationships.stat_type.data.id
0 projection ... 14
1 projection ... 106
2 projection ... 22
3 projection ... 19
4 projection ... 245
.. ... ... ...
269 projection ... 23
270 projection ... 24
271 projection ... 21
272 projection ... 23
273 projection ... 23
[274 rows x 26 columns]