从脚本/ Python并行运行Selenium刮刀

时间:2018-12-20 15:15:14

标签: python selenium

我刚刚学习了Selenium来抓取Scrapy无法到达的一些数据。我从不同的机器人制作了不同的脚本,它们分别按预期运行。

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

编辑:

我一直在尝试通过多处理进行此操作,如所示。但是不幸的是,它一次只运行一个脚本,而同时打开了两个硒窗口。一不活动。如果您想看一看,这是我的代码:

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:

我可以解决这个问题,并在下面发布代码!

2 个答案:

答案 0 :(得分:1)

我制作了一个名为selsunpool的简单库,其中包装了您可能想尝试的concurrent.futures。它创建了一个硒工人本地池,这些工人可以存活,并且可以多次重复用于并发作业。目前尚无很好的文档,但使用起来很简单。这是一个例子。

步骤1:使用硒作业装饰器完成功能。装饰器参数定义webdriver附加到的kwarg的名称(从池执行程序返回)。

from selsunpool import selenium_job, SeleniumPoolExecutor


@selenium_job(webdriver_param_name='mydriver')
def get_url(url, mydriver):
    mydriver.get(url)
    return mydriver.title

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

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))

答案 1 :(得分:0)

我可以根据您对Multiprocessing的要求来解决我的问题,所以谢谢大家:)我张贴了我的代码,以防其他初学者需要这样的东西,尽管可能还有其他(更好的)方法。

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()