Python+Selenium多线程后台处理异常:后台驱动无法并行执行
问题:Selenium多线程后台运行时无法处理数据,仅前台正常
尝试用Python结合Selenium实现多线程自动登录网站并填写表单,为每个用户名分配独立的浏览器驱动。但驱动在后台并行启动后无法处理数据,只有前台打开时才能正常运行,导致必须等待一个任务完成后再处理下一个,流程被大幅拖慢。因保密原因无法提供网站URL,以下是相关代码:
导入依赖
import undetected_chromedriver as uc 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.support.ui import Select from selenium.common.exceptions import NoSuchElementException,ElementClickInterceptedException,TimeoutException from threading import Thread import time import pandas as pd
Chrome配置选项
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--headless') chrome_options.add_argument('--enable-javascript') chrome_options.add_argument('--disable-gpu') user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15' chrome_options.add_argument('User-Agent={0}'.format(user_agent)) chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', True)
核心函数
def login_hbd(driver,username,password): WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.NAME,"username"))) username_field = driver.find_element(By.NAME,"username") username_field.send_keys(username) password_field = driver.find_element(By.NAME,"password") password_field.send_keys(password) submit_btn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "submitBtn"))) driver.execute_script("arguments[0].click();", submit_btn) def get_ss_hbd(driver,username_list,password_list): while True: try: login_hbd(driver,str(username_list),password_list) WebDriverWait(driver, 1).until(EC.visibility_of_element_located((By.XPATH,"/html/body/div[1]/div/div/header/div/div[3]/nav/ul/li[7]/a"))) driver.get("*****") driver.save_screenshot(f"{username_list}.png") driver.close() break except (NoSuchElementException,ElementClickInterceptedException,TimeoutException): continue
多线程执行代码
# 获取开始时间 st = time.time() number_of_threads = len(df) threads = [] for _ in range(number_of_threads): username_list = df.loc[_][0] password_list = df.loc[_][1] driver = uc.Chrome(chrome_options=chrome_options,service_args=['--quiet']) driver.get("****") t = Thread(target=get_ss_hbd, args=(driver,username_list,password_list)) t.start() threads.append(t) for t in threads: t.join() et = time.time() # 计算执行时间 elapsed_time = et - st print('Execution time:', elapsed_time, 'seconds')
内容的提问来源于stack exchange,提问作者Omar Ahmed
相关产品推荐
相关产品推荐

