使用Beautiful Soup/Selenium爬取ERCOT网站reportTable数据遇空表体问题
解决ERCOT网站reportTable表体数据爬取为空的问题
方法1:优化Selenium等待逻辑
直接调用page_source时,页面可能还未完成表格数据的动态渲染,需等待表格内容加载完成后再获取源码:
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 from bs4 import BeautifulSoup url = 'https://www.ercot.com/mp/data-products/data-product-details?id=NP3-233-CD' chrome = webdriver.Chrome() chrome.get(url) # 等待表格数据行加载,最多等待10秒 wait = WebDriverWait(chrome, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#reportTable tbody tr'))) # 此时再获取完整渲染后的页面源码 data = chrome.page_source soup = BeautifulSoup(data, "html.parser") report_table = soup.find(id='reportTable') # 提取表体数据示例 tbody = report_table.find('tbody') for row in tbody.find_all('tr'): cols = [col.get_text(strip=True) for col in row.find_all('td')] print(cols) chrome.quit()
方法2:直接抓取数据接口(推荐)
动态渲染的表格数据通常来自后端API请求,直接调用接口无需模拟浏览器,效率更高:
- 打开浏览器开发者工具(F12),切换到网络标签
- 刷新页面,筛选XHR/Fetch请求,找到返回表格数据的接口(通常含
report、data等关键词) - 复制接口的URL、请求头和参数,用
requests库直接请求:
示例代码(需替换为实际找到的接口信息):
import requests headers = { 'User-Agent': 'Mozilla/5.0', # 从浏览器请求中复制必要的请求头,如Referer、Cookie等 } params = { 'id': 'NP3-233-CD', # 添加接口所需的其他参数,如时间范围等 } response = requests.get('https://www.ercot.com/api/report/data', headers=headers, params=params) data = response.json() # 解析JSON数据提取表格内容 for item in data['rows']: print(item)
额外注意事项
- ERCOT网站仅允许美国IP访问,需确保爬虫环境使用美国地区代理IP
- 部分接口需携带Cookie或验证信息,需从浏览器请求中完整复制请求头
- 遵守网站使用条款,避免频繁请求导致IP被封禁
内容的提问来源于stack exchange,提问作者Rexon
相关产品推荐
相关产品推荐

