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

Requests+BeautifulSoup爬取锂价页面表格无数据的解决求助

问题:爬取动态加载的锂价表格数据失败怎么办?

我尝试爬取页面https://www.benchmarkminerals.com/lithium-prices/,用requests获取内容后,通过BeautifulSoup解析能找到id为lithium-index_summary的表格,但表格内没有数据。推测是表格信息通过jQuery动态加载导致的,求解决办法。

我的代码:

import requests
import bs4

lith = requests.get('https://www.benchmarkminerals.com/lithium-prices/')
lithium_soup = bs4.BeautifulSoup(lith.content, 'html.parser')
lithium_table = lithium_soup.find('table', {'id':'lithium-index_summary'})
print(lithium_table)

返回结果:

<table class="price-index_summary" id="lithium-index_summary"></table>

注:该表格实际包含的数据及网页真实HTML可查看对应截图。

解决方案

方法1:使用Selenium模拟浏览器渲染

动态加载的数据需要浏览器执行JS代码才能生成,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
import bs4

# 初始化Chrome浏览器(需提前安装对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get('https://www.benchmarkminerals.com/lithium-prices/')

# 等待表格加载完成,最多等待10秒
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, 'lithium-index_summary')))

# 获取渲染后的页面源码并解析
page_source = driver.page_source
lithium_soup = bs4.BeautifulSoup(page_source, 'html.parser')
lithium_table = lithium_soup.find('table', {'id':'lithium-index_summary'})

# 提取表格数据示例
rows = lithium_table.find_all('tr')
for row in rows:
    cols = row.find_all('td')
    print([col.text.strip() for col in cols])

# 关闭浏览器
driver.quit()

方法2:抓包获取后台API接口

动态加载的数据通常来自后台API,可通过浏览器开发者工具抓包找到数据接口:

  • 打开浏览器F12开发者工具,切换到「Network」标签
  • 刷新页面,筛选「XHR」或「Fetch」类型请求
  • 定位返回表格数据的接口URL及请求参数
  • 直接用requests请求该接口,获取JSON格式数据,无需解析HTML

示例代码(假设找到对应API接口):

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
response = requests.get('https://www.benchmarkminerals.com/api/lithium-prices', headers=headers)
data = response.json()

# 处理JSON数据
print(data)

注意:部分网站API可能需要认证或有反爬机制,需根据实际情况调整请求头、携带必要参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:55:47