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

霞舞
发布: 2025-12-03 12:26:02
原创
375人浏览过

使用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 库。如果尚未安装,可以通过以下命令进行安装:

立即学习Python免费学习笔记(深入)”;

pip install requests
登录后复制

接下来,我们需要导入必要的库并设置API请求的基础URL和默认参数:

Fotor AI Face Generator
Fotor AI Face Generator

Fotor 平台的在线 AI 头像生成器

Fotor AI Face Generator 50
查看详情 Fotor AI Face Generator
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 参数。

# 设定要爬取的年份
target_year = 2023

# 设定要爬取的月份范围 (例如,从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.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}")
登录后复制

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 = 2023

# 设定要爬取的月份范围 (例如,从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赛狗结果:按日期范围和赛道筛选数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号