如何自动抓取 College Tennis Ranks 网站的 CSV 数据

星宇姑娘_5275

星宇姑娘_5275

2026-09-30

1019人浏览

原创

如何自动抓取 College Tennis Ranks 网站的 CSV 数据

本文介绍如何绕过前端按钮限制,通过解析页面内嵌的 JavaScript 数据,用 Python 自动提取并生成 College Tennis Ranks 网站(如 /schedules/d1w)中动态生成的 schedules.csv 文件。

本文介绍如何绕过前端按钮限制,通过解析页面内嵌的 javascript 数据,用 python 自动提取并生成 college tennis ranks 网站(如 `/schedules/d1w`)中动态生成的 `schedules.csv` 文件。

College Tennis Ranks(collegetennisranks.com)的赛程页(例如 /schedules/d1w)虽提供“CSV”下载按钮,但该功能由 DataTables 的 HTML5 导出插件(buttons.html5.min.js)在浏览器端完成:数据已完整加载至页面内存,点击按钮仅触发前端 JS 将内置数组转为 CSV 并触发下载,不发起任何网络请求。因此,在 Network 面板中无法捕获 CSV 接口,也无法通过简单 GET 请求直接获取。

真正的数据藏于页面源码中——打开网页“查看源代码”(Ctrl+U),可发现 标签下第一个 <script></script> 标签内,以 JavaScript 数组字面量形式硬编码了全部赛程数据,形如:

<script>
  var tableData = [
    ["2024-01-12", "Stanford", "Texas A&M", "W", "6-1", "..."],
    ["2024-01-13", "Duke", "Florida", "L", "3-4", "..."],
    // ... 数百行数据
  ];
</script>

我们可通过 requests 获取 HTML,再用 BeautifulSoup 定位该 <script></script> 标签,结合正则或 ast.literal_eval 安全解析出 Python 列表,最后用 csv 模块写入文件。

✅ 推荐实现(含错误处理与通用性):

阿拉丁·前端工程工坊|脚手架·组件·规范落地·构建优化·性能与可访问性一体
阿拉丁·前端工程工坊|脚手架·组件·规范落地·构建优化·性能与可访问性一体

阿拉丁·前端工程工坊把「前端只会写页面、规范停在文档里、脚手架手敲、构建靠抄、性能靠猜、可访问性靠忘」从「手动搭项目、抄配置、肉眼查规范」升级成一条本地工具链——多框架脚手架生成(React/Vue3/Svelte + Vite)、可复用组件生成(Props 类型+样式+示例)、规范落地检查(lint-lite:命名/未用变量/console残留/TS any/目录结构)、构建配置生成与产物体积预算、性能审计(依赖体积/重复/懒加载/Lighthouse 清单)、可访问性(a11y)校验(alt/aria

下载
import re
import requests
import csv
from bs4 import BeautifulSoup
import ast

def fetch_schedules_csv(url: str, output_path: str = "schedules.csv"):
    try:
        # 1. 获取页面 HTML
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
        resp = requests.get(url, headers=headers, timeout=10)
        resp.raise_for_status()

        # 2. 解析 HTML,定位含 tableData 的 script 标签
        soup = BeautifulSoup(resp.text, "html.parser")
        script_tag = soup.find("script", string=re.compile(r"var\s+tableData\s*="))
        if not script_tag:
            raise ValueError("未找到包含 tableData 的 script 标签")

        # 3. 提取并解析 JavaScript 数组(安全方式)
        js_code = script_tag.string
        match = re.search(r"var\s+tableData\s*=\s*(\[.*?\]);", js_code, re.DOTALL)
        if not match:
            raise ValueError("无法从 script 中提取 tableData 数组")

        # 使用 ast.literal_eval 替代 eval,确保安全执行
        data_list = ast.literal_eval(match.group(1))

        # 4. 写入 CSV(假设首行为表头,若无则跳过)
        with open(output_path, "w", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            # 若原始数据不含表头,可手动添加;此处按原样导出
            writer.writerows(data_list)

        print(f"✅ 成功导出 {len(data_list)} 行数据至 {output_path}")

    except Exception as e:
        print(f"❌ 抓取失败:{e}")

# 使用示例
fetch_schedules_csv("https://www.php.cn/link/0daf2855c770bf6e9d55b2153ed179d8/schedules/d1w")

⚠️ 注意事项:

  • 反爬策略:务必设置 User-Agent,否则可能被返回 403;
  • 数据结构变化:若网站重构(如改用 const tableData = [...] 或变量名变更),需同步调整正则匹配逻辑;
  • 编码兼容性:部分学校名含 Unicode 字符(如 é, ñ),务必使用 encoding="utf-8" 打开 CSV;
  • 动态渲染风险:当前方案依赖服务端渲染(SSR)——若未来改为纯客户端渲染(CSR + API),则需切换为 Selenium 或 Playwright 渲染后提取。

总结:当“下载按钮”不发请求时,数据大概率已在 HTML 中。与其逆向 JS,不如直取源头——这是高效、稳定且无需浏览器自动化的核心思路。

相关文章

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

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

下载

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

相关专题

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

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

2023.11.10

5893

9

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

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

2023.11.13

693

12

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

60

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

140

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

120

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

120

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

100

12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习