如何用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
相关产品推荐
相关产品推荐

