使用 python 从 chronotrack 运行结果中抓取网页

问题描述 投票:0回答:1

我正在尝试从运行事件结果 chronotrack 平台上抓取结果。 例如,您可以在此链接上查看 2022 年智利圣地亚哥马拉松赛的成绩:https://results.chronotrack.com/event/results/event/event-74000

基于上一个问题,我设法获得了一个 url,该 url 提供了包含特定事件结果的 json。我可以修改显示的结果数量,因此它们都显示在一页中,并且不需要迭代几页

这里是设置url,并读取json数据的例子:

# create url
displaylength = 20000
event = 74000 # santiago 2023
# event = 49653 # santiago 2019

link = (
    'https://results.chronotrack.com/embed/results/results-grid?callback=results_grid17740402&sEcho=7' + 
    f'&iColumns=11&sColumns=&iDisplayStart=0&iDisplayLength={displaylength}' +
    f'&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=60107&bracketID=638654&intervalID=121077&entryID=&eventID={event}&eventTag=event-{event}' +
    '&oemID=www.chronotrack.com&genID=17740402&x=1507682443198&_=1507682443198'
)


# read data
with urllib.request.urlopen(link) as url:
    data = url.read().decode('utf-8')

intro = 'results_grid17740402('
dic = json.loads(data[len(intro):-2])

但是,我找不到方法来选择正确的比赛(10K、21K、42K)或跑步者类别(男子总成绩、40 岁以上女子成绩等)。我尝试调整网址上“raceID”、“bracketID”和“intervalID”后面的数字,但似乎它们对显示的数据并没有真正产生影响。

有什么提示我在创建链接时如何选择正确的种族和类别吗?

但是,我找不到方法来选择正确的比赛(10K、21K、42K)或跑步者类别(男子总成绩、40 岁以上女子成绩等)。我尝试调整网址上“raceID”、“bracketID”和“intervalID”后面的数字,但似乎它们对显示的数据并没有真正产生影响。

有什么提示我在创建链接时如何选择正确的种族和类别吗?

python web screen-scraping
1个回答
0
投票

看来您需要更改

raceID
/
bracketID
/
intervalID
才能获得正确的结果:

import json

import requests

api_url = "https://results.chronotrack.com/embed/results/results-grid"

# for 10K
raceID = 192767
bracketID = 2143412
intervalID = 479537

# for 42K
# raceID = 192769
# bracketID = 2143466
# intervalID = 479543

params = {
    "callback": "results_grid99708633",
    "sEcho": "7",
    "iColumns": "11",
    "sColumns": "",
    "iDisplayStart": "0",
    "iDisplayLength": "9999",
    "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",
    "raceID": raceID,
    "bracketID": bracketID,
    "intervalID": intervalID,
    "entryID": "",
    "eventID": "74000",
    "eventTag": "event-74000",
    "oemID": "www.chronotrack.com",
    "genID": "99708633",
    "x": "1701210896091",
    "_": "1701210896092",
}

data = requests.get(api_url, params=params).text

data = json.loads(data[data.index("{") : -2])

for d in data["aaData"]:
    print(d[2])

打印:

Diego Ignacio Uribe Troncoso
Matias Andres Silva Lastra
Raúl Moya Vásquez
Ignacio Alexander Carrizo Godoy
Luis Gustavo Huaman Matamoros
Rodrigo Machado Hamilton
Luis Valle Barrientos
Luis Miguel Bustos Hormazabal

...
© www.soinside.com 2019 - 2024. All rights reserved.