0

0

使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程

霞舞

霞舞

发布时间:2025-11-29 13:15:09

|

183人浏览过

|

来源于php中文网

原创

使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程

本教程详细介绍了如何利用python的`requests`库与gbgb api交互,以自动化方式抓取指定日期范围和特定赛狗赛道的比赛结果。文章涵盖了api参数的理解、日期范围的程序化生成、http请求的发送、json数据的解析与筛选,以及最终数据的持久化存储,旨在提供一个结构清晰、可复用的数据抓取解决方案。

自动化抓取GBGB赛狗比赛结果

在进行数据分析或建立预测模型时,从特定网站获取大量结构化数据是一项常见需求。对于GBGB(Great British Greyhound Board)的赛狗比赛结果,手动通过网站界面或逐个URL抓取是极其耗时且效率低下的。本教程将展示如何利用Python及其强大的requests库,结合GBGB提供的API接口,实现对指定日期范围和特定赛道的比赛结果进行高效、自动化的抓取。

理解GBGB API接口

GBGB提供了一个API接口,允许开发者通过HTTP请求获取比赛结果数据。根据提供的信息,核心的API端点是: https://api.gbgb.org.uk/api/results

此端点支持以下关键查询参数:

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

通过组合这些参数,我们可以构建出请求URL,例如: https://api.gbgb.org.uk/api/results?page=1&itemsPerPage=200&date=2023-11-01&race_type=race 这将返回2023年11月1日的所有比赛结果中的前200条记录。

设置开发环境

在开始之前,请确保您的Python环境中安装了requests库。如果尚未安装,可以通过以下命令进行安装:

pip install requests

程序化生成日期范围

为了实现指定日期范围的抓取,我们需要编写代码来迭代生成所需的日期字符串。这通常涉及到一个嵌套循环,外层循环处理月份,内层循环处理该月份中的每一天。

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

from datetime import datetime, timedelta
import requests
import json

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

# 存储所有抓取到的数据
all_results = []

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

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

    # 打印当前正在抓取的日期,便于跟踪进度
    print(f"正在抓取 {params['date']} 的数据...")

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

上述代码片段初始化了起始和结束日期,并使用datetime和timedelta对象来逐天递增,确保每个日期都能被处理。

发送API请求与错误处理

在日期循环内部,我们将使用requests.get()方法向API发送请求,并处理可能出现的各种网络或API错误。

意兔-AI漫画相机
意兔-AI漫画相机

照片变漫画手绘,做周边好物

下载
# ... (前面的代码保持不变)

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)
        response.raise_for_status()  # 检查HTTP请求是否成功 (200 OK)

        # 将响应内容解析为JSON
        page_context_dict = response.json()

        # GBGB API的实际数据通常在 'items' 键中
        items = page_context_dict.get('items', []) 

        # 将抓取到的数据添加到总列表中
        all_results.extend(items)

    except requests.exceptions.HTTPError as errh:
        print(f"HTTP错误 (日期: {params['date']}): {errh}")
    except requests.exceptions.ConnectionError as errc:
        print(f"连接错误 (日期: {params['date']}): {errc}")
    except requests.exceptions.Timeout as errt:
        print(f"请求超时 (日期: {params['date']}): {errt}")
    except requests.exceptions.RequestException as err:
        print(f"请求异常 (日期: {params['date']}): {err}")
    except json.JSONDecodeError as json_err:
        print(f"JSON解析错误 (日期: {params['date']}): {json_err} - 响应内容: {response.text[:200]}") # 打印部分响应内容辅助调试

    current_date += timedelta(days=1)

# ... (后续数据处理和保存)

response.raise_for_status()是一个非常有用的方法,它会在HTTP请求返回错误状态码(如4xx或5xx)时抛出HTTPError异常,从而方便我们捕获并处理这些问题。

筛选特定赛道数据

API返回的数据可能包含所有赛道的信息。如果我们需要筛选出特定赛道(例如“Swindon”)的比赛结果,可以在获取到每日数据后进行过滤。

# ... (前面的代码保持不变)

desired_track = "Swindon" # 定义您感兴趣的赛道名称

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)
        response.raise_for_status()

        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)

        all_results.extend(specific_track_items) # 将筛选后的数据添加到总列表

    except Exception as e: # 捕获更广泛的异常,或者保持细致的异常捕获
        print(f"处理日期 {params['date']} 时发生错误: {e}")

    current_date += timedelta(days=1)

# ... (后续数据保存)

