Python webscraping爬取NBA赛事数据返回空字符串如何解决?
Python网页爬取入门指南
- 先掌握Python基础语法:重点熟悉变量、循环、函数、列表、字典的用法,不需要先学复杂的进阶语法,满足基础调用需求即可
- 了解网页基础原理:搞懂HTTP请求的基本逻辑、HTML标签结构、CSS选择器、静态页面和动态渲染页面的差异,这部分是后续定位爬取问题的核心基础
- 按顺序学习常用爬取库:先从静态页面爬取组合
requests+BeautifulSoup入门,熟练后再学习动态页面爬取工具selenium、Playwright,有更高性能需求时再接触异步爬取、分布式爬取相关内容 - 从简单项目逐步练手:初期避开反爬规则严格的大站,先从静态资讯站、公共数据站这类简单目标入手练手,逐步提升项目复杂度。
当前NBA官网爬取返回空的问题解决
问题原因
NBA官网的赛事数据属于动态加载内容,初始HTML页面仅包含页面骨架,你要的赛事数据是页面加载完成后通过JavaScript异步请求渲染生成的。你直接用urllib请求拿到的是还没渲染数据的初始源码,自然找不到对应class的元素,所以返回空列表。
两种解决方案
方案1:抓接口直接拿结构化数据(更推荐)
打开浏览器开发者工具,切换到「网络」面板,刷新页面后筛选「Fetch/XHR」类型的请求,找到返回赛事数据的后端接口,直接请求该接口即可拿到JSON格式的结构化赛事数据,不需要解析HTML,效率更高,数据处理成本更低。
方案2:使用动态渲染工具模拟浏览器加载
如果不想抓接口,可以使用selenium、Playwright这类模拟浏览器的工具,等待页面完全渲染完成后再提取元素,即可正常获取到目标内容。
参考代码如下(selenium版本):
首先安装依赖:pip install selenium webdriver-manager
代码示例:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time # 自动配置浏览器驱动启动Chrome driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.nba.com/games") # 等待页面渲染完成,可替换为显式等待提升效率 time.sleep(3) # 获取渲染完成的完整页面源码 soup = BeautifulSoup(driver.page_source, "lxml") games = soup.find_all("li", class_= "w-full flex flex-col flex-1 md:w-7/12 lg:w-5/12") print(games) # 关闭浏览器释放资源 driver.quit()
内容的提问来源于stack exchange,提问作者IceWafflez
相关产品推荐
相关产品推荐

