渲染多个页面时的PhantomJS稳定性

时间:2016-03-01 02:32:38

标签: python selenium phantomjs stability

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

1 个答案:

答案 0 :(得分:1)

我将Selenium与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()