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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:43:16