首页 > 解决方案 > 如何在 Python 中使用多处理和 Selenium

问题描述

我正在尝试在 python 中使用 selenium 进行多处理。我的代码如下:

from selenium import webdriver
from multiprocessing import Pool
import xlwings as xw

driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://example.com")

wb = xw.Book('my_file.xlsm')
sht = wb.sheets["Sheet1"]
final_list = []

search = driver.find_element_by_id("ContentPlaceHolder1_txtByName")
for item in search:
       z = item.find_element_by_class_name("valuetext")
       info = z.find_element_by_tag_name("span")
       final_list.append(info.text)

def automate(num):
    col = num
    list_item = final_list[num]   
    sht.range(1, col).value = each


if __name__ == '__main__':

    p = Pool(processes=4)
    data = p.map(automate,range(1,20))        

我遇到的问题是 4 个进程中的每一个都重新打开了网页,我不明白为什么。如果p.map仅针对该automate功能,那么为什么其余代码要为每个进程运行?

我还是多处理的新手,所以不确定它是否就是这样工作的。有没有另一种方法可以确保进程只针对函数本身,或者有没有办法可以使用线程?

标签: pythonmultithreadingseleniumpython-multiprocessingpython-multithreading

解决方案


多处理文档的示例中,他们建议使用Pool上下文管理器,即

with Pool(processes=4) as pool: print(pool.map(f, range(10))

这是我在您的使用和文档之间立即看到的最显着的不同。我没有看到它拼写出来,但我会根据你的观察推断,框架在它产生的每个进程中“重新导入”(可以这么说)你的模块,这导致了你报告的行为:即,多个浏览器打开。

为了防止这种情况,我建议将初始化代码放在一个函数中;如果您想共享final_list,您可能应该使用队列或其他支持的数据结构multiprocess


推荐阅读