0

0

Python实现GBGB赛狗结果数据抓取:按日期范围和赛道筛选的教程

DDD

DDD

发布时间:2025-12-02 13:36:26

|

405人浏览过

|

来源于php中文网

原创

Python实现GBGB赛狗结果数据抓取:按日期范围和赛道筛选的教程

本教程详细介绍了如何使用python高效地从gbgb网站api抓取赛狗比赛结果。通过动态生成日期范围、利用requests库的参数化请求以及对json响应进行解析和按指定赛道过滤,用户可以自动化地收集特定时间段和赛道的比赛数据,并将其保存为json文件,同时包含了健壮的错误处理机制。

在赛马或赛狗数据分析领域,从在线平台获取历史比赛结果是常见的需求。手动逐一输入比赛ID或会议ID来获取数据效率低下且易出错。本教程将指导您如何利用Python编程语言,结合GBGB(Great Britain Greyhound Board)提供的API接口,实现按指定日期范围和特定赛道自动抓取赛狗比赛结果。

1. 理解GBGB API接口

GBGB提供了一个公开的API接口,用于查询比赛结果。通过观察其URL结构,我们可以发现一个通用的结果查询接口: https://api.gbgb.org.uk/api/results

此接口支持以下关键查询参数,允许我们灵活地筛选数据:

  • date: 指定查询的日期,格式为 YYYY-MM-DD。这是我们实现日期范围抓取的关键。
  • page: 页码,用于分页查询。
  • itemsPerPage: 每页返回的条目数。
  • race_type: 比赛类型,例如 'race'。

通过动态修改date参数,并结合循环,我们可以遍历一个日期范围内的所有比赛数据。

2. 环境准备与依赖库

在开始之前,请确保您的Python环境中安装了requests库,它将用于发送HTTP请求。如果尚未安装,可以使用pip进行安装:

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

pip install requests

本教程主要使用以下Python标准库和第三方库:

  • requests: 处理HTTP请求。
  • json: 处理JSON数据格式。

3. 构建动态日期范围请求

为了实现按日期范围抓取数据,我们需要一个机制来生成一系列日期,并将其作为参数传递给API。以下代码段展示了如何通过嵌套循环生成指定年份的月份和日期,并格式化为API所需的日期字符串:

import requests
import json
from datetime import datetime, timedelta

# API基础URL和固定参数
base_url = "https://api.gbgb.org.uk/api/results"
params = {
    'page': '1',
    'itemsPerPage': '200', # 假设每页最多200条,可根据API限制调整
    'race_type': 'race'
}

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

# 定义抓取数据的起始和结束日期
start_date = datetime(2023, 10, 1) # 例如从2023年10月1日开始
end_date = datetime(2023, 12, 31) # 到2023年12月31日结束

current_date = start_date
while current_date <= end_date:
    # 格式化当前日期为 YYYY-MM-DD
    params['date'] = current_date.strftime('%Y-%m-%d')

    # ... 后续的请求和数据处理逻辑将在这里执行 ...

    # 移动到下一天
    current_date += timedelta(days=1)

代码解析:

小羊标书
小羊标书

一键生成百页标书,让投标更简单高效

下载
  • 我们使用datetime对象来表示日期,并通过timedelta来递增日期。
  • strftime('%Y-%m-%d')用于将datetime对象格式化为API所需的YYYY-MM-DD字符串。
  • itemsPerPage设置为200,这是一个合理的初始值,可以根据实际情况和API限制进行调整。如果单日比赛结果超过此限制,可能需要实现分页逻辑(通过递增page参数)。

4. 发送HTTP请求与参数化

在生成日期参数后,下一步是使用requests库发送GET请求。requests库允许我们通过params参数传递查询字符串,这比手动拼接URL更加简洁和安全。

# ... (接上文代码) ...

    try:
        # 使用requests发送GET请求,并传递参数
        response = requests.get(base_url, params=params)
        # 检查HTTP请求是否成功 (状态码200)
        response.raise_for_status()

        # 将JSON响应转换为Python字典
        page_context_dict = response.json()
        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 happened for date {params['date']}: {err}")
    except json.JSONDecodeError as json_err:
        print(f"JSON Decode Error for date {params['date']}: {json_err}")

代码解析:

  • requests.get(base_url, params=params): 发送带有动态日期参数的GET请求。
  • response.raise_for_status(): 这是错误处理的关键一步,如果HTTP响应状态码表示请求失败(例如4xx或5xx),它将抛出一个HTTPError。
  • response.json(): 将API返回的JSON字符串解析为Python字典。
  • page_context_dict.get('items', []): 安全地获取字典中'items'键的值,如果键不存在则返回空列表,避免KeyError。

5. 按指定赛道过滤数据

API返回的数据可能包含所有赛道的比赛结果。如果只对特定赛道感兴趣,我们需要对获取到的数据进行过滤。每个比赛结果项通常包含一个"trackName"字段。

# ... (接上文代码) ...

        specific_track_items = []
        desired_track = "Swindon" # 设置您想抓取的赛道名称,例如"Swindon"或"Hove"

        for item in items:
            if "trackName" in item and item["trackName"] == desired_track:
                specific_track_items.append(item)

        json_list.extend(specific_track_items) # 将过滤后的数据添加到总列表中

# ... (接上文代码) ...

代码解析:

  • desired_track: 定义您希望筛选的赛道名称。请注意,赛道名称必须与API返回的"trackName"字段完全匹配,包括大小写。
  • 循环遍历items列表,检查每个item字典中是否存在"trackName"键,并且其值是否等于desired_track。
  • 符合条件的项被添加到specific_track_items列表中,然后合并到总的json_list中。

