新闻中心
使用Python爬取GBGB赛狗结果:按日期范围和赛道筛选数据

本教程详细介绍了如何使用python从gbgb(great british greyhound board)网站的api接口高效爬取赛狗比赛结果。我们将学习如何通过构建动态日期范围参数来批量获取数据,并进一步根据特定赛道名称进行筛选,最终将爬取到的结构化数据保存为json文件,避免了手动输入大量url的繁琐。
1. 引言与API概览
在进行数据抓取时,手动构造大量特定ID的URL是一种低效且容易出错的方法。针对GBGB(Great British Greyhound Board)赛狗结果的爬取,其官方API提供了一个更为便捷的接口,允许我们通过日期范围和分页参数来获取数据。本教程将指导您如何利用 https://api.gbgb.org.uk/api/results 这一通用API端点,结合Python的 requests 库,实现按指定日期范围和赛道名称筛选比赛结果。
该API端点支持以下关键查询参数:
- page: 当前页码。
- itemsPerPage: 每页返回的条目数量。
- date: 查询的具体日期,格式为 YYYY-MM-DD。
- race_type: 比赛类型,通常为 race。
通过动态调整这些参数,我们可以灵活地获取所需数据。
2. 环境准备与基础配置
在开始之前,请确保您的Python环境中已安装 requests 库。如果尚未安装,可以通过以下命令进行安装:
pip install requests
接下来,我们需要导入必要的库并设置API请求的基础URL和默认参数:
import requests
import json
from datetime import datetime, timedelta
# 用于存储所有抓取到的数据的列表
json_list = []
# GBGB API的基础URL
base_url = "https://api.gbgb.org.uk/api/results"
# API请求的默认参数
params = {
'page': '1', # 默认从第一页开始
'itemsPerPage': '200', # 每页返回200条数据,可根据需求调整
'race_type': 'race' # 筛选比赛类型为“race”
}
# 设定您希望筛选的赛道名称
desired_track = "Swindon" # 例如,筛选“Swindon”赛道的结果3. 动态构建日期范围并发送请求
为了避免手动输入每个日期的URL,我们可以利用Python的日期时间模块来生成一个日期范围。本示例将演示如何遍历指定的月份和日期,动态更新API请求中的 date 参数。
独响
一个轻笔记+角色扮演的app
249
查看详情
# 设定要爬取的年份
target_year = 2025
# 设定要爬取的月份范围 (例如,从10月到12月)
# range(start_month, end_month + 1)
for month in range(10, 12 + 1):
# 根据月份计算当月的天数
# 简化处理:2月28天,4/6/9/11月30天,其他31天
# 更精确的计算应考虑闰年,但此处为示例目的简化
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'{target_year}-{month:02d}-{day:02d}'
print(f"正在请求日期: {params['date']}")
try:
# 使用 requests.get 发送HTTP 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', [])
# 如果需要,可以分页获取所有数据,但本示例假设itemsPerPage足够大,一次性获取
# 如果itemsPerPage不足以获取一天所有数据,需要根据page_context_dict中的总页数进行循环
# 筛选特定赛道的数据
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 错误 ({params['date']}): {errh}")
except requests.exceptions.ConnectionError as errc:
print(f"连接错误 ({params['date']}): {errc}")
except requests.exceptions.Timeou
t 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}")
except Exception as e:
print(f"发生未知错误 ({params['date']}): {e}")
4. 错误处理与数据存储
在网络请求中,错误处理至关重要。上述代码包含了针对HTTP错误、连接错误、超时以及JSON解析错误的 try-except 块,确保脚本的健壮性。
所有筛选后的数据将累积到 json_list 列表中。在所有日期范围的请求完成后,我们将这些数据一次性写入一个JSON文件。
# 循环结束后,将所有收集到的数据写入一个JSON文件
output_filename = f'{desired_track}_results.json'
with open(output_filename, 'w', encoding='utf-8') as f:
# 使用json.dump将Python列表写入JSON文件
# ensure_ascii=False 确保中文字符正常显示
# indent=4 使输出的JSON文件格式化,更易读
json.dump(json_list, f, ensure_ascii=False, indent=4)
print(f"数据抓取完成,共收集到 {len(json_list)} 条记录,已保存到 {output_filename}")5. 完整代码示例
将上述所有代码片段整合,形成一个完整的Python脚本:
import requests
import json
from datetime import datetime, timedelta
# 用于存储所有抓取到的数据的列表
json_list = []
# GBGB API的基础URL
base_url = "https://api.gbgb.org.uk/api/results"
# API请求的默认参数
params = {
'page': '1', # 默认从第一页开始
'itemsPerPage': '200', # 每页返回200条数据,可根据需求调整
'race_type': 'race' # 筛选比赛类型为“race”
}
# 设定您希望筛选的赛道名称
desired_track = "Swindon" # 例如,筛选“Swindon”赛道的结果
# 设定要爬取的年份
target_year = 2025
# 设定要爬取的月份范围 (例如,从10月到12月)
# range(start_month, end_month + 1)
for month in range(10, 12 + 1):
# 根据月份计算当月的天数
# 简化处理:2月28天,4/6/9/11月30天,其他31天
# 更精确的计算应考虑闰年,但此处为示例目的简化
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
params['date'] = f'{target_year}-{month:02d}-{day:02d}'
print(f"正在请求日期: {params['date']}")
try:
# 使用 requests.get 发送HTTP 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', [])
# 筛选特定赛道的数据
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 错误 ({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}")
except Exception as e:
print(f"发生未知错误 ({params['date']}): {e}")
# 循环结束后,将所有收集到的数据写入一个JSON文件
output_filename = f'{desired_track}_results.json'
with open(output_filename, 'w', encoding='utf-8') as f:
json.dump(json_list, f, ensure_ascii=False, indent=4)
print(f"数据抓取完成,共收集到 {len(json_list)} 条记录,已保存到 {output_filename}")6. 注意事项与总结
- 速率限制 (Rate Limiting):频繁的API请求可能会触发服务器的速率限制,导致请求被拒绝。如果遇到此类问题,可以考虑在每次请求之间添加 time.sleep() 来引入延迟。
- 动态年份与日期范围:本教程中的年份和月份范围是硬编码的。在实际应用中,您可能需要让这些参数更加灵活,例如通过用户输入或从配置文件读取。
- itemsPerPage 参数:itemsPerPage 参数决定了每次请求返回的条目数量。如果一天的数据量超过此值,您需要通过递增 page 参数来循环获取所有分页数据。API响应通常会包含总页数或总条目数的信息,可以据此进行分页逻辑的实现。
- API文档:虽然本教程基于现有信息进行爬取,但查阅官方API文档(如果可用)是最佳实践,可以了解更多参数、限制和数据结构。
- 数据结构:GBGB API返回的JSON数据结构通常包含比赛的详细信息,如 trackName、raceId、meetingId、参赛狗信息、结果等。您可以根据需求进一步解析和提取这些数据。
通过本教程,您应该能够高效地从GBGB网站的API接口爬取指定日期范围和赛道的赛狗比赛结果,并将数据保存为结构化的JSON格式,极大地提高了数据获取的自动化程度。
以上就是使用Python爬取GBGB赛狗结果:按日期范围和赛道筛选数据的详细内容,更多请关注其它相关文章!
# 淮南抖音关键词搜索排名seo
# 遍历
# 每页
# 赛狗
# 按日
# 转换为
# 第一页
# 足下软件学院seo课本
# seo平台认准15火星软件
# 分页
# 铁岭个人seo优化平台
# 任丘建设项目公示网站
# 网站建设上
# 招远外贸网站推广
# 建设宠物网站分析报告
# 网站优化前要做什么事
# 大乐透营销推广策略分析
# python
# 当月
# 数据结构
# eli
# red
# b网
# yy
# python脚本
# 状态码
# 配置文件
# win
# ai
# app
# 编码
# json
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
React列表渲染与独立状态管理:避免全局状态影响局部更新
一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证
J*aScript中如何高效提取对象指定属性
苹果手机如何防止被恶意App追踪
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
解决Bootstrap卡片顶部边距导致背景图下移的问题
C++如何生成随机数_C++ random库使用方法与范围设置
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
FullCalendar 自定义按钮样式定制指南
CSS布局中意外空白:解决padding-top导致的顶部间距问题
如何将HTML表格多行数据保存到Google Sheet
《主播少女的秘密账号迷宫》首支宣传片
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
12306几点到几点不能订票? | 官方最新系统维护时间全解析
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
126邮箱网页版官方入口 126邮箱账号在线登录平台
蛙漫移动版在线看 蛙漫手机浏览器直达入口
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
解决Python单元测试中Mock异常方法调用计数为零的问题
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
fishbowl官网免费版 fishbowl养鱼网站入口
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
拼多多赚钱渠道_拼多多收益来源
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
蛙漫2台版漫画地址 Manwa2正版网页版链接
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
邮政快递包裹最新位置 邮政快递实时追踪入口
将HTML Canvas内容转换为可上传的图像文件(File对象)
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
深入理解Promise链:如何在catch后中断then的执行
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
Composer如何在生产环境安全地执行composer update
AO3镜像入口大全 AO3网页版内容访问全集
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
C#中解析不规范的HTML为XML 常见的坑与解决办法
将HTML动态表格多行数据保存到Google Sheet的教程
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
AO3官方在线访问地址 Archive of Our Own最新镜像合集
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
淘宝支付提示失败如何解决 淘宝支付流程优化方法
《燕云十六声》两周内达九百万玩家!位居畅销榜第五


2025-12-03
浏览次数:次
返回列表
t 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}")
except Exception as e:
print(f"发生未知错误 ({params['date']}): {e}")