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

如何用Selenium+Beautiful Soup抓取隐藏动态数据表格?

解决无需点击按钮获取隐藏定价表格数据的问题

嘿,这个场景我太熟悉了!很多网站会把部分数据藏起来,要用户点一下才加载/显示,其实我们有几种办法绕开点击操作直接拿到数据,下面给你拆解一下:

方法1:直接抓取背后的API请求

大部分时候,点击「View All Prices」按钮本质上是触发了一个AJAX请求,从服务器拉取完整的定价数据。这时候我们完全可以跳过页面交互,直接调用这个API:

  1. 打开浏览器开发者工具(按F12),切换到「Network」标签页;
  2. 点击页面上的「View All Prices」按钮,观察Network里新增的请求(通常是XHR或Fetch类型);
  3. 复制这个请求的URL、请求方法(GET/POST)、请求头(比如User-Agent、Referer,有些网站还需要Authorization token);
  4. 用requests库直接发送请求,拿到返回的JSON数据,这样就能直接提取定价信息,比解析HTML高效得多。

示例代码大概是这样:

import requests

headers = {
    'User-Agent': '你的浏览器User-Agent',
    # 其他必要的请求头,比如Cookie、Authorization等
}
response = requests.get('你复制的API地址', headers=headers)
price_data = response.json()
# 从price_data里提取你需要的表格数据

方法2:用Selenium执行JS触发数据加载/显示

如果数据已经在DOM里只是被CSS隐藏,或者需要执行某个JS函数来加载,我们可以直接用Selenium运行JavaScript来处理:

情况A:数据已存在DOM,只是被隐藏

比如表格元素的display属性是none,我们可以强制修改样式让它显示:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('目标网页地址')

# 执行JS修改元素样式
driver.execute_script("document.querySelector('.price-table').style.display = 'table';")
# 等待数据渲染完成(可选,根据页面情况调整)
driver.implicitly_wait(5)

# 现在可以获取页面源码,用BeautifulSoup解析
from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_source, 'html.parser')
price_table = soup.find('table', class_='price-table')
# 提取td标签内容

情况B:需要触发JS加载函数

有些网站点击按钮会调用特定的JS函数(比如loadFullPriceList()),我们可以直接执行这个函数:

driver.execute_script("loadFullPriceList();")
# 等待数据加载完成
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, 'td'))
)
# 再解析页面源码

方法3:提取页面中隐藏的JSON数据

不少网站会把完整的数据集嵌入到页面的<script>标签里(比如以window.priceData = {...}的形式),只是前端只渲染了部分内容。我们可以直接提取这部分数据:

soup = BeautifulSoup(driver.page_source, 'html.parser')
# 找到包含定价数据的script标签
script_tag = soup.find('script', string=lambda text: text and 'priceData' in text)
# 提取JSON部分
import json
price_data_str = script_tag.string.split('window.priceData = ')[1].rstrip(';')
price_data = json.loads(price_data_str)
# 从price_data里提取表格的td信息

一些注意事项

  • 记得处理动态加载的等待:用WebDriverWait显式等待比implicitly_wait更可靠,避免还没加载完就解析页面;
  • 如果网站有反爬机制,可能需要模拟真实用户的行为,比如设置合理的等待时间、随机User-Agent,甚至使用代理;
  • 优先尝试方法1,因为直接调用API是最稳定、高效的方式,避免了页面渲染的各种问题。

内容的提问来源于stack exchange,提问作者Ray

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:05:59