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


2025-11-29
浏览次数:次
返回列表
: '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)} 条记录。")