为每个工作人员使用一个PhantomJS浏览器而不是为队列中的每个URL创建新实例会显着降低性能

时间:2016-02-27 16:09:22

标签: python selenium webdriver

我正在使用selenium的PhantomJS浏览器来搜索网站。我也通过队列与工作者一起使用线程,因为我有很多查询需要运行。 以前我会创建一个新的Web浏览器实例来访问每个URL,如下所示:

def worker():
    while True:   
        driver = webdriver.PhantomJS()
        driver.set_page_load_timeout(10)
        driver.set_window_size(1400,1000)
        params = q.get()
        params = params + (driver,)
        print params
        crawl(*params)
        driver.quit()
        q.task_done()

我在网上看到人们建议打开浏览器的成本很高,所以我应该为每个工作人员打开一个浏览器并且每次都使用它。我尝试了这个,但它实际上大大降低了速度,当我早上检查我的电脑时,它几乎使用了我的ram的整个容量,我不得不重新启动计算机以阻止程序运行。这是我的代码 - 如果你们中的任何人知道如何在增加速度的同时为每个工作人员使用一个浏览器,请告诉我!谢谢!

def worker():
    while True:
        try:
            driver
        except NameError:
            driver = PhantomJS()
            driver.set_page_load_timeout(10)
            driver.set_window_size(1400,1000)
        params = q.get()
        params = params + (driver,)
        print params
        crawl(*params)
        q.task_done()

q = Queue()

for i in range(10):
    t = Thread(target=worker)
    t.daemon = True
    t.start()

# all dates from init_date to 12/31/2015
date_period = 10
#init_date = "01/01/90"
init_date = "01/01/01"
for i in range(1826/date_period): 
    start_date, end_date = date_inc(init_date, i*date_period), 
    params = (start_date, end_date, 0)
    q.put(params)

q.join()  

1 个答案:

答案 0 :(得分:1)

启动浏览器确实需要一些时间。保持浏览器运行一段时间也会增加大多数浏览器的内存使用量。

一旦运行Internet Explorer并为报告自动化测试制作了大量屏幕截图,我遇到了类似的问题。经过每一次测试后,我最终重启了浏览器。

在您的情况下,这也可能有所帮助:使用一个(或几个)浏览器并每n秒或每n个命令后重启浏览器。