【问题标题】:Run Selenium scrapers in parallel from script / Python从脚本/Python 并行运行 Selenium 刮板
【发布时间】:2018-12-20 15:15:13
【问题描述】:

我刚刚学会了 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:

我可以解决它并在下面发布代码!

【问题讨论】:

  • 我看过这个话题,但我现在关心的并不是加快执行速度,只是能够从一个主脚本并行启动几个 selenium 机器人
  • 我的错。我收回了国旗。同时,您查看过stackoverflow.com/questions/30213888/… 吗?它包含一个基于multiprocessing 的方法。
  • 您将需要一个异步/线程解决方案,因为对 webdriver 的调用将阻塞,直到它完成。
  • 线程或多处理可以工作

标签: python selenium


【解决方案1】:

我创建了一个名为selsunpool 的简单库,它包装了concurrent.futures,您可能想尝试一下。它创建了一个本地 selenium 工人池,这些工人保持活力,并且可以多次重复用于并发作业。目前还没有很好的文档记录,但它使用起来很简单。这是一个例子。

第 1 步:使用 selenium 作业装饰器创建一个函数。装饰器参数定义了 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))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2014-11-04
      • 2021-12-19
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多