2016-03-01 74 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()