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

抓取Anbima网站债券日程表格时Selenium仅返回skeleton-container的问题解决咨询

抓取Anbima网站债券日程表格时Selenium仅返回skeleton-container的问题解决咨询

嗨,Leonardo!你遇到的这个问题其实很常见——页面上的skeleton-container是网站在异步加载真实数据时显示的占位符,你的Selenium代码跑得太快了,还没等浏览器把真实数据渲染出来就抓取了HTML,所以拿到的是加载前的占位内容。

下面给你两个实用的解决方案:

方案一:用Selenium显式等待,等真实数据加载完成

既然数据是动态渲染的,我们可以让Selenium等待直到真实的表格内容出现,再去抓取HTML。比如可以等待表格里第一个有真实内容的元素(比如你示例里的agenda-data-evento-0这个ID元素)加载完成:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

deb = 'AALM11'
link_agenda = 'https://data.anbima.com.br/debentures/' + deb + '/agenda?page=1&size=100'
driver.get(link_agenda)

# 最多等待10秒,直到第一个事件日期元素出现
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, 'agenda-data-evento-0')))

# 现在再获取表格的HTML,就能拿到真实数据了
html_source = driver.find_element(By.TAG_NAME, 'table').get_attribute('outerHTML')

这样就能确保浏览器已经把骨架屏替换成真实的表格数据,再进行抓取。如果agenda-data-evento-0这个ID不稳定,你也可以换个等待条件,比如等待tbody里的td元素不再包含skeleton-container类。

方案二:直接调用网站的API接口获取数据(更高效)

其实这类动态加载的数据,通常是通过AJAX请求从后端API获取的。你可以跳过浏览器渲染,直接请求API拿到结构化的JSON数据,这样速度更快,也不需要处理HTML解析的麻烦:

  1. 打开浏览器DevTools的「Network」面板,刷新目标页面;
  2. 在请求列表里筛选「XHR」或「Fetch」类型,找和日程数据相关的请求(比如搜索关键词agenda);
  3. 复制该请求的URL、请求头(比如User-Agent、Referer这些可能需要的字段);
  4. 用requests库发送请求,直接解析JSON数据。

举个例子(假设找到的API接口如下):

import requests

deb = 'AALM11'
api_url = f'https://data.anbima.com.br/api/debentures/{deb}/agenda?page=1&size=100'
# 复制你在DevTools里看到的请求头,确保请求被服务器接受
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': f'https://data.anbima.com.br/debentures/{deb}/agenda'
}

response = requests.get(api_url, headers=headers)
response.raise_for_status()  # 检查请求是否成功
data = response.json()

# 解析数据,比如遍历所有日程项
for agenda_item in data['content']:
    print(f"Data do evento: {agenda_item['dataEvento']}")
    print(f"Data de liquidação: {agenda_item['dataLiquidacao']}")
    print(f"Evento: {agenda_item['evento']}")
    # 其他字段可以根据返回的JSON结构自行提取

这种方法不仅效率更高,而且数据是结构化的,不需要再去解析HTML表格,后期处理也更方便。

如果遇到API需要认证或者有反爬限制,你可能需要进一步模拟浏览器的请求行为,但大部分公开数据的API只要带上正确的请求头就能正常访问。

备注:内容来源于stack exchange,提问作者Leonardo Ramunno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:28:02