从script/Python并行运行Selenium scrapers

从script/Python并行运行Selenium scrapers,python,selenium,Python,Selenium,我刚刚学会了使用Selenium来刮取一些用Scrapy无法获取的数据。我已经从不同的机器人程序中制作了不同的脚本,并且它们按照预期单独运行 这两个浏览器一个接一个地打开,而我想让它们同时运行。有没有一个简单的方法可以做到这一点?谢谢你的帮助 编辑: 如图所示,我一直在尝试多处理。但不幸的是,它一次只运行一个脚本,而打开了两个selenium窗口。一个保持不活动。如果您想看一下,下面是我的代码: u = UBot() google = GoogleBot() list_test = [[u.m

我刚刚学会了使用Selenium来刮取一些用Scrapy无法获取的数据。我已经从不同的机器人程序中制作了不同的脚本,并且它们按照预期单独运行

这两个浏览器一个接一个地打开,而我想让它们同时运行。有没有一个简单的方法可以做到这一点?谢谢你的帮助

编辑:

如图所示,我一直在尝试多处理。但不幸的是,它一次只运行一个脚本,而打开了两个selenium窗口。一个保持不活动。如果您想看一下,下面是我的代码:

u = UBot()
google = GoogleBot()

list_test = [[u.main(), google.main()]]

processes = []
for test in list_test:
    p = multiprocessing.Process()
    processes.append(p)
    p.start()
编辑2:


我可以解决它和张贴代码下面

我制作了一个简单的库,名为wrapps
concurrent.futures
,您可能想试试。它创建了一个本地selenium Worker池,这些Worker保持活动状态,并且可以在并发作业中重复使用任意次数。目前还没有很好的文档记录,但使用起来很简单。这里有一个例子

步骤1:使用selenium作业装饰器生成函数。decorator参数定义webdriver附加到的kwarg的名称(从池执行器返回)

步骤2:使用池执行器的方式与使用
线程池执行器的方式相同。注意:作业结果是通过一个属性检索的,该属性是一个生成器,在结果完成时生成结果

with SeleniumPoolExecutor(num_workers=2, close_on_exit=True) as pool:
    sites = ['https://google.com', 'https://msn.com']
    pool.map(get_url, sites)
    print(list(pool.job_results))

我可以根据您关于多处理的建议来解决我的问题,所以谢谢大家:)我发布我的代码,以防其他初学者需要类似的东西,尽管可能还有其他(更好的)方法

from google_bot import GoogleBot
from u_bot import UBot
from multiprocessing import Pool 

def google_process():

    google = GoogleBot()
    google.main()
    return

def u_process():

    u = UBot()
    u.main()
    return

def main():

    pool = Pool(processes=2)
    google = pool.apply_async(google_process)
    u = pool.apply_async(u_process)

    pool.close()
    pool.join()

我看了这个主题的可能重复,但我现在真正关心的不是加快执行速度,只是能够从主脚本并行启动几个selenium机器人。我已经收回了国旗。与此同时,你调查过了吗?它包含一个基于
多处理
的方法。您需要一个异步/线程化的解决方案,因为对webdriver的调用将被阻止,直到它完成。线程化或多处理可以工作
from google_bot import GoogleBot
from u_bot import UBot
from multiprocessing import Pool 

def google_process():

    google = GoogleBot()
    google.main()
    return

def u_process():

    u = UBot()
    u.main()
    return

def main():

    pool = Pool(processes=2)
    google = pool.apply_async(google_process)
    u = pool.apply_async(u_process)

    pool.close()
    pool.join()