如何通过直接请求API数据替代动态渲染页面实现高效IPL赛事数据抓取

老辰小哥_1712

老辰小哥_1712

2026-09-03

826人浏览

原创

如何通过直接请求API数据替代动态渲染页面实现高效IPL赛事数据抓取

本文详解为何用beautifulsoup按class查找ipl赛程元素返回空列表,并提供无需selenium、纯requests+正则解析js数据文件的高效替代方案。

本文详解为何用beautifulsoup按class查找ipl赛程元素返回空列表,并提供无需selenium、纯requests+正则解析js数据文件的高效替代方案。

在使用 requests + BeautifulSoup 进行网页抓取时,若对目标元素(如 <div class="vn-shedule-desk col-100 floatLft">)调用 <code>find_all() 却始终返回空列表([]),根本原因并非选择器错误,而是该内容由前端JavaScript动态加载,并未包含在服务器返回的原始HTML中。IPL官网(iplt20.com)正是典型示例:其比赛数据通过异步加载JS文件(如 competition.js 和 *-matchschedule.js)注入DOM,requests.get() 仅获取静态骨架页,自然无法匹配动态生成的节点。

✅ 正确做法是绕过渲染层,直击数据源头——IPL官方前端实际从CDN加载结构化JSON数据,只需逆向分析网络请求即可获取完整、干净、可编程解析的原始数据。

以下为完整、可运行的解决方案:

import requests
import re
import json
import pandas as pd

# Step 1: 获取所有赛季(CompetitionID)列表
url_competitions = "https://scores.iplt20.com/ipl/mc/competition.js"
response = requests.get(url_competitions)
if response.status_code != 200:
    raise Exception(f"Failed to fetch competitions: {response.status_code}")

# 提取 competition.js 中的 JSON 数据(包裹在 oncomptetion(...) 调用内)
match = re.search(r'oncomptetion\((\{.*?\})\);?', response.text, re.DOTALL | re.IGNORECASE)
if not match:
    raise ValueError("Cannot extract competition data from JS file")

competition_data = json.loads(match.group(1))
seasons = [item["CompetitionID"] for item in competition_data.get("competition", [])]

# Step 2: 遍历每个赛季,拉取对应比赛日程
all_matches = []
base_match_url = "https://ipl-stats-sports-mechanic.s3.ap-south-1.amazonaws.com/ipl/feeds/{}-matchschedule.js"

for season_id in seasons:
    try:
        resp = requests.get(base_match_url.format(season_id))
        resp.raise_for_status()

        # 解析 MatchSchedule(...) 包裹的 JSON
        match_js = re.search(r'MatchSchedule\((\{.*?\})\);?', resp.text, re.DOTALL | re.IGNORECASE)
        if not match_js:
            print(f"Warning: No MatchSchedule data found for season {season_id}")
            continue

        schedule_data = json.loads(match_js.group(1))
        matches = schedule_data.get("Matchsummary", [])
        all_matches.extend(matches)

    except Exception as e:
        print(f"Error processing season {season_id}: {e}")

# Step 3: 构建结构化DataFrame(含2008–2024全赛季数据)
df = pd.DataFrame(all_matches)
print(f"✅ Total matches scraped: {len(df)}")
print(df[["SeasonYear", "MatchDesc", "Team1Name", "Team2Name", "MatchResult", "MatchStatus"]].head())

? 关键要点说明:

  • ✨ 零浏览器依赖:全程使用 requests,轻量、快速、稳定,规避Selenium启动慢、易被拦截、维护成本高等问题;
  • ? 精准定位JS数据接口:competition.js 提供赛季元数据(含 CompetitionID),{id}-matchschedule.js 提供该赛季全部比赛摘要(Matchsummary 数组),二者构成完整数据链;
  • ⚠️ 注意JS格式陷阱:目标JSON常被函数调用包裹(如 oncomptetion({...}) 或 MatchSchedule({...})),需用正则提取内部JSON字符串再 json.loads();
  • ? 字段丰富性:Matchsummary 中包含 MatchID, SeasonYear, MatchDate, VenueName, Team1Name, Team2Name, MatchResult, MatchStatus, TossWinner, WinningTeam 等数十个结构化字段,远超HTML页面展示内容;
  • ? 跨赛季扩展性:代码自动遍历所有赛季,无需手动修改URL,天然支持未来新增赛季。

? 进阶建议:

  • 添加 time.sleep(0.5) 防止单IP高频请求;
  • 使用 session 复用连接提升效率;
  • 对 MatchResult 字段做标准化清洗(如统一“Won by X runs/wickets”格式);
  • 结合 schedule_data.get("MatchDetails", []) 可进一步获取每场详细球局数据(若需深度分析)。

该方法不仅解决IPL抓取问题,更是现代动态网站数据采集的通用范式:优先分析XHR/JS资源,而非渲染后DOM——高效、可靠、可持续。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
免费爬虫工具有哪些
免费爬虫工具有哪些

免费爬虫工具有Scrapy、Beautiful Soup、ParseHub、Octoparse、Webocton Scriptly、RoboBrowser和Goutte。更多关于免费爬虫工具的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.10

4473

9

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

653

12

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

160

15

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习