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