使用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


相关推荐: 京东物流快递破损了怎么办_京东快递破损理赔流程  macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  批改网官网首页登录 批改网学生用户登录入口  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  喜茶GO更换登录账号方法  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  《单词速记宝》设置学习计划方法  纯CSS实现自适应宽度与响应式布局的水平按钮组  我居然低估了 DeepSeek,这次更新它做到了这些!  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  mysql如何限制远程访问_mysql远程访问限制方法  B站怎么快速升级 B站用户等级提升攻略【详解】  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  Word 2003字体大小设置方法  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  圆通快递官方入口不需要登录 在线查询入口快速查询  芒果TV官网登录入口 芒果TV官方网站登录入口  微博网页版访问入口 微博网页版网页端使用指南  126手机126邮箱登录_126邮箱手机登录入口官网  传统曲艺莲花落的表演形式是  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  苹果手机聊天记录删除了如何恢复  Retrofit根路径POST请求:@POST("/") 的应用与解析  《撕歌》会员开通方法  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  Win10怎么设置快速启动 Win10开启快速启动设置方法  263企业邮箱如何设置邮件转发功能  Golang如何测试结构体方法_Golang reflect方法测试与调用技巧  暴风影音官网正式版_暴风影音手机版官网下载安卓  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  Win11怎么开启HDR_Windows 11显示器画质增强设置  胃动力不足?试试这5个调理方法  PHP中动态类名访问的类实例类型提示与静态分析实践  如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  J*aScript实现下拉菜单驱动的动态表格数据展示  windows10怎么设置电源按钮_windows10按下电源键功能修改  教育查询官方网站入口 教育个人档案查询免费官网  Python高效统计字典嵌套列表值在目标列表中的出现次数  优化Google Charts Gauge:在数据库无数据时显示默认值  QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  excel怎么计算平均值 excel平均函数*ERAGE使用教学 

 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.