在Python中使用Selenium进行并行化

时间:2019-04-24 15:25:15

标签: python selenium selenium-webdriver parallel-processing

我正在尝试并行执行循环,该循环使用Selenium从网站检索数据。在我的循环中,我遍历了之前创建的URL URLlist的列表。

首先,我登录到该页面,然后创建Webdriver的实例。

browser = webdriver.Chrome(executable_path='chromedriver.exe')
browser.get('https://somepage.com')
username = browser.find_element_by_id("email")
password = browser.find_element_by_id("password")
username.send_keys("foo@bar.com")
password.send_keys("pwd123")
browser.find_element_by_id("login-button").click()

然后我的循环开始并调用一些在页面上运行的函数。

for url in URLlist:
   browser.get(url)
   data1 = do_stuff()
   data2 = do_other_stuff()

我不太知道从哪里开始,因为我可以想象每个线程都需要一个webdriver实例。

什么是正确的(也许是最简单的)方法?

2 个答案:

答案 0 :(得分:0)

您需要在单独的.py文件中创建测试方法,安装pytest库软件包,然后使用pytest调用.py文件。从cmd启动python并尝试以下方法:

-m pytest -n 3 C:\test_file.py --html=C:\Report.html

在这种情况下,三种测试方法将并行运行

答案 1 :(得分:0)

要简化并行抓取,您需要安装numpy。

python -m pip install numpy

完成此操作后,您可以轻松实现所需的目标。这是一个简单的示例:

import threading
import numpy as np

#tupel to save the Threads
threads = []

threadCount = 5 #Number of Threads you want

#Custom Thread class 
class doStuffThread(threading.Thread):
    def __init__(self, partLinks):
        threading.Thread.__init__(self)
        self.partLinks = partLinks
    def run(self):
        #New browser instance for each Thread
        browser = webdriver.Chrome(executable_path='chromedriver.exe')
        for link in self.partLinks:
            browser.get(link)
            doStuff(link)
            doOtherStuff(link)

#Split the links to give each thread a part of them
for  partLinks in np.array_split(links,threadCount):
     t = CommentCrawlerThread(partlinks)
     threads.append(t)
     t.start()
#wait till all Threads are finished
for x in threads:
    x.join()