在Python中使用Selenium进行并行化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中使用Selenium进行并行化相关的知识,希望对你有一定的参考价值。

我试图并行化一个循环的执行,该循环使用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实例。

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

答案

您需要在单独的.py文件中创建测试方法,安装pytest库包并使用pytest调用.py文件。从cmd启动python并在这些行上尝试一些东西:

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

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

另一答案

为了简化Web抓取的并行化,您需要安装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()

以上是关于在Python中使用Selenium进行并行化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 java 绑定并行化 selenium webdriver 的实例?

使用 selenium 的 Python 并行执行

如何在 python 中并行化以下代码片段?

在 Python 中使用 asyncio 并行化 Web 任务

如何使用 python 多线程并行化来自另一个模块的函数而不进行酸洗?

python 使用boto进行并行化分段上传的示例