学会“读网页”:生成式 AI 在足球赛事信息整理中的实战

爬虫代理
逐步教程(Step-by-Step) — 适合初学者与教学类文章

背景(为什么要这样做)

对于足球迷、资讯编辑与数据分析师来说,最快、最准确把握一场比赛的核心信息至关重要:比分、关键事件(进球、点球、红黄牌、换人、判罚争议等)、以及球员表现。传统基于规则的爬虫在面对不同媒体页面与频繁改版时常显笨拙:XPath/正则需要频繁维护,动态加载内容常常漏抓。

引入生成式 AI(Large Language Models, LLM)后,我们可以把抓到的比赛报道或直播实录交给模型,让它“读懂”文章并输出结构化结果(JSON),同时生成简明的自然语言摘要,极大提高抽取的鲁棒性与可读性。本教程以实战角度,演示如何抓取 ESPN、虎扑、腾讯体育 三类站点关于五大联赛(英超、西甲、德甲、意甲、法甲)的比赛报道,并用 AI 总结比分、关键事件与球员表现。

环境准备(快速清单)

  • Python 3.9+
  • 安装必要依赖:
pip install requests beautifulsoup4 playwright
playwright install

(若使用外部 LLM SDK,再安装对应库;若只做静态抓取可不安装 Playwright)

  • 代理(示例:爬虫代理)—— 生产环境请用你自己的凭证并通过环境变量或密钥管理存储:
    • 域名:proxy.16yun.cn(示例)
    • 端口:3100
    • 用户名:16YUN、密码:16IP(示例,请替换)
  • 目标站点示例:
    • ESPN 足球:https://www.espn.com/soccer/
    • 虎扑足球:https://soccer.hupu.com/
    • 腾讯体育足球频道:https://sports.qq.com/soccer/(站点结构会变,按实际页面定位)

高层流程(核心步骤)

  1. 采集(抓取):通过代理请求或用 Playwright 渲染页面,获得完整 HTML/文本。
  2. 清洗(预处理):去除脚本、广告、无关导航文本,合并段落,获得可读文本片段。
  3. 分块:将长文本按模型上下文限制切分(保留比赛关键段落完整性)。
  4. 调用 LLM 抽取:把文本与明确的 prompt 一起发给 LLM,要求返回结构化 JSON(例如:比赛基本信息、事件列表、球员表现)。
  5. 校验与落地:对 LLM 返回做 schema 校验(例如:比分格式、时间合法性),保存到数据库或 JSON 文件;对低置信结果标注回流以便人工复核并改进 prompt。
  6. 可视化/下游:生成比分时间线、关键事件标签云、球员评分面板等。

关键设计要点(实践建议)

  • 多来源聚合:同一场比赛建议抓取赛后报道、赛事直播页面与赛后评论三类页面,合并信息能提高完整性与准确度。
  • Prompt 设计:在 prompt 中提供明确返回 schema(要求只输出 JSON 且字段名固定),并给出示例。
  • 后验校验:用正则或简单规则验证日期/分钟格式、进球数是否一致,防止 hallucination。
  • 费用与性能策略:先用轻量模型做命中过滤(是否为目标联赛/是否为比赛报道),再将真正需要深度解析的文本送入大型模型,节省调用成本。
  • 合规性:遵循目标站点的 robots.txt 与版权/转载规则;对含个人信息的内容注意合规与隐私。

示例代码(精炼版,易读为主)

下面给出一个精简、可运行的示例骨架,演示从网页抓文本并调用伪 LLM 接口获得结构化输出。请把伪接口替换成你实际使用的 LLM SDK 或公司内部服务;把代理凭证替换为生产凭证。

