使用BeautifulSoup爬取NBA官网时无法获取指定HTML类内容
解决NBA官网动态内容爬取为空的问题
问题原因
NBA官网的赛程数据是通过JavaScript动态渲染的,requests库只能获取页面的静态HTML源码,此时目标元素还未被渲染出来,所以用BeautifulSoup无法定位到ScheduleDay_sdTop__TqiPn类对应的元素,返回空数组。
解决方案1:用Selenium加载动态页面
Selenium可以模拟浏览器完整加载页面,等待动态内容渲染完成后再提取数据,示例代码如下:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化Chrome浏览器驱动(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get("https://www.nba.com/schedule?cal=all®ion=1") # 等待目标元素加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "ScheduleDay_sdTop__TqiPn")) ) # 获取渲染后的完整页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") content = soup.findAll('div', class_='ScheduleDay_sdTop__TqiPn') for date_item in content: print(date_item.get_text(strip=True)) # 关闭浏览器 driver.quit()
解决方案2:直接调用NBA官方API接口
动态网站通常会通过API接口加载数据,你可以通过浏览器开发者工具的「网络」面板,找到返回赛程数据的XHR/Fetch请求,直接请求接口获取结构化数据,这种方式比模拟浏览器更高效。示例代码(接口可能随网站更新变化,需自行抓包验证):
import requests # 示例赛程数据API接口(需根据实际抓包结果更新) api_url = "https://data.nba.com/data/10s/v2015/json/mobile_teams/nba/2024/league/00_full_schedule.json" response = requests.get(api_url) schedule_data = response.json() # 提取日期信息 for segment in schedule_data['lscd']: print(segment['mscd']['gdtutc'])
注意事项
- 使用Selenium时,需确保浏览器驱动版本与本地浏览器版本匹配,可配置环境变量或直接指定驱动文件路径。
- API接口可能随网站迭代变更,需定期通过浏览器抓包确认接口的有效性和参数格式。
内容的提问来源于stack exchange,提问作者wils0n112
相关产品推荐
相关产品推荐