这里,我们遍历每天获取到的items列表,检查每个item字典中是否存在trackName键,并且其值是否与desired_track匹配。

完整代码示例

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

from datetime import datetime, timedelta
import requests
import json

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

    Args:
        start_date_str (str): 起始日期,格式 'YYYY-MM-DD'。
        end_date_str (str): 结束日期,格式 'YYYY-MM-DD'。
        desired_track_name (str): 目标赛道的名称,例如 "Swindon"。
        output_filename (str): 结果保存的文件名,默认为 "gbgb_results.json"。
    """
    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

    all_results = []
    base_url = "https://api.gbgb.org.uk/api/results"
    params = {
        'page': '1',
        'itemsPerPage': '200', # 根据API限制和需求调整
        'race_type': 'race'
    }

    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() # 如果状态码不是200,则抛出HTTPError

            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: # 仅当有筛选结果时才添加
                all_results.extend(specific_track_items)

        except requests.exceptions.HTTPError as errh:
            print(f"HTTP错误 (日期: {params['date']}): {errh}")
        except requests.exceptions.ConnectionError as errc:
            print(f"连接错误 (日期: {params['date']}): {errc}")
        except requests.exceptions.Timeout as errt:
            print(f"请求超时 (日期: {params['date']}): {errt}")
        except requests.exceptions.RequestException as err:
            print(f"请求异常 (日期: {params['date']}): {err}")
        except json.JSONDecodeError as json_err:
            print(f"JSON解析错误 (日期: {params['date']}): {json_err}. 响应内容开头: {response.text[:200]}")
        except Exception as e:
            print(f"处理日期 {params['date']} 时发生未知错误: {e}")

        current_date += timedelta(days=1)

    # 将所有抓取到的数据写入JSON文件
    if all_results:
        with open(output_filename, 'w', encoding='utf-8') as f:
            json.dump(all_results, f, ensure_ascii=False, indent=4)
        print(f"数据已成功保存到 {output_filename},共 {len(all_results)} 条记录。")
    else:
        print(f"在指定日期范围和赛道 '{desired_track_name}' 下未找到任何数据。")

if __name__ == "__main__":
    # 示例调用
    scrape_gbgb_results(
        start_date_str="2023-10-01",
        end_date_str="2023-10-31",
        desired_track_name="Swindon",
        output_filename="swindon_results_october.json"
    )

    # 您可以根据需要更改日期范围和赛道名称
    # scrape_gbgb_results(
    #     start_date_str="2023-11-01",
    #     end_date_str="2023-11-15",
    #     desired_track_name="Hove",
    #     output_filename="hove_results_early_november.json"
    # )

注意事项与最佳实践

  1. API速率限制 (Rate Limiting): 频繁或大量请求可能会触发API的速率限制,导致请求被拒绝。虽然GBGB API文档中未明确提及,但在实际操作中应注意。可以考虑在每次请求之间添加time.sleep()来引入延迟,例如time.sleep(0.5)。
  2. 分页处理: 当前代码中itemsPerPage设置为200。如果某天的比赛结果超过200条,并且API支持多页,您可能需要在一个日期内部再增加一个循环来处理page参数,直到没有更多数据返回。
  3. 数据结构变化: API返回的JSON数据结构可能会随时间变化。在编写代码时,应考虑到健壮性,例如使用.get()方法访问字典键,以避免因键不存在而引发错误。
  4. 错误处理: 完善的错误处理机制对于数据抓取至关重要。上述代码已经包含了对常见requests异常和json解析错误的捕获,这有助于诊断和解决问题。
  5. 目标赛道名称: desired_track_name必须与API返回数据中的trackName字段完全匹配,包括大小写。
  6. 文件保存格式: 示例代码将数据保存为JSON格式,这是一种易于机器读取和解析的格式。根据需求,您也可以将其转换为CSV、数据库记录等其他格式。
  7. 代码可复用性: 将抓取逻辑封装在函数中(如scrape_gbgb_results),可以提高代码的可读性和复用性。

总结

通过本教程,我们学习了如何利用Python的requests库与GBGB API接口进行交互,从而高效地抓取指定日期范围和特定赛道的赛狗比赛结果。这种自动化方法不仅节省了大量手动操作的时间,也为后续的数据分析和应用提供了可靠的数据源。掌握API接口的参数、程序化日期生成以及健壮的错误处理是实现此类数据抓取任务的关键。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

457

2023.08.07

json是什么
json是什么

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

549

2023.08.23

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

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

337

2023.10.13

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

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

82

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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