2016-03-01 2 views
0

Я запускаю PhantomJS на большом наборе страниц, чтобы очистить определенный контент, созданный JS. Я использую привязки Pelon Selenium, с которыми легко выполнять запросы XPath по результатам. Я заметил, что если я попытаюсь создать экземпляр одного объекта webdriver.PhantomJS и выполнить всю работу с ним (путем повторного использования его так сказать), мой скрипт скоро станет нестабильным, со спорадической памятью и проблемами с подключением. Моя следующая попытка состояла в том, чтобы попытаться создать новый драйвер для каждого вызова рендеринга (и, позвонив по нему quit(), когда это будет сделано), что также не работает для нескольких запросов. Моя последняя попытка состояла в том, чтобы использовать subprocess, чтобы изолировать вызов рендеринга в своем собственном пространстве процесса. Но даже с этой техникой, которая является самой стабильной на сегодняшний день, мне все равно нужно обернуть весь мой скрипт в supervisor, чтобы обрабатывать случайные икоты. Мне действительно интересно, могу ли я что-то делать неправильно, или если что-то мне нужно знать. Я понимаю, что PhantomJS (и другие автоматизированные браузеры) на самом деле не предназначены для самоскребения (больше для тестирования), но есть ли способ заставить его работать с большой стабильностью?Устойчивость PhantomJS при рендеринге нескольких страниц

ответ

1

Я использую Selenium с pyvirtualdisplay с обычным браузером аналогично этому: Python - Headless Selenium WebDriver Tests using PyVirtualDisplay (хотя я использую Chrome, просто вопрос другого драйвера).

Гораздо более стабильный, чем мой опыт работы с PhantomJS как с узла, так и с Python. По-прежнему вы, вероятно, захотите использовать диспетчер процессов на всякий случай, но этот способ был гораздо менее подвержен ошибкам для меня.

Кроме того, я предлагаю написать небольшой класс оболочки 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()