You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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接口

  1. 打开浏览器开发者工具(F12),切换到「网络」标签页,刷新目标页面;
  2. 筛选「XHR/Fetch」类型的请求,找到返回JSON格式数据的接口(这类接口通常包含stats关键词);
  3. 复制接口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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:15:24