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

优化Selenium脚本以提升Twitter自动化任务执行速度

Twitter Selenium自动化脚本效率优化方案

你的脚本功能正常但运行偏慢,核心问题在于固定延迟time.sleep()的滥用、低效的元素定位逻辑,以及未充分优化的浏览器配置。以下是针对性的优化方案:

一、替换固定延迟为显式等待

time.sleep()会强制等待固定时长,完全忽略元素实际加载状态,是拖慢执行速度的主要原因。改用WebDriverWait配合预期条件(EC),仅在元素达到可交互/可见状态时才继续执行,能大幅节省无效等待时间:

  • 初始化全局WebDriverWait实例,设置合理超时阈值(比如10秒,可根据网络环境调整)
  • 用element_to_be_clickable、presence_of_element_located、visibility_of_element_located等EC条件替代所有time.sleep()

二、优化元素定位策略

你当前使用的绝对XPATH(如/html[1]/body[1]/...)既脆弱(页面结构变动就会失效)又低效,建议改用Twitter官方提供的data-testid属性定位:

  • 登录、发布、点赞、转发等核心功能的元素都有唯一data-testid标识,比如发布按钮对应//div[@data-testid='tweetButton'],点赞按钮对应//div[@data-testid='like']
  • 避免使用绝对路径,优先选择相对路径或属性定位,提升定位速度与稳定性

三、浏览器配置深度优化

针对无头模式的Firefox,添加以下性能优化参数,充分利用RTX 3050的硬件资源:

  • 禁用GPU加速、弹窗通知、自动播放等非必要功能
  • 启用磁盘缓存并设置有效本地路径
  • 调整窗口大小(无头模式默认窗口过小,可能影响元素加载逻辑)
  • 设置页面加载策略为eager,DOM加载完成即继续执行,无需等待所有资源加载完毕

四、其他效率提升技巧

  • 避免重复跳转页面:发布推文时,点击页面左侧的"Tweet"按钮替代直接调用get()方法
  • 上传图片后等待预览元素加载完成再发布,而非固定等待
  • 多账号循环时,用try-finally确保浏览器会话完全清理,避免资源泄漏

修改后的优化代码示例

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
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.keys import Keys


class TwitterBot:
    def __init__(self, username, password):
        self.username = username
        self.password = password
        options = Options()
        # 浏览器性能优化参数
        options.add_argument('--headless')
        options.add_argument('--disk-cache-dir=C:/path/to/your/cache')  # 替换为实际本地缓存路径
        options.add_argument('--disable-gpu')
        options.add_argument('--disable-notifications')
        options.add_argument('--disable-autoplay')
        options.add_argument('--window-size=1920,1080')
        options.page_load_strategy = 'eager'  # 仅等待DOM加载完成
        self.bot = webdriver.Firefox(options=options)
        # 全局显式等待实例,超时10秒
        self.wait = WebDriverWait(self.bot, 10)

    def login(self):
        bot = self.bot
        bot.get('https://twitter.com/login')
        # 等待用户名输入框并输入
        email = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@name='text']")))
        email.send_keys(self.username)
        email.send_keys(Keys.RETURN)
        # 等待密码输入框并输入
        password = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@name='password']")))
        password.send_keys(self.password)
        password.send_keys(Keys.RETURN)
        # 验证登录成功(搜索框出现为标志)
        self.wait.until(EC.presence_of_element_located((By.XPATH, "//input[@data-testid='SearchBox_Search_Input']")))

    def post_tweet_with_image(self, tweet_text, image_path):
        bot = self.bot
        # 点击左侧发布按钮进入编辑页
        compose_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='SideNav_NewTweet_Button']")))
        compose_btn.click()
        # 等待输入框加载并输入内容
        tweet_input = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='tweetTextarea_0']")))
        tweet_input.send_keys(tweet_text)

        if image_path:
            image_input = self.wait.until(EC.presence_of_element_located((By.XPATH, "//input[@data-testid='fileInput']")))
            image_input.send_keys(image_path)
            # 等待图片预览加载完成
            self.wait.until(EC.presence_of_element_located((By.XPATH, "//div[@data-testid='tweetPhoto']")))

        # 点击发布按钮并等待发布完成
        tweet_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='tweetButton']")))
        tweet_button.click()
        self.wait.until(EC.invisibility_of_element_located((By.XPATH, "//div[@data-testid='tweetButton']")))

    def like_own_tweet(self):
        bot = self.bot
        # 进入个人主页
        profile_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//span[normalize-space()='Profile']")))
        profile_btn.click()
        # 点击最新推文
        latest_tweet = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//article[@data-testid='tweet'][1]")))
        latest_tweet.click()
        # 点赞并验证状态变化
        like_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='like']")))
        like_btn.click()
        self.wait.until(EC.presence_of_element_located((By.XPATH, "//div[@data-testid='unlike']")))

    def retweet_from_user(self, user_handle):
        bot = self.bot
        # 搜索指定用户推文
        search_bar = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@data-testid='SearchBox_Search_Input']")))
        search_bar.clear()
        search_bar.send_keys(f"from:{user_handle}")
        search_bar.send_keys(Keys.RETURN)
        # 切换到最新推文标签
        latest_tab = self.wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Latest")))
        latest_tab.click()
        # 点击最新推文并转发
        latest_tweet = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//article[@data-testid='tweet'][1]")))
        latest_tweet.click()
        retweet_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='retweet']")))
        retweet_btn.click()
        confirm_repost = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='retweetConfirm']")))
        confirm_repost.click()
        # 验证转发成功
        self.wait.until(EC.presence_of_element_located((By.XPATH, "//div[@data-testid='unretweet']")))

    def logout(self):
        bot = self.bot
        # 打开账号菜单并登出
        profile_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='SideNav_AccountSwitcher_Button']")))
        profile_button.click()
        logout_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='AccountSwitcher_Logout_Button']")))
        logout_button.click()
        confirm_logout = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@data-testid='confirmationSheetConfirm']")))
        confirm_logout.click()

    def close_browser(self):
        self.bot.quit()

if __name__ == "__main__":
    # 替换为实际账号列表
    users = [
        {"username": "your_username1", "password": "your_password1"},
        {"username": "your_username2", "password": "your_password2"}
    ]

    for user_info in users[:15]:
        username = user_info["username"]
        password = user_info["password"]

        twitter_bot = TwitterBot(username, password)
        try:
            twitter_bot.login()
            tweet_text = "测试推文内容"
            image_path = r"C:\Users\hp\Downloads\anything.jpeg"
            twitter_bot.post_tweet_with_image(tweet_text, image_path)
            # 可选执行:点赞自有推文、转发指定用户推文
            # twitter_bot.like_own_tweet()
            # twitter_bot.retweet_from_user("target_user_handle")
        finally:
            twitter_bot.close_browser()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:05:54