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

如何动态抓取特定VIN码搜索引擎的结果页面数据?

解决Selenium批量搜索VIN后从新窗口提取数据的问题

看起来你已经搞定了VIN码的批量读取和搜索触发,但卡在了新窗口结果页的数据提取上——这其实是Selenium处理多窗口场景的常见问题,咱们一步步来解决:

先修复原代码的基础问题

你的导入语句格式有误,得把每个import单独拆成一行,不然会直接报错。另外,重复调用driver.find_element_by_name("vin")也没必要,直接存成变量会更高效。

核心问题:切换到新结果窗口

当你点击按钮弹出新窗口后,Selenium默认还是停留在原窗口的上下文里,所以必须手动切换到新窗口的句柄。具体步骤是:

  • 点击按钮前先记录当前窗口的句柄(original_window)
  • 点击触发新窗口后,等待窗口加载完成
  • 通过driver.window_handles获取所有窗口句柄,切换到非原窗口的那个

提取指定数据

切换到新窗口后,你可以用Selenium自带的元素定位(比如find_element_by_xpath、find_element_by_css_selector)直接提取数据,也可以结合BeautifulSoup解析页面源码,根据实际需求选择即可。

完整修改后的代码

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
import openpyxl
from openpyxl import load_workbook
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 初始化浏览器和Excel文件
chrome_path = r"C:\Users\siamak\Downloads\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
wb = load_workbook('VINS.xlsx')
sheet = wb['Sheet1']

# 遍历Excel中的VIN码
for row in sheet.iter_rows(min_row=1, max_col=1, max_row=3):
    for cell in row:
        vin = cell.value.strip()
        if not vin:
            continue  # 跳过空值
        
        # 打开搜索页面,用显式等待替代sleep更稳定
        driver.get("http://www.autoreturn.com/las-vegas-nv/find-vehicle/")
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "vin")))
        
        # 输入VIN并触发搜索
        vin_input = driver.find_element_by_name("vin")
        vin_input.send_keys(vin)
        driver.find_element_by_xpath("//*[@id='searchParameters']/div[3]/div[2]").click()
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='vehicle-search-results']/form/div/input")))
        
        # 点击进入详细结果页(弹出新窗口)
        original_window = driver.current_window_handle
        driver.find_element_by_xpath("//*[@id='vehicle-search-results']/form/div/input").click()
        # 等待新窗口出现
        WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
        
        # 切换到新窗口
        for window_handle in driver.window_handles:
            if window_handle != original_window:
                driver.switch_to.window(window_handle)
                break
        
        # ---------------------- 这里开始提取数据 ----------------------
        # 示例:假设要提取车辆品牌和型号,需根据实际页面元素调整定位方式
        try:
            # 用显式等待确保元素加载完成
            vehicle_make = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".vehicle-make"))).text
            vehicle_model = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".vehicle-model"))).text
            # 把提取的数据写回Excel当前行的第2、3列
            cell.offset(column=1).value = vehicle_make
            cell.offset(column=2).value = vehicle_model
            print(f"成功提取VIN {vin} 的数据:{vehicle_make} {vehicle_model}")
        except Exception as e:
            print(f"提取VIN {vin} 数据失败:{str(e)}")
            cell.offset(column=1).value = "提取失败"
        
        # ---------------------- 数据提取结束 ----------------------
        
        # 关闭新窗口,切回原窗口
        driver.close()
        driver.switch_to.window(original_window)

# 保存Excel文件
wb.save('VINS_with_results.xlsx')
driver.quit()

关键要点说明

  • 窗口切换:通过window_handles遍历所有窗口,找到新窗口句柄切换过去,操作完记得关闭新窗口并切回原窗口,避免后续操作混乱。
  • 等待策略:优先使用WebDriverWait显式等待替代time.sleep,它会等待元素满足条件后再执行操作,比固定时长的sleep更稳定可靠。
  • 元素定位:你需要根据结果页的实际HTML结构调整定位器(比如css_selector、xpath),可以用浏览器开发者工具(F12)查看元素的属性来编写定位规则。
  • 异常处理:加入try-except块可以避免单个VIN提取失败导致整个程序崩溃,同时能记录错误信息方便排查。

内容的提问来源于stack exchange,提问作者Maks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:09:38