如何使用Python在Selenium中同时运行多个webdriver进程?

时间:2018-06-12 13:50:40

标签: python python-3.x selenium-webdriver concurrency

编程NooB,请保持温和。 : - )

我有一个包含数千个网址的列表。我想使用Python / Selenuim:

  1. 加载每个网址
  2. 选择一个元素
  3. 关闭页面
  4. 为了让它运行得更快,我希望并行运行大量这些进程,但我只能一次解决这个问题。

    from selenium import webdriver
    driver = webdriver.Chrome()
    
    url_list = [
                'https://www.instagram.com/p/Bj7NmpqBuSw/?tagged=style', 
                'https://www.instagram.com/p/Bj7Nic3Au85/?tagged=style'
                ]
    
    for url in url_list:
        driver.get(url)
        driver.find_elements_by_class_name("class-name-for-profile-link")
        driver.close()
    

    我尝试使用大量浏览器标签

    driver.switch_to.window(driver.window_handles[1])
    

    但处理起来有点棘手。

    如何并行运行此流程?

2 个答案:

答案 0 :(得分:0)

您可以使用this循环并行。样品用法:

from joblib import Parallel, delayed

def do_stuff(url):
    phantom = webdriver.PhantomJS('/path/to/phantomjs') # you can use any driver
    phantom.get(url)
    # do your stuff
    phantom.close()

Parallel(n_jobs=-1)(delayed(do_stuff)(url) for url in urls) #execute parallel for all urls

答案 1 :(得分:0)

tl; dr 我创建了this gist,以给出一个简单的示例,说明如何并行运行简单的Selenium任务。您可以根据自己的目的进行调整。


并行化Selenium脚本的问题在于Selenium工人本身就是进程。上面的脚本使用两个FIFO queues,一个用于存储空闲的Selenium工作程序的ID,另一个用于存储要传递给工作程序的数据。后台主线程在这两个队列之间进行侦听,并将传入的数据分配给空闲的工作程序,从而在工作程序执行工作时将硒工作程序的ID移出工作程序队列。

要使代码适应您的目的,您要做的就是更改功能selenium_task中的代码。希望这会有所帮助!