如何动态抓取特定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
相关产品推荐
相关产品推荐

