如何用Python筛选Chronotrack赛事数据的项目与组别?
解决Chronotrack赛事数据的项目与组别筛选问题
问题根源
你调整raceID、bracketID、intervalID后没效果,核心是这些参数是对应特定赛事项目/组别的动态标识,你硬编码的旧参数(比如示例里的60107、638654)和当前目标赛事的实际参数不匹配,自然起不到筛选作用。
正确获取筛选参数的步骤
- 打开目标赛事的官方结果网页(比如你提到的圣地亚哥马拉松页面)
- 按下F12打开浏览器开发者工具,切换到「Network」标签页
- 在页面上手动选择你要筛选的项目(比如42K)和组别(比如男子40岁以上),此时开发者工具会捕获到新的XHR请求
- 找到请求地址包含
results-grid的条目,查看它的请求参数,提取其中的raceID、bracketID、intervalID——这些就是对应你所选筛选条件的有效参数
调整后的代码示例
把获取到的有效参数替换到URL里,同时优化动态参数避免缓存问题:
import urllib.request import json import time # 目标赛事ID event = 74000 # 圣地亚哥2023 # 替换成你从开发者工具获取的有效参数 race_id = "XXX" bracket_id = "XXX" interval_id = "XXX" # 动态生成callback和时间戳,避免缓存 callback = f"results_grid{int(time.time())}" timestamp = str(int(time.time() * 1000)) displaylength = 20000 link = ( f'https://results.chronotrack.com/embed/results/results-grid?callback={callback}&sEcho=7' + f'&iColumns=11&sColumns=&iDisplayStart=0&iDisplayLength={displaylength}' + '&mDataProp_0=0&mDataProp_1=1&mDataProp_2=2&mDataProp_3=3&mDataProp_4=4&mDataProp_5=5&mDataProp_6=6&mDataProp_7=7&mDataProp_8=8&mDataProp_9=9&mDataProp_10=10' + f'&raceID={race_id}&bracketID={bracket_id}&intervalID={interval_id}&entryID=&eventID={event}&eventTag=event-{event}' + f'&oemID=www.chronotrack.com&genID={int(time.time())}&x={timestamp}&_={timestamp}' ) # 读取并解析数据 with urllib.request.urlopen(link) as url: data = url.read().decode('utf-8') intro = f'{callback}(' dic = json.loads(data[len(intro):-2]) # 验证筛选结果 print(f"返回数据条数: {dic['iTotalRecords']}")
备选方案:本地筛选
如果API参数筛选始终有问题,也可以先获取全量数据,再在本地用Python过滤:
# 假设全量数据已获取到dic里 # 筛选42K项目+男子40岁以上组别(需根据实际列索引调整) filtered_data = [ row for row in dic['aaData'] if row[2] == "Marathon (42K)" and row[5] == "M 40-44" ]
注:需要根据返回的aaData列顺序,替换对应的项目/组别列索引
内容的提问来源于stack exchange,提问作者bicarrio
相关产品推荐
相关产品推荐

