Как использовать многопроцессорный пул с Python Selenium - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть код, который должен go и захватывать данные с сотен веб-страниц, и я хотел бы ускорить его, запустив для него несколько экземпляров браузера Selenium Chrome. Например, у меня есть этот код здесь:

from selenium import webdriver
from multiprocessing import Pool
from tkinter import *

#initiate browser
def browser():
    global driver
    driver = webdriver.Chrome(r"C:\Users\areed\Desktop\p\chromedriver.exe")
    return driver

#test link
def test():
    links = [link1.com, link2.com, link3.com, link4.com]
    browser()
    for l in links:
        driver.get(l)
        dostuff(driver)

#Scrape Data
def dostuff(driver):
    print('doing Stuff')

#multiprocess Function      
def multip():
    pool = Pool(processes=4)
    pool.map(test())

#tkinter Window
if __name__ == "__main__":  
    win = Tk()
    win.title("test")
    win.geometry('300x200')
    btn = Button(win, text="Tester", command=multip)
    btn.pack()
    win.mainloop()

Как мне сделать так, чтобы этот код запускал несколько браузеров selenium chrome? Этот код прекрасно работает, не добавляя к нему многопроцессорность. Может кто-нибудь, пожалуйста, объясните мне, как это исправить. Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2020

Я пишу пример кода для многопроцессорной обработки.

Вы можете установить ссылку в качестве аргумента функции test ().

Каждый браузер будет переходить на другую ссылку.

from selenium import webdriver
from multiprocessing import Pool

# I remove global driver because you cannot use shared driver in multiprocess.
def browser():  
    driver = webdriver.Chrome()
    return driver

def test_func(link):
    driver = browser()  # Each browser use different driver.
    driver.get(link)

def multip():
    links = ["https://stackoverflow.com/", "https://signup.microsoft.com/"]
    pool = Pool(processes=3)
    for i in range(0, len(links)):  
        pool.apply_async(test_func, args={links[i]})

    pool.close()
    pool.join()

multip()

Я пробовал приведенный выше код и стал успешным.

...