152 lines
4.9 KiB
Python
152 lines
4.9 KiB
Python
# -*- 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() |