python - API 网络数据捕获
问题描述
我正在尝试为分析项目提取高尔夫统计数据。
TL;DR 摘要:我应该使用在网络控制台中找到的 API 来抓取还是使用循环?
我想按年份(2015 年至今)提取 6 或 7 个统计类别的数据,最好按锦标赛来更好地对玩家锦标赛表现进行分类。基本网址是:https://www.pgatour.com/stats
该网站有许多页面,一旦您单击特定的统计页面,它就会有三个下拉字段:季节(包含年份)、时间段(仅限锦标赛或 YTD)和锦标赛(锦标赛名称)
发现可能的隐藏 API:
https://statdata-api-prod.pgatour.com/api/clientfile/YTDEventStats?T_CODE=r&STAT_ID=02671&YEAR=2021&format=json
但这只有最近锦标赛的数据,而且不是很干净(表格数据没有统计类别标题):
我可以通过更改 Stat ID=value 和年份来调整 JSON API。所以这是一个选项,但我必须弄清楚如何仅将锦标赛 ID 号和锦标赛统计数据添加为键值对。
示例的 URL 如下所示:https://www.pgatour.com/content/pgatour/stats/stat.02674.y2017.eon.t030.html
eon 仅进行统计锦标赛(eoff 用于 YTD),t030 是锦标赛标记。
我是否应该创建循环并更改年份、锦标赛编号和统计编号并以 JSON 格式获取所有信息并尝试将其放入 df 中?
- 如何将锦标赛和 eon 限定符添加为 JSON url 中的键值对?
- 这甚至可行吗?
或者我应该刮掉它并尝试使用 HTML(可能能够捕获统计行标题)?
包含来自网站的一张表的快照
解决方案
我会去抓取,因为 url 本身可以让你更好地控制你所追求的。此外,您可以使用 pandas 轻松获取表格数据。
例如:
import requests
import pandas as pd
headers = {
"accept": "application/json, text/javascript, */*; q=0.01",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-GB,en-US;q=0.9,en;q=0.8",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.99 Safari/537.36",
"x-requested-with": "XMLHttpRequest",
}
url = "https://www.pgatour.com/content/pgatour/stats/stat.02674.y2017.eon.t030.html"
html = requests.get(url).text
df = pd.read_html(html, flavor="html5lib")
df = pd.concat(df).drop([0, 1, 2], axis=1)
df.to_csv("golf.csv", index=False)
给你这个:
然后,您可以继续交换 URL 或修改 URL 的stat.
、y
和eon
部分以获取不同的统计信息。例如,这是 2018 年美国公开赛 - https://www.pgatour.com/content/pgatour/stats/stat.02674.y2017.eon.t030.html
推荐阅读
- python - 将方法从一个类复制到另一个(python)
- sql-server - 必须在 nopcommerce 4.3 中声明存储过程的标量变量错误
- python - 记录用户提供的输入值和执行 GUI 时调用的函数
- javascript - react-globe.gl 显示 geojson 文件的扭曲版本
- javascript - 如何将文件上传到 url 中的谷歌驱动器?
- django - 映射项目时Django中的NoReverseMatch错误
- c# - 将窗口当前页面用作视图模型时如何清除框架中的导航历史记录窗口视图模型的属性
- php - Laravel Passport 回调路由返回 null
- python - Python将文本文件读入单词数组
- outlook - Outlook IMAP 范围使用新的 MS Graph API 导致 AUTHENTICATE 失败