我在一大組頁面上運行PhantomJS來刮取一些特定的JS生成的內容。我使用Python Selenium綁定,可以很容易地對結果執行XPath查詢。我注意到,如果我嘗試實例化一個webdriver.PhantomJS
對象並用它執行整個任務(通過「重複使用」它可以這麼說),我的腳本很快變得不穩定,伴隨着零星的內存和連接問題。我的下一個嘗試是嘗試爲每個渲染調用實例化一個新的驅動程序(並在完成時調用quit()
),這也適用於多個請求。我最後的嘗試是使用subprocess
將渲染調用隔離在其自己的進程空間中。但即使這種技術是迄今爲止最穩定的技術,但我仍然需要將我的整個腳本包裝在supervisor
中,以處理偶爾的打嗝。我真的很想知道我是否可能做錯了什麼,或者如果有什麼我應該知道的。據我所知,PhantomJS(和其他自動化瀏覽器)並不是真正意義上的本質(更多用於測試),但是有沒有辦法使其工作在非常穩定的狀態?PhantomJS在呈現多個頁面時的穩定性
0
A
回答
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()
相關問題
- 1. phantomjs不呈現頁面
- 2. PhantomJS無效頁面呈現
- 3. PhantomJS呈現的截圖比實際頁面高很多
- 4. PhantomJs無法呈現源文件中的特定頁面
- 5. 用phantomjs呈現javascript網頁頁
- 6. 頁面呈現需要更多時間
- 7. 使PhantomJS等待整個頁面加載之前呈現爲PDF
- 8. 使用PhantomJS將多個網頁呈現爲pdf
- 9. Phantomjs呈現在Azure網站
- 10. PhantomJS不會呈現整頁內容
- 11. Rails的搜索功能呈現頁面多個時間
- 12. PhantomJs在加載一個頁面時使用多個TCP連接
- 13. Django同時呈現多個屬性?
- 14. 在頁面呈現時顯示Ajax Loader
- 15. 如何實現瀏覽頁面時穩定的導航欄?
- 16. Grails使用特定佈局和多個頁面呈現PDF?
- 17. 頁面呈現期間出現異常時的錯誤頁面
- 18. 用Phantomjs/Pjscrape刮多個頁面
- 19. NReco PhantomJs多於5個PDF頁面
- 20. 頁面中呈現XML屬性值
- 21. ASP.NET MVC頁面呈現性能問題
- 22. Anychart使用Flash在一個頁面中呈現多個圖表
- 23. NodeJs - 在多個SELECT查詢後呈現相同的頁面
- 24. 頁面呈現後的日誌時間
- 25. 呈現父頁面中的子頁面
- 26. Phantomjs呈現XML + XSL嗎?
- 27. PhantomJS:抓取多個URL時的空白頁面
- 28. ExtJS Grid呈現比頁面中指定的更多的行
- 29. 如何在ReportLab platypus中使用BaseDocTemplate呈現多個頁面?
- 30. Rails - 僅在顯示特定頁面時呈現部分