如何用Selenium为DatepickerRange设置自定义时间范围并抓取底盘数据
问题分析与修复方案
原代码的核心问题在于对日期范围选择器的交互逻辑判断有误,大多数第三方日期选择器(如daterangepicker)需要先切换到自定义范围模式,且直接操作输入框可能因插件的只读属性或事件绑定失效导致报错。以下是修复后的完整代码:
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.options import Options import pandas as pd # 配置浏览器选项 chrome_options = Options() download_directory = '/Users/temp/py_scraping_selenium_test' prefs = {'download.default_directory': download_directory} chrome_options.add_experimental_option('prefs', prefs) driver = webdriver.Chrome(options=chrome_options) wait = WebDriverWait(driver, 30) # 缩短超时时间,避免不必要的等待 # 访问目标页面 driver.get('https://dcli.com/track-a-chassis/?0-chassisType=vin&searchChassis=LJRC41269G1020818') try: # 等待日期选择器可点击并打开弹窗 date_range_picker = wait.until(EC.element_to_be_clickable((By.ID, 'daterange'))) date_range_picker.click() # 等待自定义范围选项出现并点击(大多数daterangepicker需要此步骤) custom_range_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//li[text()="Custom Range"]'))) custom_range_btn.click() # 等待日期输入框加载完成,用JS直接设置值(避免send_keys的兼容性问题) start_date_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="startDate"]'))) end_date_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="endDate"]'))) driver.execute_script("arguments[0].value = '01/01/2023';", start_date_input) driver.execute_script("arguments[0].value = '12/31/2023';", end_date_input) # 点击日期选择器的确认按钮(如果存在) apply_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[text()="Apply"]'))) apply_btn.click() # 等待搜索按钮可点击并触发搜索 search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[text()="Search"]'))) search_btn.click() # 等待结果表格加载完成 results_table = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'table'))) # 将表格数据导出为CSV df = pd.read_html(results_table.get_attribute('outerHTML'))[0] df.to_csv(f'{download_directory}/chassis_movement_history.csv', index=False) print(f"CSV文件已保存至 {download_directory}/chassis_movement_history.csv") finally: driver.quit()
关键修复点说明
- 更精准的等待条件:使用
element_to_be_clickable替代presence_of_element_located,确保元素可交互后再操作 - 自定义范围切换:添加点击"Custom Range"的步骤,触发自定义日期输入框的显示
- JS设置日期值:通过JavaScript直接修改输入框的value属性,规避插件对send_keys的限制
- 资源清理:使用try-finally确保浏览器正常关闭
- CSV导出:利用pandas的
read_html直接解析页面表格并导出为CSV
内容的提问来源于stack exchange,提问作者Sean Liu
相关产品推荐
相关产品推荐

