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

如何用Excel替代JSON实现多线程Selenium谷歌搜索自动化

解决方案:线程安全的Excel数据源分配

核心思路

用线程安全的队列存储Excel中的搜索关键词行,每个Chrome线程从队列中获取唯一的一行数据,避免重复读取和参数传递混乱。

具体实现步骤

  1. 预加载Excel数据到线程队列
    使用openpyxl读取Excel文件的所有目标行,将每一行的搜索关键词存入queue.Queue(Python自带的线程安全队列)。
  2. 修改线程任务逻辑
    线程函数不再接收固定行参数,而是从队列中动态获取任务数据,直到队列为空时结束线程。
  3. 优化Chrome实例启动
    保持原多线程启动ChromeDriver的逻辑,确保每个线程对应独立的浏览器实例。

完整代码示例

import threading
import queue
from openpyxl import load_workbook
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 初始化线程安全队列
search_queue = queue.Queue()

def load_excel_data(excel_path):
    # 加载Excel文件
    wb = load_workbook(excel_path)
    sheet = wb.active  # 假设使用第一个工作表
    # 跳过表头(如果有),从第2行开始读取
    for row in sheet.iter_rows(min_row=2, values_only=True):
        # 假设搜索关键词在第一列(A列)
        keyword = row[0]
        if keyword:  # 跳过空行
            search_queue.put(keyword)

def chrome_search_task():
    # 启动Chrome实例
    options = webdriver.ChromeOptions()
    options.add_argument("--start-maximized")
    driver = webdriver.Chrome(options=options)
    
    while not search_queue.empty():
        try:
            keyword = search_queue.get(timeout=1)  # 设置超时避免线程阻塞
            # 执行谷歌搜索
            driver.get("https://www.google.com")
            search_box = driver.find_element(By.NAME, "q")
            search_box.send_keys(keyword)
            search_box.send_keys(Keys.ENTER)
            # 这里可以添加后续操作(比如提取结果)
            print(f"线程{threading.current_thread().name}完成搜索:{keyword}")
            search_queue.task_done()
        except queue.Empty:
            break
    
    # 关闭浏览器
    driver.quit()

if __name__ == "__main__":
    # 加载Excel数据到队列
    load_excel_data("search_keywords.xlsx")
    
    # 启动指定数量的线程(比如5个)
    thread_count = 5
    threads = []
    for i in range(thread_count):
        t = threading.Thread(target=chrome_search_task, name=f"Chrome-{i+1}")
        t.start()
        threads.append(t)
    
    # 等待所有线程完成
    for t in threads:
        t.join()
    
    print("所有搜索任务完成")

关键说明

  • 线程安全队列:queue.Queue自动处理多线程的并发访问,确保每个关键词只被一个线程获取,完全避免重复搜索。
  • 参数传递问题解决:不再需要给每个线程单独传递行参数,线程从队列动态取数,彻底解决参数传递失败的问题。
  • 空行处理:代码中加入了对空行的判断,避免无效搜索任务。
  • 超时机制:get(timeout=1)防止队列空时线程无限阻塞,确保线程能正常退出。

针对原代码的调整建议

如果你的原openpyxl代码是尝试给每个线程传递固定行号,这种方式容易因为线程调度问题导致重复或参数传递错误。改用队列模式后,无需手动分配行号,由队列统一管理任务分配,逻辑更简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:31:08