2014-12-28 2 views
6

Я пытаюсь использовать selenium/phantomjs с помощью scrapy, и я пронизан ошибками. Возьмем, например, следующий фрагмент кода:Scrapy with selenium, webdriver не удалось создать экземпляр

def parse(self, resposne): 

    while True: 
     try: 
      driver = webdriver.PhantomJS() 
      # do some stuff 
      driver.quit() 
      break 
     except (WebDriverException, TimeoutException): 
      try: 
       driver.quit() 
      except UnboundLocalError: 
       print "Driver failed to instantiate" 
      time.sleep(3) 
      continue 

Много раз водитель, кажется, ему не удалось создать экземпляр (так driver является несвязанным, следовательно, исключение), и я получаю аннотацию (наряду с печать сообщение я вставил)

Exception AttributeError: "'Service' object has no attribute 'process'" in <bound method Service.__del__ of <selenium.webdriver.phantomjs.service.Service object at 0x7fbb28dc17d0>> ignored 

погуглить вокруг, кажется, все предполагает обновление phantomjs, которые у меня есть (1.9.8 построенные из источника). Кто-нибудь знает, что еще может вызвать эту проблему и подходящий диагноз?

+0

Какую версию пакета 'selenium' вы используете? – alecxe

+0

@alecxe v2.44.0 от 'pip' – pad

ответ

6

Причина такого поведения заключается в том, как реализован драйвер Service class драйвера PhantomJS.

Существует __del__ метода определил, что вызывает self.stop() метода:

def __del__(self): 
    # subprocess.Popen doesn't send signal on __del__; 
    # we have to try to stop the launched process. 
    self.stop() 

И self.stop() берет на себя экземпляр службы еще жив пытаемся получить доступ к его атрибуты:

def stop(self): 
    """ 
    Cleans up the process 
    """ 
    if self._log: 
     self._log.close() 
     self._log = None 
    #If its dead dont worry 
    if self.process is None: 
     return 

    ... 

точно такая же проблема идеально подходит для этой резьбы:


Что вы должны сделать, это молча игнорировать AttributeError происходит во время выхода из экземпляра драйвера:

try: 
    driver.quit() 
except AttributeError: 
    pass 

Проблема была введена этим revision. Это означает, что понижение до 2.40.0 также поможет.

+0

спасибо, я сделаю это. Любые идеи для диагноза? Я изменил количество одновременных запросов на 1, но это не помогло. Я предполагаю, что слишком много процессов порождаются, что может вызвать ошибку. – pad

+0

@pad действительно ловил 'AttributeError' помощь? – alecxe

+0

Извините, я смогу сообщить об этом через час (другой паук работает). Хотя таким образом мы просто подметаем эту ошибку под ковер, правильно :). – pad

2

У меня была эта проблема, потому что phantomjs не был доступен из скрипта (не был в пути). Вы можете проверить это, запустив phantomjs в консоли.

+0

Моя проблема была память. Я сделал небольшой патч для service.py, который избавляется от этой случайной ошибки. Возможно, я сделаю запрос на растяжение, когда я его больше изучил. Contd .. – pad

+0

Исполняемый файл не является проблемой, потому что 'phantomjs' по умолчанию используется' __init__' и его то же самое в моей системе. Мы оба видим ту же ошибку, потому что, когда вызывается 'self.stop()', но нет 'self.process' для завершения. Таким образом, в обоих случаях что-то пошло не так - процесс не определен, вызывается ошибка атрибута. – pad

0

Селен версия 2.44.0 на PyPI необходим следующий патч в Service.__init__ из selenium.webdriver.common.phantomjs.service

self.process = None 

Я думал о представлении патч, но это уже существует в most recent version на Google Code.

Смежные вопросы