# file: football_ai_pipeline.py
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json, time, os# ---设置代理(亿牛云示例 www.16yun.cn) ---
PROXY_HOST = os.getenv("PROXY_HOST", "proxy.16yun.cn")
PROXY_PORT = os.getenv("PROXY_PORT", "3100")
PROXY_USER = os.getenv("PROXY_USER", "16YUN")
PROXY_PASS = os.getenv("PROXY_PASS", "16IP")
proxy_url = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
proxies = {"http": proxy_url, "https": proxy_url}HEADERS = {"User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36")
}def fetch_html(url, use_proxy=True, timeout=15):kwargs = {"headers": HEADERS, "timeout": timeout}if use_proxy:kwargs["proxies"] = proxiesresp = requests.get(url, **kwargs)resp.raise_for_status()return resp.textdef extract_text(html):soup = BeautifulSoup(html, "lxml")for tag in soup(["script", "style", "noscript", "header", "footer", "aside"]):tag.decompose()texts = [s.strip() for s in soup.stripped_strings]return "\n".join(texts)def call_llm_for_match(text_snippet):"""将文本片段送给 LLM 并返回结构化字典。在此用示例返回占位数据;生产环境替换为真实 API 调用并处理返回结果。"""# 示例返回结构(实际按你的 schema 定制)return {"league": "英超","home_team": "曼联","away_team": "利物浦","score": "2-1","events": [{"minute": 14, "type": "goal", "team": "曼联", "player": "拉什福德"},{"minute": 46, "type": "goal", "team": "利物浦", "player": "萨拉赫"},{"minute": 78, "type": "goal", "team": "曼联", "player": "B费"}],"player_summary": "拉什福德状态出色,门将几次关键扑救,替补球员改变了战局。"}def process_match_url(url):html = fetch_html(url)text = extract_text(html)# 若文本过长,可切分并合并 LLM 输出snippet = text[:5000]  # 示例截断,按模型上下文调整result = call_llm_for_match(snippet)# 后验简单校验(示例)if "score" in result:pass  # 在此做正则或数值校验return resultif __name__ == "__main__":urls = ["https://www.espn.com/soccer/report?gameId=xxxx",  # 替换为实际赛报链接"https://soccer.hupu.com/games/xxxx","https://sports.qq.com/a/xxxx.htm"]results = []for u in urls:try:r = process_match_url(u)results.append(r)except Exception as e:print("抓取/解析失败:", u, e)time.sleep(1.5)with open("matches_aggregated.json", "w", encoding="utf-8") as f:json.dump(results, f, ensure_ascii=False, indent=2)

常见问题与排查建议

  • 页面是空白或只剩壳:多数是前端渲染,改用 Playwright/Selenium 或分析 XHR 请求直接调用后端接口。
  • 抓到的“报道”是简短新闻稿,细节不足:同时抓取直播实录(live blog)或赛后深度评述页,合并信息。
  • LLM 输出里出现“虚构”事件:增加 prompt 约束(要求基于给定文本输出),并对关键字段做规则校验;对低置信度结果人工复核。
  • 被目标站点限制访问:降低请求速率、使用合规的代理池、并遵守站点授权与版权政策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/98033.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/98033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BM3D 图像降噪快速算法的 MATLAB 实现

BM3D 图像降噪快速算法的 MATLAB 实现1. 快速 BM3D 算法流程(概述)步骤操作加速技巧① 分组块匹配 堆叠FFT 互相关② 协同滤波3D 变换 硬阈值FFT 沿第三维③ 聚合加权平均稀疏矩阵累加 2. 核心函数(单文件版) 保存为 bm3d_fast.…

Go的schedt调度(runtime/proc.go)

1. 创建go的入口函数// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服务器配置转发网络访问

配置文档:Ubuntu 服务器转发网络访问 一、网络拓扑以以下网络拓扑为示例Ubuntu 服务器(两个网卡) eth1 10.66.71.222 (接入内网)eno1 192.168.2.100 (直连相机) 相机ip 192.168.2.1 Windows 客…

为什么企业需要高防IP

1. 抵御日益猖獗的DDoS攻击 现代DDoS攻击规模已突破Tbps级别 传统防火墙无法应对大规模流量攻击 高防IP采用分布式清洗中心,可轻松抵御300Gbps以上的攻击流量 2. 保障业务连续性 网络中断1小时可能造成数百万损失 高防IP确保服务99.99%可用性 智能切换机制实…

CSS基础 - 选择器备忘录 --笔记5

目录基础选择器组合器伪类选择器属性选择器选择器可以选中页面上的特定元素并为其指定样式。 CSS有多种选择器。 基础选择器 标签选择器 – tagname:匹配目标元素的标签名。优先级是0,0,1。如:p、h1、div类选择器 – .class:匹配class属性中…

自动驾驶中的传感器技术46——Radar(7)

卫星雷达(又称为分布式雷达)主要讲当前雷达的雷达信号处理计算以及雷达目标相关的一些感知算法都迁移到中央域控进行,雷达端基本只负责数据采集,这样做的影响如下: 雷达端成本与功耗降低; 雷达端采样得到的…

【论文阅读】Diff-Privacy: Diffusion-based Face Privacy Protection

基于扩散模型的人脸隐私保护方法——DiffPrivacy,解决了两类人脸隐私任务:匿名化(anonymization)和视觉身份信息隐藏(visual identity information hiding)。1. 研究背景随着人工智能和大数据技术的普及&am…

