在python上通过请求收集数据

2024-05-20 07:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

import requests
from pprint import pprint

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
}

params = (
    ('LeagueID', '00'),
    ('Season', '2017-18'),
    ('TeamID', '1610612757'),
)

data = requests.get('https://www.nba.com/stats/players/cut/',
                    headers=headers, params=params).json()
pprint(data)
columns=data['resultSets'][0]['headers']
for result_set in data['resultSets']:
    print("Result set", result_set['name'])
    for item in result_set['rowSet']:
        pprint(dict(zip(result_set['headers'], item)))

我尝试运行此代码,但系统性地出现以下错误:

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我的目标是从链接上的表中获取数据。我成功地使用了API,但是没有我分析所需的所有信息。这就是为什么我更喜欢通过“抓取”nba.com网站来做到这一点


Tags: infromimportcomfordataparamsresult
2条回答

您想在html网页上进行网页抓取。但是您正在请求中将它们转换为json。两者都不同。您提供的链接不是RESTAPI

您可以尝试使用以下框架https://pypi.org/project/beautifulsoup4/

from bs4 import BeautifulSoup
soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
soup.find(text="bad")

有关此框架的更多信息,请参阅文档

您缺少一些headers参数。另外,我认为团队id查询不正确。您还需要使用url = 'https://stats.nba.com/stats/synergyplaytypes'

import requests
from pprint import pprint

headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9',
'Connection': 'keep-alive',
'Host': 'stats.nba.com',
'Origin': 'https://www.nba.com',
'Referer': 'https://www.nba.com/',
'sec-ch-ua': '"Google Chrome";v="87", "\"Not;A\\Brand";v="99", "Chromium";v="87"',
'sec-ch-ua-mobile': '?1',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Mobile Safari/537.36',
'x-nba-stats-origin': 'stats',
'x-nba-stats-token': 'true'
}

params = {'LeagueID': '00',
'PerMode': 'PerGame',
'PlayType': 'Cut',
'PlayerOrTeam': 'P',
'SeasonType': 'Regular Season',
'SeasonYear': '2020-21',
'TypeGrouping': 'offensive'}

url = 'https://stats.nba.com/stats/synergyplaytypes'
data = requests.get(url,
                    headers=headers, params=params).json()
pprint(data)
columns=data['resultSets'][0]['headers']
for result_set in data['resultSets']:
    print("Result set", result_set['name'])
    for item in result_set['rowSet']:
        pprint(dict(zip(result_set['headers'], item)))

输出:

...
{'EFG_PCT': 0.5,
 'FGA': 1.4,
 'FGM': 0.7,
 'FGMX': 0.7,
 'FG_PCT': 0.5,
 'FT_POSS_PCT': 0.1,
 'GP': 7,
 'PERCENTILE': 0.244,
 'PLAYER_ID': 1630214,
 'PLAYER_NAME': 'Xavier Tillman',
 'PLAY_TYPE': 'Cut',
 'PLUSONE_POSS_PCT': 0.1,
 'POSS': 1.4,
 'POSS_PCT': 0.192,
 'PPP': 1.1,
 'PTS': 1.6,
 'SCORE_POSS_PCT': 0.5,
 'SEASON_ID': '22020',
 'SF_POSS_PCT': 0.1,
 'TEAM_ABBREVIATION': 'MEM',
 'TEAM_ID': 1610612763,
 'TEAM_NAME': 'Memphis Grizzlies',
 'TOV_POSS_PCT': 0.0,
 'TYPE_GROUPING': 'Offensive'}
{'EFG_PCT': 0.444,
 'FGA': 1.0,
 'FGM': 0.6,
 'FGMX': 0.6,
 'FG_PCT': 0.444,
 'FT_POSS_PCT': 0.273,
 'GP': 9,
 'PERCENTILE': 0.044,
 'PLAYER_ID': 203939,
 'PLAYER_NAME': 'Dwight Powell',
 'PLAY_TYPE': 'Cut',
 'PLUSONE_POSS_PCT': 0.091,
 'POSS': 1.2,
 'POSS_PCT': 0.234,
 'PPP': 0.909,
 'PTS': 1.1,
 'SCORE_POSS_PCT': 0.455,
 'SEASON_ID': '22020',
 'SF_POSS_PCT': 0.273,
 'TEAM_ABBREVIATION': 'DAL',
 'TEAM_ID': 1610612742,
 'TEAM_NAME': 'Dallas Mavericks',
 'TOV_POSS_PCT': 0.0,
 'TYPE_GROUPING': 'Offensive'}
{'EFG_PCT': 0.333,
 'FGA': 1.3,
 'FGM': 0.9,
 'FGMX': 0.9,
 'FG_PCT': 0.333,
 'FT_POSS_PCT': 0.091,
 'GP': 7,
 'PERCENTILE': 0.0,
 'PLAYER_ID': 1629060,
 'PLAYER_NAME': 'Rui Hachimura',
 'PLAY_TYPE': 'Cut',
 'PLUSONE_POSS_PCT': 0.0,
 'POSS': 1.6,
 'POSS_PCT': 0.126,
 'PPP': 0.636,
 'PTS': 1.0,
 'SCORE_POSS_PCT': 0.364,
 'SEASON_ID': '22020',
 'SF_POSS_PCT': 0.091,
 'TEAM_ABBREVIATION': 'WAS',
 'TEAM_ID': 1610612764,
 'TEAM_NAME': 'Washington Wizards',
 'TOV_POSS_PCT': 0.091,
 'TYPE_GROUPING': 'Offensive'}

您可以通过操作开发工具和检查来找到所有这些信息。您想进入网络->;XHR,然后在那里搜索以查看哪个请求获得数据(在打开开发工具后,可能需要重新加载页面)

enter image description here

然后将其更改为Headers,您将看到url:

enter image description here

并向下滚动查看其他使用的标题和参数。你可能不需要所有这些,但似乎有一些是绝对需要的。你可以到处玩,看看nba api需要哪一个或哪一个

enter image description here

相关问题 更多 >