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


相关推荐: 抖音猜你想搜能说明对方搜过吗  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】  qq邮箱格式填写示例 qq邮箱标准填写规范  php如何实现多域名共享session_php存储session到redis与跨域读取配置  j*a中赋值运算符是什么?  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  Golang如何初始化module项目_Golang module init使用说明  如何在CSS中设置背景图像:一个全面指南  VB表达式书写规则解析  PHP多语言网站的实现:会话管理与翻译函数优化教程  163邮箱网页版官方登录入口 163邮箱网页版访问页面  苹果11如何更换iCloud账号_苹果11账号切换的具体步骤  一点万象签到领积分指南  植物大战僵尸95版游戏版下载_植物大战僵尸95版游戏版安装指南  如何使用 Optional 类型并满足 Pylint 的类型检查  易车网官网直达入口 易车网在线登录入口  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  J*aScript实现网页表单实时输入字段比较与验证教程  J*aScript:从子元素中批量移除特定CSS类  热血江湖归来医师加点攻略  优化 WooCommerce 产品价格显示与自定义短代码集成  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  sublime text 4如何安装_最新版sublime下载与汉化教程  如何查询个人病历记录  哈尔滨城市通昵称修改方法  《淘票票》添加到苹果钱包教程  在Django中动态检查模型关联:一种灵活的解决方案  邮政快递寄件查询入口 邮政快递收件查询入口  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  解决CSS布局中意外顶部空白问题的教程  包子漫画官网链接官方地址 包子漫画在线观看官网首页入口  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  《雷电模拟器》自动点击设置方法  使用VS Code作为你的个人知识管理系统  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计  鸣潮历史学家灯塔位置一览  红手指专业版app注册教程  163邮箱在线登录 163邮箱网页版在线入口  口腔诊所管理软件推荐  申通快递查询 申通物流快递单实时查询入口  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  Windows 11怎么删除恢复分区_Windows 11使用Diskpart命令强行删除分区  键盘测试软件哪个好_键盘故障检测工具推荐  消除网页顶部意外空白线:CSS布局常见问题与解决方案 

 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.