使用requests爬取NBA官网时HTML内容缺失,是否被反爬及如何绕过?
问题描述
我在网页检查工具中可见的HTML内容,使用requests库请求后无法获取。检查时发现存在class为“LoadingOverlay_loader__iZ0Nm”的加载覆盖层元素。请问该网站是否在刻意阻止网页爬取,有没有绕过方法?我尝试用以下代码保存完整文件,但所需的关键部分缺失:
page = requests.get('https://www.nba.com/stats/teams/boxscores?Season=2019-20') with open('nba_scrape_test.html','wb+') as f: f.write(page.content)
解决方案
网站是否刻意反爬?
是,但并非单纯封禁爬虫——NBA官网的stats板块采用前端渲染(基于React框架),初始requests请求返回的只是页面骨架和加载层,核心数据是页面加载完成后通过AJAX异步请求拉取的,这是现代动态网站的常规设计,本质是为了优化前端体验,同时也起到了一定的反爬作用。
可行的绕过方法
方法1:直接调用官方API接口
- 打开浏览器开发者工具(F12),切换到「网络」标签页,刷新目标页面;
- 筛选「XHR/Fetch」类型的请求,找到返回JSON格式数据的接口(这类接口通常包含
stats关键词); - 复制接口URL和请求参数,带上必要的请求头(User-Agent、Referer)用requests请求即可。
示例代码:
import requests # 模拟浏览器请求头,避免被拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://www.nba.com/stats/teams/boxscores?Season=2019-20' } # 替换为实际找到的API接口及参数 api_url = 'https://stats.nba.com/stats/leaguegamelog' params = { 'LeagueID': '00', 'Season': '2019-20', 'SeasonType': 'Regular Season', 'PlayerOrTeam': 'T' } response = requests.get(api_url, headers=headers, params=params) if response.status_code == 200: data = response.json() # 提取核心数据,rowSet里就是球队比赛记录 print(data['resultSets'][0]['rowSet'])
方法2:用无头浏览器渲染完整页面
如果不想找API,可使用Selenium、Playwright这类工具模拟真实浏览器加载页面,等待加载层消失后再获取完整HTML:
示例代码(Selenium):
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器驱动(需提前下载对应浏览器的驱动文件) driver = webdriver.Chrome() driver.get('https://www.nba.com/stats/teams/boxscores?Season=2019-20') # 等待加载层消失,最长等待10秒 WebDriverWait(driver, 10).until( EC.invisibility_of_element_located((By.CLASS_NAME, 'LoadingOverlay_loader__iZ0Nm')) ) # 获取渲染后的完整页面源码 full_html = driver.page_source with open('nba_full_page.html', 'w', encoding='utf-8') as f: f.write(full_html) driver.quit()
注意事项
- 请求API时必须携带正确的请求头,否则会被服务器拦截;
- 控制请求频率,避免短时间内大量请求导致IP被封禁;
- 部分API接口可能需要额外的验证参数(如
x-nba-stats-token),需从浏览器请求头中复制。
内容的提问来源于stack exchange,提问作者ChipperBaker
相关产品推荐
相关产品推荐

