0

0

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

霞舞

霞舞

发布时间:2025-12-03 12:26:02

|

433人浏览过

|

来源于php中文网

原创

使用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和默认参数:

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载
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开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

758

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

761

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1265

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

548

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 3.5万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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