
本教程详细介绍了如何利用python的`requests`库与gbgb api交互,以自动化方式抓取指定日期范围和特定赛狗赛道的比赛结果。文章涵盖了api参数的理解、日期范围的程序化生成、http请求的发送、json数据的解析与筛选,以及最终数据的持久化存储,旨在提供一个结构清晰、可复用的数据抓取解决方案。
在进行数据分析或建立预测模型时,从特定网站获取大量结构化数据是一项常见需求。对于GBGB(Great British Greyhound Board)的赛狗比赛结果,手动通过网站界面或逐个URL抓取是极其耗时且效率低下的。本教程将展示如何利用Python及其强大的requests库,结合GBGB提供的API接口,实现对指定日期范围和特定赛道的比赛结果进行高效、自动化的抓取。
GBGB提供了一个API接口,允许开发者通过HTTP请求获取比赛结果数据。根据提供的信息,核心的API端点是: https://api.gbgb.org.uk/api/results
此端点支持以下关键查询参数:
通过组合这些参数,我们可以构建出请求URL,例如: https://api.gbgb.org.uk/api/results?page=1&itemsPerPage=200&date=2025-11-01&race_type=race 这将返回2025年11月1日的所有比赛结果中的前200条记录。
在开始之前,请确保您的Python环境中安装了requests库。如果尚未安装,可以通过以下命令进行安装:
pip install requests
为了实现指定日期范围的抓取,我们需要编写代码来迭代生成所需的日期字符串。这通常涉及到一个嵌套循环,外层循环处理月份,内层循环处理该月份中的每一天。
from datetime import datetime, timedelta
import requests
import json
# 定义抓取的起始和结束日期
start_date = datetime(2025, 10, 1) # 例如,从2025年10月1日开始
end_date = datetime(2025, 12, 31) # 到2025年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对象来逐天递增,确保每个日期都能被处理。
在日期循环内部,我们将使用requests.get()方法向API发送请求,并处理可能出现的各种网络或API错误。
Viggle AI Video
Powerful AI-powered animation tool and image-to-video AI generator.
115
查看详情
# ... (前面的代码保持不变)
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="2025-10-01",
end_date_str="2025-10-31",
desired_track_name="Swindon",
output_filename="swindon_results_october.json"
)
# 您可以根据需要更改日期范围和赛道名称
# scrape_gbgb_results(
# start_date_str="2025-11-01",
# end_date_str="2025-11-15",
# desired_track_name="Hove",
# output_filename="hove_results_early_november.json"
# )通过本教程,我们学习了如何利用Python的requests库与GBGB API接口进行交互,从而高效地抓取指定日期范围和特定赛道的赛狗比赛结果。这种自动化方法不仅节省了大量手动操作的时间,也为后续的数据分析和应用提供了可靠的数据源。掌握API接口的参数、程序化日期生成以及健壮的错误处理是实现此类数据抓取任务的关键。
以上就是使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程的详细内容,更多请关注其它相关文章!
# seo优化排名服务
# 浮点
# 复用
# 赛狗
# 几种
# 解决问题
# 抛出
# 新安seo优化厂
# 小型网站建设源码
# 分页
# 政府网站专栏建设工作
# 娄底360营销推广
# 新民网站推广工具
# 垃圾公众号文案网站推广
# 信阳网站建设品牌大全
# 杭州网站建设总部
# 厦门公司推广网站
# python
# 每页
# 数据结构
# AI-powered
# red
# yy
# python脚本
# 持久化存储
# 开发环境
# 状态码
# win
# ai
# csv
# app
# json
# js
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
中大网校app做题记录清除方法
windows10怎么开启卓越性能_windows10电源选项代码激活
易车网官网直达入口 易车网在线登录入口
Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理
HTML Canvas文本样式定制指南:解决外部字体加载与应用难题
Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】
b站如何剪辑视频_b站必剪app使用教程
Python测试中模块导入路径解析的最佳实践
PHP页面重载时变量值不重置的实现方法
steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明
todesk如何添加信任设备_todesk信任设备设置教程
铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明
解决Go encoding/json 将JSON大数字解析为浮点数的问题
163邮箱网页版入口 163邮箱在线使用
Lar*el Socialite单设备登录策略:实现用户唯一会话管理
Vue 3中独立响应式实例的创建与应用
Win10截图远程协助 Win10远程桌面截屏法【场景应用】
修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现
悟空浏览器网页版链接 悟空浏览器网页版最新有效地址
支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法
《漫蛙manwa2》防走失网页版链接2025
《三国:谋定天下》平民全阶段通用阵容
cad怎么隐藏指定的图层_cad隐藏或冻结图层方法
使用document.execCommand实现Web文本编辑器加粗/取消加粗
OpenWeatherMap API:通过城市名称获取天气预报数据指南
b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法
圆通快递官网入口查询单号 手机版官方查询入口
作业帮网页版不用下载入口 在线问老师快速答疑
《偃武》甘宁技能详解
mysql如何回滚事务_mysql ROLLBACK事务回滚方法
顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南
Magento 2 产品保存事件中安全更新属性的最佳实践
TikTok视频播放不流畅怎么办 TikTok视频播放优化方法
pubmed数据库官方主页_pubmed学术论文查找官网直达
Fedora怎么安装 Fedora Workstation安装步骤
J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践
J*aScript类型数组_TypedArray使用
微信如何设置字体大小_微信字体设置的阅读舒适
铁路12306官网入口 铁路12306中国铁路官网登录首页
教资成绩怎么查询
b站如何管理订阅_b站订阅标签分类管理
Python中深度嵌套字典与列表的数据提取与条件过滤指南
《星露谷物语》克林特好感度事件介绍
铁路12306官网登录入口 铁路12306在线购票官方平台
Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能
一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化
AO3中文入口稳定分享_AO3官网HTTPS看文详解
iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法
《雷电模拟器》自动点击设置方法
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
2025-11-29
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。