使用Selenium与Python无法修改日期问题求助
问题:EEX天然气现货数据爬取的日期切换失效
我需要从指定网站获取天然气现货数据,但现有脚本的日期修改功能无法正常工作。我需要获取所有可用日期的数据,因此需通过Selenium实现日期切换。本人是Python新手,恳请帮助。以下是我的代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup as bs import pandas as pd from selenium_stealth import stealth import time 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.eex.com/en/market-data/natural-gas/spot" chrome_options = Options() chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--headless") chrome_options.add_argument("start-maximized") browser = webdriver.Chrome(executable_path="chromedriver1/chromedriver", options=chrome_options) browser.get("https://www.eex.com/en/market-data/natural-gas/spot") time.sleep(10) date_picker = WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="symbolheader_ngs"]/div/div/div/input'))) date_picker.send_keys("2023-01-23") time.sleep(20) page_source = browser.page_source s = bs(page_source) table = s.select('table')[1] final_list = [] for row in table.select('tr'): final_list.append([x.text for x in row.find_all(['td', 'th'])]) final_df = pd.DataFrame(final_list[2:], columns = final_list[:1]) final_df.columns = ['Spot', 'Last Price', 'Last Volume', 'End of Day Index', 'Volume Exchange','del'] df=final_df.drop('del',axis=1) browser.quit() df.to_excel('final_df.xlsx', index = False)
问题分析
原代码的日期输入逻辑存在几个核心问题:
- 日期输入框可能处于只读状态,直接
send_keys无法修改内容 - 未处理页面的Cookie弹窗,可能遮挡元素导致交互失败
- 缺少日期切换后的页面刷新验证,无法确保数据已更新
- 没有实现批量日期遍历的逻辑
修改后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup as bs import pandas as pd 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.common.keys import Keys import time from datetime import datetime, timedelta # 配置浏览器选项 chrome_options = Options() chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--headless=new") # 新版无头模式更稳定 chrome_options.add_argument("start-maximized") chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 避免被网站识别为爬虫 # 初始化浏览器 browser = webdriver.Chrome(service=Service("chromedriver1/chromedriver"), options=chrome_options) wait = WebDriverWait(browser, 20) # 目标URL url = "https://www.eex.com/en/market-data/natural-gas/spot" browser.get(url) # 处理Cookie弹窗(如果存在) try: accept_cookie = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "Accept all")]'))) accept_cookie.click() time.sleep(2) except: pass # 无弹窗则跳过 # 定义日期范围:示例从2023-01-01到昨天,可按需调整 start_date = datetime(2023, 1, 1) end_date = datetime.now() - timedelta(days=1) current_date = start_date # 存储所有数据的列表 all_data = [] while current_date <= end_date: date_str = current_date.strftime("%Y-%m-%d") print(f"正在获取日期:{date_str}") try: # 定位日期输入框,先点击激活再清除原有内容 date_picker = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="symbolheader_ngs"]/div/div/div/input'))) date_picker.click() date_picker.clear() # 输入目标日期并按回车确认 date_picker.send_keys(date_str) date_picker.send_keys(Keys.ENTER) # 等待表格数据刷新,确保获取对应日期的数据 wait.until(EC.staleness_of(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table'))))) time.sleep(3) # 解析页面数据 soup = bs(browser.page_source, 'html.parser') table = soup.select('table')[1] # 提取有效数据行,添加日期标识 rows = [] for tr in table.select('tr')[2:]: row_data = [td.text.strip() for td in tr.find_all(['td', 'th'])] if len(row_data) >= 5: row_data.insert(0, date_str) rows.append(row_data[:5]) all_data.extend(rows) except Exception as e: print(f"获取日期{date_str}失败:{str(e)}") # 日期递增一天 current_date += timedelta(days=1) # 保存数据到Excel if all_data: df = pd.DataFrame(all_data, columns=['日期', 'Spot', 'Last Price', 'Last Volume', 'End of Day Index', 'Volume Exchange']) df.to_excel('all_natural_gas_spot.xlsx', index=False) print("数据已保存到all_natural_gas_spot.xlsx") else: print("未获取到任何数据") browser.quit()
关键修改说明
- 浏览器优化:使用新版无头模式,添加反检测参数,避免被网站拦截
- Cookie处理:自动接受Cookie,确保后续元素可正常交互
- 日期输入修复:先激活输入框、清除原有内容,再输入日期并回车确认,解决只读状态问题
- 数据刷新验证:通过
staleness_of等待表格元素重新加载,确保获取的是对应日期的最新数据 - 批量遍历:实现日期循环逻辑,自动获取指定范围内所有日期的数据
- 数据清洗:添加日期标识,过滤无效行,保证数据格式统一
内容的提问来源于stack exchange,提问作者Augusto Chile
相关产品推荐
相关产品推荐

