# -*- coding: UTF-8 -*- 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.service import Service as ChromeService from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys import time import pandas as pd import logging from tqdm import tqdm # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("automation.log"), logging.StreamHandler() ] ) # 基础信息 USERNAME = '13690727570' PASSWORD = 'Jz112233' EXCEL_PATH = r"C:\Users\zy187\Desktop\查询车辆id.xls" CHROME_DRIVER_PATH = r"D:\ProgramTools\chromedriver-win64\chromedriver.exe" BASE_URL = 'https://m.f6car.cn/' # 初始化 Chrome def init_driver(): options = webdriver.ChromeOptions() # options.add_argument('--headless') # 无头模式 options.add_argument('--start-maximized') service = ChromeService(executable_path=CHROME_DRIVER_PATH) driver = webdriver.Chrome(service=service, options=options) driver.implicitly_wait(5) return driver # 登录 def login(driver): try: driver.get(BASE_URL) username = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="pane-username"]/form/div[1]/div/div[1]/input')) ) password = driver.find_element(By.XPATH, '//*[@id="pane-username"]/form/div[2]/div/div[1]/input') submit = driver.find_element(By.XPATH, '//*[@id="pane-username"]/form/div[3]/div/button') username.clear() username.send_keys(USERNAME) password.send_keys(PASSWORD) submit.click() logging.info("登录成功") # 选择公司 # company = WebDriverWait(driver, 10).until( # EC.element_to_be_clickable((By.XPATH, "//*[text()='F6汽车科技数据组测试(废弃)']")) # ) # company.click() # time.sleep(5) # 等待页面加载 logging.info("进入公司页面") except Exception as e: logging.error(f"登录失败: {e}") raise # 处理 Excel 数据 def process_excel_data(file_path): try: df = pd.read_excel(file_path) logging.info(f"成功读取 Excel 文件,共 {len(df)} 条数据") return df except Exception as e: logging.error(f"读取 Excel 失败: {e}") raise # 处理单条数据 def process_single_record(driver, id_member,vin): try: # 处理可能的弹窗 try: next_btn = driver.find_element(By.XPATH, "//*[text()=' 下一步']") next_btn.click() time.sleep(1) know_btn = driver.find_element(By.XPATH, "//*[text()=' 我知道了']") know_btn.click() except: pass url = f'https://yunxiu.f6car.cn/kzf6/member/index.do?page=/view/index.html%23/car/edit/{id_member}' driver.get(url) time.sleep(1) # 点击 VIN 输入框 vin_input = driver.find_element(By.XPATH, '//*[@id="app"]/div[1]/div[2]/div/div[2]/div[1]/form/div[2]/div[3]/div/div/div/input') vin_input.send_keys(Keys.CONTROL, 'a') vin_input.send_keys(Keys.BACK_SPACE) vin_input.send_keys(vin) time.sleep(1) # 处理车牌输入框(如果有) try: plate_input = driver.find_element(By.XPATH, '//*[@maxlength="4"]') plate_input.click() time.sleep(1) vin_input.click() except: pass # 处理可能的确认弹窗 try: confirm_btn = driver.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/button[1]/span') confirm_btn.click() time.sleep(1) except: pass # 滚动到底部并保存 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") time.sleep(1) save_btn = driver.find_element(By.XPATH, "//*[text()='保存']") save_btn.click() time.sleep(1) logging.info(f"处理成功: ID={id_member}") except Exception as e: logging.error(f"处理失败: ID={id_member}, 错误: {e}") pass # 主函数 def main(): driver = None try: driver = init_driver() login(driver) df = process_excel_data(EXCEL_PATH) for index, row in tqdm(df.iterrows(), total=len(df), desc="处理数据"): id_member = str(row[0]) # 假设第一列是 ID vin = str(row[2]) process_single_record(driver, id_member, vin) except Exception as e: logging.error(f"程序运行出错: {e}") finally: if driver: driver.quit() logging.info("程序结束") if __name__ == "__main__": main()