新闻中心

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

2025-11-29
浏览次数:
返回列表

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数据。

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

pip install requests

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

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

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

1. 构建请求参数

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

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. 日期循环逻辑

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

N世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界
# 示例:抓取2025年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'2025-{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 = 2025
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赛狗比赛结果:日期范围与赛道筛选教程的详细内容,更多请关注其它相关文章!


# 阿里云网站建设怎么样  # 当月  # 您的  # 我们可以  # 可以使用  # 您想  # 抛出  # 南通的网站建设  # 烟台提供网站建设平台  # 赛狗  # 青春校园网站优化策划书  # 湖南百度seo  # 火锅店营销推广视频  # 湖北推广网站搭建系统  # 澳门一站式营销推广  # 湖南关键词排名手机  # 长沙网站seo优化代理  # 数据清洗  # js  # json  # 浏览器  # app  # 工具  # session  # ai  # win  # python  # 状态码  # 标准库  # yy  # b网  # 遍历  # 转换为  # 每页 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: R星幕后开发视频泄露 包含《GTA6》等多款大作  美团外卖商家服务中心入口 美团商家版官网入口  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  C++如何实现单例模式_C++设计模式之线程安全的单例写法  126邮箱账号注册 电脑版登录入口  学习通在线学习平台 学习通网页版直接进入课程中心  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  实现分段式页面滚动导航:CSS与J*aScript教程  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  知音漫客正版漫画平台_知音漫客官网账号登录  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  Go Martini框架:动态服务解码后的图片内容  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  如何将HTML表格多行数据保存到Google Sheets  qq游戏手机版下载安装_qq游戏移动端入口  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  Archive of Our Own官网直达 AO3最新可用地址一览  新手怎么开始学化妆 零基础化妆入门教程  在Qt QML中通过Python字典动态更新TextEdit内容的教程  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  J*aScript中正确使用querySelectorAll与复杂CSS选择器  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  抖音从哪里进入网页版_抖音官方入口链接  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  淘宝网网页版登录入口 淘宝官方网页版快捷登录  Lar*el 8 多关键词数据库搜索优化实践  大麦的“候补”是什么意思 大麦候补购票规则【详解】  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  Go语言中动态执行代码字符串的策略与实践  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  Lar*el Excel导入时生成自定义递增ID的策略与实践  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  实现全屏滚动与导航点:专业教程  将HTML动态表格多行数据保存到Google Sheet的教程  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法 

搜索