使用Selenium抓取Knoema平台世界银行天然气价格预测数据的技术问询
解决Knoema网站天然气价格预测数据抓取问题
我注意到你的代码片段没写完(selenium.commo...部分),不过没关系,咱们一步步搞定这个数据抓取的事儿。
完整Selenium实现方案
针对Knoema这类动态渲染的网站,我给你补全并优化了代码,同时适配了常见的反爬和加载问题:
1. 先准备依赖
确保你已经安装了必要的工具包,用webdriver-manager可以自动管理浏览器驱动,不用手动下载:
pip install selenium webdriver-manager pandas
2. 可运行的完整代码
url = "https://knoema.com/ncszerf/natural-gas-prices-forecast-long-term-2017-to-2030-data-and-charts" 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 selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import pandas as pd # 初始化Chrome驱动(自动适配浏览器版本) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) try: # 等待核心数据表格加载完成(Knoema的表格通常带k-grid类) table = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CLASS_NAME, "k-grid")) ) # 提取表格行与列数据 rows = table.find_elements(By.TAG_NAME, "tr") raw_data = [] for row in rows: cols = row.find_elements(By.TAG_NAME, "td") # 过滤空值并清理文本格式 cleaned_cols = [col.text.strip() for col in cols if col.text.strip()] if cleaned_cols: raw_data.append(cleaned_cols) # 转成DataFrame方便后续处理 if raw_data: df = pd.DataFrame(raw_data[1:], columns=raw_data[0]) # 第一行作为表头 print("抓取到的数据预览:") print(df.head()) # 保存为CSV文件 df.to_csv("natural_gas_forecast_data.csv", index=False) print("数据已保存到natural_gas_forecast_data.csv") finally: # 无论成功失败都关闭浏览器 driver.quit()
关键注意事项
- 动态加载适配:Knoema的内容是JS渲染的,必须用
WebDriverWait等待元素加载完成,不能直接用driver.find_element,否则会触发元素未找到的错误。 - 选择器灵活调整:如果页面结构有更新,打开浏览器开发者工具(F12)重新定位表格的选择器,比如有时候表格会嵌套在特定的
div容器里。 - 反爬规避:Knoema有基础反爬机制,建议添加
time.sleep(2)这类间隔时间,不要频繁请求页面;如果遇到IP封禁,可以考虑使用代理IP。 - 数据清洗:抓取到的原始数据可能带有多余空格、换行,用
strip()方法清理后再存入表格,保证数据整洁。
替代方案(如果Selenium受限)
要是遇到反爬检测导致Selenium无法正常工作,可以试试这两个更轻量的方法:
- 抓API接口:用浏览器Network面板筛选XHR请求,找到加载数据的接口,直接用
requests库请求,效率比Selenium高很多。 - 用
requests-html:这个库可以渲染JavaScript,比Selenium轻量,适合简单的动态页面抓取。
内容的提问来源于stack exchange,提问作者shashank rai
相关产品推荐
相关产品推荐

