Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程

聖光之護
发布: 2025-11-29 12:44:22
原创
815人浏览过

Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程

本教程详细介绍了如何使用python自动化从gbgb官方api抓取指定日期范围内的赛狗比赛结果,并根据特定赛道进行数据筛选。通过动态构建api请求参数、处理json响应及实现健壮的错误处理机制,用户可以高效地收集和存储所需数据,摆脱手动输入id的繁琐。

引言:自动化数据获取的必要性

在进行数据分析或建立预测模型时,获取大量、结构化的原始数据是基础且关键的一步。对于像GBGB(Great Britain Greyhound Board)这类网站,手动通过网页界面或逐一输入比赛ID来获取结果不仅效率低下,而且极易出错。幸运的是,许多网站提供了API(应用程序接口),允许开发者通过编程方式批量访问其数据。本教程将指导您如何利用Python和GBGB的API接口,高效地抓取指定日期范围内的赛狗比赛结果,并针对特定赛道进行数据筛选。

GBGB API接口解析

GBGB提供了一个公开的API端点,用于查询比赛结果。通过分析其URL结构,我们可以发现一个通用的结果查询接口:https://api.gbgb.org.uk/api/results。此接口支持以下关键查询参数:

  • page: 查询结果的页码,默认为1。
  • itemsPerPage: 每页返回的条目数量,用于控制单次请求的数据量。
  • date: 查询指定日期的比赛结果,格式为 YYYY-MM-DD。
  • race_type: 比赛类型,例如 'race'。

了解这些参数是实现自动化抓取的基础。通过动态地修改 date 参数,我们便可以遍历指定日期范围内的所有比赛结果。

环境准备

在开始编写代码之前,请确保您的Python环境中已安装必要的库。本教程主要依赖 requests 库来发送HTTP请求和 json 库来处理API返回的JSON数据。

立即学习Python免费学习笔记(深入)”;

如果您尚未安装 requests 库,可以通过以下命令进行安装:

pip install requests
登录后复制

json 库是Python标准库的一部分,无需额外安装。

核心实现:动态日期范围抓取

要实现指定日期范围的抓取,我们需要构建一个循环结构,依次生成每个日期的API请求URL。

1. 构建请求参数

首先,定义API的基础URL和固定的查询参数:

Quinvio AI
Quinvio AI

AI辅助下快速创建视频,虚拟代言人

Quinvio AI 59
查看详情 Quinvio AI
import requests
import json

json_list = []
base_url = "https://api.gbgb.org.uk/api/results"
params = {
    'page': '1',
    'itemsPerPage': '200', # 设定每页返回200条,可根据需求调整
    'race_type': 'race'
}
登录后复制

2. 日期循环逻辑

为了遍历一个日期范围,我们可以使用嵌套循环,外层循环遍历月份,内层循环遍历天数。这里以抓取2023年10月至12月的数据为例:

# 示例:抓取2023年10月至12月的数据
for month in range(10, 12 + 1):  # 循环遍历月份,例如10, 11, 12
    # 根据月份确定当月的天数
    if month == 2:
        get_days_in_month = 28 # 简化处理,未考虑闰年
    elif month in [4, 6, 9, 11]:
        get_days_in_month = 30
    else:
        get_days_in_month = 31

    for day in range(1, get_days_in_month + 1):  # 循环遍历每天
        # 格式化日期字符串为 YYYY-MM-DD 形式
        # 使用 f-string 的 :02d 格式化,确保月份和日期始终为两位数(例如 01, 02)
        params['date'] = f'2023-{month:02d}-{day:02d}'
        # ... 后续发送请求和处理数据的代码
登录后复制

3. 发送HTTP请求与处理响应

在每次日期循环中,我们将使用 requests.get() 方法发送HTTP GET请求,并将 params 字典作为参数传入。requests 库会自动将字典转换为URL查询字符串。

API的响应通常是JSON格式。我们可以使用 response.json() 方法将其直接解析为Python字典。

        try:
            response = requests.get(base_url, params=params)
            response.raise_for_status()  # 检查请求是否成功,如果状态码不是2xx则抛出异常

            page_context_dict = response.json()  # 将JSON响应转换为Python字典
            items = page_context_dict.get('items', []) # 获取比赛结果列表,如果不存在则返回空列表

            # ... 后续数据筛选和存储的代码

        except requests.exceptions.HTTPError as errh:
            print(f"HTTP Error for date {params['date']}: {errh}")
        except requests.exceptions.ConnectionError as errc:
            print(f"Error Connecting for date {params['date']}: {errc}")
        except requests.exceptions.Timeout as errt:
            print(f"Timeout Error for date {params['date']}: {errt}")
        except requests.exceptions.RequestException as err:
            print(f"Oops: Something Else for date {params['date']}: {err}")
        except json.JSONDecodeError as json_err:
            print(f"JSON Decode Error for date {params['date']}: {json_err}")
登录后复制

数据筛选:指定赛道结果

API返回的数据可能包含所有赛道的结果。如果只需要特定赛道的数据,我们可以在获取到 items 列表后进行筛选。

            specific_track_items = []
            desired_track = "Swindon" # 指定您想要筛选的赛道名称,例如 "Swindon" 或 "Hove"

            for item in items:
                # 检查字典中是否存在 'trackName' 键,并判断其值是否与目标赛道匹配
                if "trackName" in item and item["trackName"] == desired_track:
                    specific_track_items.append(item)

            json_list.extend(specific_track_items) # 将筛选后的数据添加到总列表中
登录后复制

数据存储:保存为JSON文件

