使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程


使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程

本教程详细介绍了如何利用python的`requests`库与gbgb api交互,以自动化方式抓取指定日期范围和特定赛狗赛道的比赛结果。文章涵盖了api参数的理解、日期范围的程序化生成、http请求的发送、json数据的解析与筛选,以及最终数据的持久化存储,旨在提供一个结构清晰、可复用的数据抓取解决方案。

自动化抓取GBGB赛狗比赛结果

在进行数据分析或建立预测模型时,从特定网站获取大量结构化数据是一项常见需求。对于GBGB(Great British Greyhound Board)的赛狗比赛结果,手动通过网站界面或逐个URL抓取是极其耗时且效率低下的。本教程将展示如何利用Python及其强大的requests库,结合GBGB提供的API接口,实现对指定日期范围和特定赛道的比赛结果进行高效、自动化的抓取。

理解GBGB API接口

GBGB提供了一个API接口,允许开发者通过HTTP请求获取比赛结果数据。根据提供的信息,核心的API端点是: https://api.gbgb.org.uk/api/results

此端点支持以下关键查询参数:

  • page: 页码,用于分页。
  • itemsPerPage: 每页显示的条目数。例如,200表示每页获取200条记录。
  • date: 指定查询的日期,格式为YYYY-MM-DD。这是实现日期范围抓取的关键。
  • race_type: 比赛类型,例如race。

通过组合这些参数,我们可以构建出请求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对象来逐天递增,确保每个日期都能被处理。

发送API请求与错误处理

在日期循环内部,我们将使用requests.get()方法向API发送请求,并处理可能出现的各种网络或API错误。

Viggle AI Video Viggle AI Video

Powerful AI-powered animation tool and image-to-video AI generator.

Viggle AI Video 115 查看详情 Viggle AI Video
# ... (前面的代码保持不变)

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"
    # )

注意事项与最佳实践

  1. API速率限制 (Rate Limiting): 频繁或大量请求可能会触发API的速率限制,导致请求被拒绝。虽然GBGB API文档中未明确提及,但在实际操作中应注意。可以考虑在每次请求之间添加time.sleep()来引入延迟,例如time.sleep(0.5)。
  2. 分页处理: 当前代码中itemsPerPage设置为200。如果某天的比赛结果超过200条,并且API支持多页,您可能需要在一个日期内部再增加一个循环来处理page参数,直到没有更多数据返回。
  3. 数据结构变化: API返回的JSON数据结构可能会随时间变化。在编写代码时,应考虑到健壮性,例如使用.get()方法访问字典键,以避免因键不存在而引发错误。
  4. 错误处理: 完善的错误处理机制对于数据抓取至关重要。上述代码已经包含了对常见requests异常和json解析错误的捕获,这有助于诊断和解决问题。
  5. 目标赛道名称: desired_track_name必须与API返回数据中的trackName字段完全匹配,包括大小写。
  6. 文件保存格式: 示例代码将数据保存为JSON格式,这是一种易于机器读取和解析的格式。根据需求,您也可以将其转换为CSV、数据库记录等其他格式。
  7. 代码可复用性: 将抓取逻辑封装在函数中(如scrape_gbgb_results),可以提高代码的可读性和复用性。

总结

通过本教程,我们学习了如何利用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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.