本教程详细介绍了如何使用python高效地从gbgb网站api抓取赛狗比赛结果。通过动态生成日期范围、利用requests库的参数化请求以及对json响应进行解析和按指定赛道过滤,用户可以自动化地收集特定时间段和赛道的比赛数据,并将其保存为json文件,同时包含了健壮的错误处理机制。
在*或赛狗数据分析领域,从在线平台获取历史比赛结果是常见的需求。手动逐一输入比赛ID或会议ID来获取数据效率低下且易出错。本教程将指导您如何利用Python编程语言,结合GBGB(Great Britain Greyhound Board)提供的API接口,实现按指定日期范围和特定赛道自动抓取赛狗比赛结果。
GBGB提供了一个公开的API接口,用于查询比赛结果。通过观察其URL结构,我们可以发现一个通用的结果查询接口: https://api.gbgb.org.uk/api/results
此接口支持以下关键查询参数,允许我们灵活地筛选数据:
通过动态修改date参数,并结合循环,我们可以遍历一个日期范围内的所有比赛数据。
在开始之前,请确保您的Python环境中安装了requests库,它将用于发送HTTP请求。如果尚未安装,可以使用pip进行安装:
pip install requests
本教程主要使用以下Python标准库和第三方库:
为了实现按日期范围抓取数据,我们需要一个机制来生成一系列日期,并将其作为参数传递给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(2025, 10, 1) # 例如从2025年10月1日开始
end_date = datetime(2025, 12, 31) # 到2025年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)代码解析:
在生成日期参数后,下一步是使用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}")代码解析:
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) # 将过滤后的数据添加到总列表中
# ... (接上文代码) ...代码解析:
在所有日期的数据都抓取并过滤完毕后,最后一步是将累计的数据保存到本地文件中,通常选择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)} 条记录。")代码解析:
将上述所有部分整合,形成一个完整的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未抓取到任何数据或发生错误。")
通过本教程,您已经掌握了使用Python从GBGB API高效抓取特定日期范围和赛道比赛结果的方法。这不仅提高了数据收集的效率,也为后续的数据分析奠定了基础。
# python
# js
# json
# 编码
# app
# 编程语言
# ai
# win
# 配置文件
# 状态码
# python编程
# 字符串解析
相关文章:
b2c电商网站制作流程,b2c水平综合的电商平台?
建站主机是否属于云主机类型?
官网网站制作腾讯审核要多久,联想路由器newifi官网
大同网页,大同瑞慈医院官网?
建站主机CVM配置优化、SEO策略与性能提升指南
如何彻底删除建站之星生成的Banner?
如何通过主机屋免费建站教程十分钟搭建网站?
网站专业制作公司有哪些,做一个公司网站要多少钱?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
想学网站制作怎么学,建立一个网站要花费多少?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
建站之星后台密码遗忘?如何快速找回?
制作证书网站有哪些,全国城建培训中心证书查询官网?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
建站主机空间推荐 高性价比配置与快速部署方案解析
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
代购小票制作网站有哪些,购物小票的简要说明?
建站主机选购指南与交易推荐:核心配置解析
建站之星价格显示格式升级,你的预算足够吗?
广州建站公司哪家好?十大优质服务商推荐
网站制作公司,橙子建站是合法的吗?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
常州企业建站如何选择最佳模板?
如何快速搭建自助建站会员专属系统?
贸易公司网站制作流程,出口贸易网站设计怎么做?
南宁网站建设制作定制,南宁网站建设可以定制吗?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何快速搭建响应式可视化网站?
建站主机类型有哪些?如何正确选型
如何在阿里云虚拟服务器快速搭建网站?
如何撰写建站申请书?关键要点有哪些?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何在万网自助建站中设置域名及备案?
ui设计制作网站有哪些,手机UI设计网址吗?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何快速完成中国万网建站详细流程?
建站之星安装后如何自定义网站颜色与字体?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何用VPS主机快速搭建个人网站?
详解jQuery停止动画——stop()方法的使用
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
建站主机与虚拟主机有何区别?如何选择最优方案?
建站之星如何通过成品分离优化网站效率?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何用y主机助手快速搭建网站?
高端建站三要素:定制模板、企业官网与响应式设计优化
简历在线制作网站免费版,如何创建个人简历?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。