2016-03-01 39 views
0

我在一大组页面上运行PhantomJS来刮取一些特定的JS生成的内容。我使用Python Selenium绑定,可以很容易地对结果执行XPath查询。我注意到,如果我尝试实例化一个webdriver.PhantomJS对象并用它执行整个任务(通过“重复使用”它可以这么说),我的脚本很快变得不稳定,伴随着零星的内存和连接问题。我的下一个尝试是尝试为每个渲染调用实例化一个新的驱动程序(并在完成时调用quit()),这也适用于多个请求。我最后的尝试是使用subprocess将渲染调用隔离在其自己的进程空间中。但即使这种技术是迄今为止最稳定的技术,但我仍然需要将我的整个脚本包装在supervisor中,以处理偶尔的打嗝。我真的很想知道我是否可能做错了什么,或者如果有什么我应该知道的。据我所知,PhantomJS(和其他自动化浏览器)并不是真正意义上的本质(更多用于测试),但是有没有办法使其工作在非常稳定的状态?PhantomJS在呈现多个页面时的稳定性

回答

1

我使用硒与pyvirtualdisplay与普通的浏览器类似于这样的:Python - Headless Selenium WebDriver Tests using PyVirtualDisplay(尽管我使用的是Chrome;只是一个不同的驱动程序的问题)。

比我在节点和Python中使用PhantomJS的经验稳定得多。以防万一,您仍然可能想要使用流程管理器,但这种方式对我来说已经不那么容易出错。另外,我建议你写一个Python包装类,这样你就可以使用with块,并确保你的环境总是被清理干净;如果你没有适当地杀掉会话,你最终可能会遇到一个孤立的浏览器吃掉内存。

从我的项目:

import os, time 

from selenium import webdriver 
from pyvirtualdisplay import Display 


class ChromeSession(object): 
    def __enter__(self): 
     self.display = Display(visible=0, size=(1024, 768)) 
     self.display.start() 

     chromedriver = "/usr/lib/chromium/chromedriver" 
     os.environ["websession.chrome.driver"] = chromedriver 

     self.driver = webdriver.Chrome(chromedriver) 
     # Tell the driver to wait (if necessary) in case UI rendering takes a while... 
     self.driver.implicitly_wait(5) 

     return self.driver 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     if exc_type: 
      print exc_type, exc_val 
      print exc_tb 
     self.driver.quit() 
     self.display.stop()