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

如何用Selenium抓取横向条形图数据?附目标网页及尝试代码

使用Selenium抓取Algopoly网站条形图数据的解决方案

问题描述

需要抓取网页https://www.algopoly.com/res-rapor.html上的横向条形图数据,期望输出格式如下:

KARABEL RES 5.23 TL/MWh
GÖKÇEDAĞ RES 21.28 TL/MWh
...
HAMSİ RES 486.47TL/MWh

尝试了以下Selenium代码但未获取到任何数据,询问是否可以用Selenium实现该需求:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


url = 'https://www.algopoly.com/res-rapor.html'

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install()))
driver.get(url)
WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, "//iframe[@id='518061208646906024']")))

iframe_element = driver.find_element(By.XPATH, "//iframe[@id='518061208646906024']")
data = driver.switch_to.frame(iframe_element)
print(data)

解决方案

可以用Selenium实现该需求,原代码问题在于切换到iframe后未定位实际的数据元素,且driver.switch_to.frame()仅切换上下文,不返回数据对象。以下是修正后的实现:

修正后的代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = 'https://www.algopoly.com/res-rapor.html'

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install()))
driver.get(url)

# 等待iframe加载完成并切换上下文
iframe_element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, "518061208646906024"))
)
driver.switch_to.frame(iframe_element)

# 等待图表数据元素加载,定位所有数据标签
data_items = WebDriverWait(driver, 20).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".highcharts-data-labels text"))
)

# 提取并格式化输出数据
for item in data_items:
    text = item.text.strip()
    if text:
        # 拆分名称和价格(文本格式为"名称\n价格")
        parts = text.split('\n')
        if len(parts) == 2:
            print(f"{parts[0]} {parts[1]}")

# 切回主页面(若后续有其他操作需执行)
driver.switch_to.default_content()
driver.quit()

代码说明

  • 切换iframe后,需等待内部Highcharts图表的数据标签加载完成,使用.highcharts-data-labels text选择器定位所有条形图的文本标签。
  • 数据标签的文本格式为名称+换行+价格,拆分后即可得到符合需求的输出格式。
  • 操作完成后切回主页面并关闭浏览器,避免资源占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:41:14