【问题标题】:Gather data with request on python在 python 上通过请求收集数据
【发布时间】:2021-04-22 00:54:32
【问题描述】:
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 网站来做到这一点。

【问题讨论】:

  • URL https://www.nba.com/stats/players/cut/ 似乎没有返回 JSON 数据。
  • pprint(data) 打印什么吗?
  • 这就是为什么我更喜欢通过“报废”nba.com 网站来做到这一点那么您为什么要尝试将HTML 转换为JSON?跨度>

标签: python json selenium beautifulsoup python-requests


【解决方案1】:

您缺少一些标头参数。另外,我认为团队 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'}

您可以通过打开您的开发工具和检查来找到所有这些信息。你想去 Network -> XHR,然后在那里搜索以查看哪个请求获取数据(打开 Dev Tools 后可能需要重新加载页面)

然后改成Headers就可以看到url了:

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

【讨论】:

  • 非常感谢您的快速回答。确实,缺少很多东西,但是我的问题是:您是如何找到放置的好的 url / headers / param 的?因为我试图检查该站点,但没有找到这些信息。我找不到任何关于此的通用教程。无论如何,非常感谢!
  • 啊,是的。现在没有机会,但是当我拿到笔记本电脑时,我会告诉你一个详细的答案。但是你可以在开发工具下找到它。
  • 没问题!慢慢来 :) 但再次感谢您!
  • 再次感谢您,我尝试用您的方法在另一个页面上执行它,它确实工作得很好!非常感谢您给您带来来自法国的良好氛围!
【解决方案2】:

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

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

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

您可以参考文档以了解有关此框架的更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多