在完成所有日期范围的遍历和数据收集后,我们将累积的 json_list 写入一个JSON文件。

# 在所有循环结束后,将收集到的所有数据写入一个JSON文件
with open('filtered_gbgb_results.json', 'w', encoding='utf-8') as f:
    json.dump(json_list, f, ensure_ascii=False, indent=4)
print(f"所有指定日期和赛道的数据已保存到 'filtered_gbgb_results.json' 文件。共计 {len(json_list)} 条记录。")
登录后复制

ensure_ascii=False 确保中文字符(如果API响应中包含)能正确写入文件,indent=4 则使JSON文件更具可读性。

完整示例代码

结合上述所有步骤,以下是完整的Python代码,用于抓取指定日期范围和赛道的数据:

from urllib.request import urlopen # 尽管此处未使用,但保留以示原问题上下文
import requests
import json

# 用于存储所有抓取到的数据的列表
json_list = []

# GBGB API的基础URL
base_url = "https://api.gbgb.org.uk/api/results"

# 固定的查询参数
params = {
    'page': '1',
    'itemsPerPage': '200',  # 每页返回的条目数量,可根据API限制和需求调整
    'race_type': 'race'     # 比赛类型
}

# 设定您想要筛选的赛道名称
desired_track = "Hove" # 例如,您可以改为 "Swindon" 或其他赛道名称

# 定义需要抓取的年份和月份范围
target_year = 2023
start_month = 10
end_month = 12

# 循环遍历指定年份的月份范围
for month in range(start_month, end_month + 1):
    # 根据月份确定当月的天数(简化处理,未考虑闰年)
    if month == 2:
        get_days_in_month = 28
    elif month in [4, 6, 9, 11]:
        get_days_in_month = 30
    else:
        get_days_in_month = 31

    # 循环遍历当月的所有天数
    for day in range(1, get_days_in_month + 1):
        # 动态更新 'date' 参数,格式为 YYYY-MM-DD
        params['date'] = f'{target_year}-{month:02d}-{day:02d}'
        print(f"正在抓取日期: {params['date']} 的数据...")

        try:
            # 使用 requests 库发送 HTTP GET 请求
            response = requests.get(base_url, params=params)
            response.raise_for_status()  # 如果请求失败(状态码非2xx),则抛出异常

            # 将API响应解析为Python字典
            page_context_dict = response.json()
            items = page_context_dict.get('items', []) # 获取比赛结果列表

            # 用于存储当前日期和赛道筛选后的结果
            specific_track_items = []

            # 遍历所有比赛结果,并根据赛道名称进行筛选
            for item in items:
                if "trackName" in item and item["trackName"] == desired_track:
                    specific_track_items.append(item)

            # 将筛选后的结果添加到总列表中
            json_list.extend(specific_track_items)

        except requests.exceptions.HTTPError as errh:
            print(f"HTTP Error for date {params['date']}: {errh}")
        except requests.exceptions.ConnectionError as errc:
            print(f"Error Connecting for date {params['date']}: {errc}")
        except requests.exceptions.Timeout as errt:
            print(f"Timeout Error for date {params['date']}: {errt}")
        except requests.exceptions.RequestException as err:
            print(f"Oops: Something Else for date {params['date']}: {err}")
        except json.JSONDecodeError as json_err:
            print(f"JSON Decode Error for date {params['date']}: {json_err}")
        except Exception as e:
            print(f"An unexpected error occurred for date {params['date']}: {e}")

# 在所有循环结束后,将收集到的所有数据写入一个JSON文件
output_filename = f'{desired_track}_results_{target_year}_{start_month:02d}-{end_month:02d}.json'
with open(output_filename, 'w', encoding='utf-8') as f:
    json.dump(json_list, f, ensure_ascii=False, indent=4) # indent=4 使JSON文件格式化,更易读
print(f"所有指定日期和赛道的数据已保存到 '{output_filename}' 文件。共计 {len(json_list)} 条记录。")
登录后复制

注意事项与优化

  1. API请求频率: 频繁或过快的API请求可能会导致您的IP地址被暂时封禁。在实际应用中,建议在每次请求之间添加适当的延迟(例如 time.sleep(1)),以模拟人类行为并遵守API的使用策略。
  2. itemsPerPage 参数: itemsPerPage 参数决定了单次请求返回的数据量。如果设定的值过大,可能会超出API的限制;如果过小,则需要更多的请求才能获取所有数据。根据API文档或实际测试来调整此值。
  3. API接口变动: API接口的结构和参数可能会随时间变化。如果代码突然失效,请检查GBGB网站的API文档(如果提供)或通过浏览器开发者工具观察其网络请求,以获取最新的接口信息。
  4. 代理与会话: 对于需要处理大量请求或规避IP限制的场景,可以考虑使用代理IP池。此外,使用 requests.Session() 对象可以提高效率,因为它会重用底层的TCP连接。
  5. 错误处理的健壮性: 示例代码中包含了基本的错误处理。在生产环境中,您可能需要更详细的日志记录、重试机制或更复杂的异常处理策略。
  6. 数据清洗与分析: 抓取到的原始JSON数据可能需要进一步的清洗、转换和分析,才能用于具体的业务场景。

总结

通过本教程,您已经学会了如何利用Python的 requests 库和GBGB的API接口,实现自动化地抓取指定日期范围和赛道的赛狗比赛结果。这种方法不仅大大提高了数据获取的效率,也为后续的数据分析和应用奠定了坚实的基础。掌握API数据抓取技能,是现代数据工作者不可或缺的能力之一。

以上就是Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号