6. 数据持久化:保存为JSON文件

在所有日期的数据都抓取并过滤完毕后,最后一步是将累计的数据保存到本地文件中,通常选择JSON格式以便于后续处理。

# ... (接上文代码,在while循环结束后) ...

# 将所有收集到的数据写入JSON文件
with open('greyhound_results.json', 'w', encoding='utf-8') as f:
    json.dump(json_list, f, ensure_ascii=False, indent=4)

print(f"数据已成功抓取并保存到 'greyhound_results.json' 文件中。共 {len(json_list)} 条记录。")

代码解析:

  • with open(...) as f:: 以写入模式打开一个文件,确保文件在使用完毕后自动关闭。
  • encoding='utf-8': 确保文件能够正确处理各种字符编码
  • json.dump(json_list, f, ensure_ascii=False, indent=4): 将json_list写入文件。
    • ensure_ascii=False: 允许非ASCII字符(如特殊符号)以原始形式写入,而不是转义为\uXXXX。
    • indent=4: 使输出的JSON文件格式化,带有4个空格的缩进,提高可读性。

7. 完整代码示例

将上述所有部分整合,形成一个完整的Python脚本:

import requests
import json
from datetime import datetime, timedelta

def scrape_gbgb_results(start_date_str, end_date_str, desired_track_name):
    """
    从GBGB API抓取指定日期范围和赛道的赛狗比赛结果。

    Args:
        start_date_str (str): 起始日期字符串,格式为 'YYYY-MM-DD'。
        end_date_str (str): 结束日期字符串,格式为 'YYYY-MM-DD'。
        desired_track_name (str): 需要筛选的赛道名称。

    Returns:
        list: 包含所有符合条件的比赛结果字典的列表。
    """
    json_list = []
    base_url = "https://api.gbgb.org.uk/api/results"
    params = {
        'page': '1',
        'itemsPerPage': '200', # 根据API限制和需求调整
        'race_type': 'race'
    }

    try:
        start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
        end_date = datetime.strptime(end_date_str, '%Y-%m-%d')
    except ValueError:
        print("日期格式错误,请使用 'YYYY-MM-DD' 格式。")
        return []

    current_date = start_date
    while current_date <= end_date:
        params['date'] = current_date.strftime('%Y-%m-%d')
        print(f"正在抓取日期: {params['date']} 的数据...")

        try:
            response = requests.get(base_url, params=params, timeout=10) # 设置超时
            response.raise_for_status() # 检查HTTP请求是否成功

            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_name:
                    specific_track_items.append(item)

            if specific_track_items:
                json_list.extend(specific_track_items)
                print(f"  - 找到 {len(specific_track_items)} 条 '{desired_track_name}' 赛道记录。")
            else:
                print(f"  - 未找到 '{desired_track_name}' 赛道记录。")

        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 happened for date {params['date']}: {err}")
        except json.JSONDecodeError as json_err:
            print(f"JSON Decode Error for date {params['date']}: {json_err}")

        current_date += timedelta(days=1)

    return json_list

if __name__ == "__main__":
    # 配置抓取参数
    start_date = '2023-10-01'
    end_date = '2023-12-31'
    track_name = 'Swindon' # 替换为您感兴趣的赛道名称,例如 'Hove'

    print(f"开始抓取从 {start_date} 到 {end_date} 期间 '{track_name}' 赛道的比赛结果...")
    results = scrape_gbgb_results(start_date, end_date, track_name)

    if results:
        output_filename = f"{track_name}_results_{start_date}_to_{end_date}.json"
        with open(output_filename, 'w', encoding='utf-8') as f:
            json.dump(results, f, ensure_ascii=False, indent=4)
        print(f"\n数据已成功抓取并保存到 '{output_filename}' 文件中。共 {len(results)} 条记录。")
    else:
        print("\n未抓取到任何数据或发生错误。")

8. 注意事项与优化建议

  • API请求频率限制 (Rate Limiting): 大多数API都有请求频率限制,以防止滥用。如果短时间内发送大量请求,您的IP地址可能会被临时封禁。在实际应用中,建议在每次请求之间添加短时间的延迟(例如使用time.sleep(0.5)),以避免触发频率限制。
  • 年份参数动态化: 示例代码中的日期是硬编码的。您可以扩展代码,使其能够接受用户输入的年份范围,或者从配置文件中读取。
  • itemsPerPage与分页: 如果单日比赛结果非常多,超过了itemsPerPage的限制,API会进行分页。您需要修改代码,在检测到items数量等于itemsPerPage时,递增params['page']并继续请求,直到获取所有页面的数据。
  • 错误处理的健壮性: 虽然示例代码包含了基本的错误处理,但在生产环境中可能需要更复杂的逻辑,例如重试机制、日志记录等。
  • 数据结构变化: API接口可能会更新,导致返回的JSON数据结构发生变化。建议定期检查API文档或通过少量请求测试数据结构,以确保您的抓取脚本仍然有效。
  • 代理IP: 如果需要抓取大量数据,或者遇到IP封禁问题,可以考虑使用代理IP池来轮换IP地址。

通过本教程,您已经掌握了使用Python从GBGB API高效抓取特定日期范围和赛道比赛结果的方法。这不仅提高了数据收集的效率,也为后续的数据分析奠定了基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

373

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

433

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

798

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

370

2025.07.23

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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