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

如何用Python Selenium与多进程实现多浏览器多账号登录机器人?

可行性分析与实现方案

完全可以用Selenium + multiprocessing实现多浏览器多账号登录的需求。multiprocessing会创建独立的进程,每个进程启动一个独立的Chrome实例,互相之间不会共享会话或缓存,刚好满足多账号隔离的要求。

你的代码存在的问题

  • 所有进程复用同一组账号信息,无法实现不同账号登录
  • 硬编码time.sleep()等待页面加载,稳定性差,一旦页面加载慢就会定位失败
  • 使用了Discord的动态类名(比如inputField-2RZxdl),这类随机生成的类名很容易随网站更新失效
  • 异常处理不严谨:如果driver初始化失败,finally块里调用driver.close()会抛出新的异常
  • 未配置独立的用户数据目录,虽然多进程下driver实例独立,但额外隔离更稳妥

优化后的实现代码

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.common.action_chains import ActionChains
import multiprocessing
import os

# 多账号配置:每个元组对应一个账号的邮箱、密码
ACCOUNTS = [
    ("account1@example.com", "password1"),
    ("account2@example.com", "password2")
]

# 为每个进程创建独立的用户数据目录,避免缓存干扰
def get_user_data_dir(process_id):
    dir_path = f"./chrome_profile_{process_id}"
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)
    return dir_path

def login_and_operate(account_info):
    login, password = account_info
    process_id = multiprocessing.current_process().pid
    driver = None
    try:
        options = webdriver.ChromeOptions()
        options.add_argument(f"user-data-dir={get_user_data_dir(process_id)}")
        options.add_argument(
            "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
        )
        # 禁用GPU加速,避免部分环境下的渲染问题
        options.add_argument("--disable-gpu")
        # 启动无沙箱模式,解决部分系统权限问题
        options.add_argument("--no-sandbox")

        driver = webdriver.Chrome(options=options)
        wait = WebDriverWait(driver, 15)  # 显式等待最长15秒

        driver.get("https://discord.com/login")

        # 等待邮箱输入框加载完成并输入
        email_input = wait.until(EC.presence_of_element_located((By.NAME, "email")))
        email_input.clear()
        email_input.send_keys(login)

        # 等待密码输入框加载完成并输入
        password_input = wait.until(EC.presence_of_element_located((By.NAME, "password")))
        password_input.clear()
        password_input.send_keys(password)

        # 等待登录按钮可点击并点击
        login_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")))
        login_btn.click()

        # 等待登录完成(这里可以根据登录后的页面元素判断,比如用户头像)
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, "avatar-3QF_VA")))

        # 后续操作:打开文件夹(替换为更可靠的定位方式,比如根据文件夹名称)
        # 示例:如果文件夹名称是"Project Folder",用文本定位
        folder = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), 'Project Folder')]/ancestor::div[@class='closedFolderIconWrapper-3tRb2d']")))
        folder.click()

        # 等待项目加载并点击(同样建议用文本定位)
        project = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), 'My Project')]")))
        project.click()

        # 滚动到指定位置
        driver.execute_script("window.scrollTo(0, 200)")

        # 等待频道加载并点击
        channel = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@href, '/channels/') and contains(text(), 'Target Channel')]")))
        ActionChains(driver).move_to_element(channel).click().perform()

        # 等待消息反应按钮并点击
        reaction_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-message-id='1008818995081781248'] .reaction-1hd86g")))
        ActionChains(driver).move_to_element(reaction_btn).click().perform()

        # 如果需要保持浏览器打开,注释下面的关闭代码
        # driver.close()
        # driver.quit()

    except Exception as ex:
        print(f"账号 {login} 操作失败: {str(ex)}")
    finally:
        if driver:
            try:
                driver.quit()
            except:
                pass

if __name__ == "__main__":
    # 进程池大小建议和账号数量一致
    with multiprocessing.Pool(processes=len(ACCOUNTS)) as pool:
        pool.map(login_and_operate, ACCOUNTS)

关键优化点说明

  • 多账号隔离:通过ACCOUNTS列表传入不同账号信息,每个进程处理一组
  • 独立用户目录:每个进程使用专属的Chrome用户数据目录,彻底隔离登录状态
  • 显式等待:用WebDriverWait替代time.sleep(),只有当元素满足条件时才继续执行,大幅提升稳定性
  • 可靠元素定位:替换动态类名为name属性、文本内容或更稳定的CSS选择器,避免网站更新导致定位失效
  • 完善异常处理:先判断driver是否初始化成功,再执行关闭操作,避免二次异常
  • Chrome参数优化:添加--disable-gpu和--no-sandbox参数,解决不同环境下的兼容性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:06:25