React 原理篇 - 深入理解虚拟 DOM

一、什么是虚拟 DOM? 在前端开发中,“虚拟 DOM” 是一个高频出现的术语,尤其在 React 生态中被广泛讨论。但很多开发者对它的理解往往停留在 “JS 对象” 这个表层认知上。 实际上,虚拟 DOM 是一种编程概念—— 在这个概念里&…

对汇编的初理解

此处是一个简单的函数,里面将调用了一个函数add()函数这里是函数的原型这里是调用lcd函数产生的汇编语言,翻译过来就是r11,r0cnt(r4cnt,前文有提及),然后调用add函数,此处BL是指会回到指令的下一…

《Python 自动化实战:从零构建一个文件同步工具》

《Python 自动化实战:从零构建一个文件同步工具》 一、开篇引入:为什么我们需要文件同步? 你是否有过这样的困扰: 公司电脑和家里电脑上都有工作项目,每次更新都要手动复制? U 盘频繁传输文件,不仅麻烦还容易出错? 项目文件夹动辄几 G,每次同步都耗时长、效率低? 在…

工业相机与镜头的靶面尺寸详解:选型避坑指南

在机器视觉系统中,相机与镜头的靶面尺寸匹配是一个非常关键却又经常被忽略的细节。选错了,不但影响图像质量,还可能导致画面“黑角”、视野不符、镜头浪费等问题。 今天我们就用通俗易懂的方式,聊一聊相机与镜头靶面尺寸的那些事儿…

使用 Go 和 go-commons 实现内存指标采集并对接 Prometheus

文章目录一、准备工作二、编写内存采集代码三、运行 Exporter四、接入 Prometheus五、可扩展思路总结在运维和监控领域,资源指标采集 是必不可少的一环。CPU、内存、磁盘、网络这些系统资源,需要实时采集并上报到监控系统中。 本文以 内存指标采集 为例&…

webrtc弱网-IntervalBudget类源码分析与算法原理

一、核心功能 IntervalBudget 类用于基于时间窗口的带宽预算管理。它根据设定的目标比特率(kbps)和一个固定时间窗口(500ms),计算在该时间窗口内可用的字节数(即“预算”),并支持预…

深度学习基本模块:RNN 循环神经网络

循环神经网络(RNN)是一种专门用于处理序列数据的神经网络架构。与处理空间数据的卷积神经网络(Conv2D)不同,RNN通过引入循环连接使网络具有"记忆"能力,能够利用之前的信息来影响当前的输出&#…

React18学习笔记(二) React的状态管理工具--Redux,案例--移动端外卖平台

文章目录一.Redux的基础用法1.示例:普通网页中的Redux计步器2.Redux管理数据的流程3.配套工具和环境准备3.1.配套工具3.2.环境准备4.示例:React项目中的Redux计步器思路步骤step1:创建子模块step2:导入子模块step3:注入store实例step4:React组件内使用store中的数据step5:在组件…

34.Socket编程(UDP)(上)

点分十进制字符串IP 转 32位网络序列IP 分析:1)IP转成4字节 2)4字节转成网络序列 思路: "192.168.1.1" 进行字符串划分,以 "." 为分割符,分割出"192",&qu…

Redis的持久化工具包—RDB AOF

文章目录 前言 一、RDB 持久化(快照持久化) 1. 定义 2. RDB 触发机制 (1)手动触发 (2)自动触发 3. RDB 持久化流程 4. RDB 核心配置 5. RDB 优缺点 二、AOF 持久化(日志持久化) 1. 定…

【Web安全】XXL-JOB框架SRC高频漏洞分析总结

文章目录前言一、核心漏洞分类与技术细节二、漏洞关联利用与攻击路径三、版本演进与修复策略四、安全运维建议五、典型漏洞复现环境搭建六、总结前言 XXL-JOB是国内主流的开源分布式任务调度框架,由徐雪里开发维护,以轻量易用、高可用、适配分布式场景等…

Capacitor 打包后接口访问不到的排查经历

我最近在用 Quasar Capacitor 6 做一个 Android App,前端用的是 Vue3 Quasar,打包交给 Capacitor 去跑在手机的 WebView 里,后端是 FastAPI 提供接口。开发模式下一切顺利,浏览器里访问接口没有任何问题,我甚至觉得打…

【正点原子】Linux应用编程入门~概念及环境介绍

应用编程概念 应用编程(也可称为系统编程)与驱动编程、裸机编程有何不同?系统调用;何为库函数;应用程序的 main()函数;应用程序开发环境的介绍;系统调用 定义系统调用(system call&a…