Scrapy с селеном, webdriver не удается создать экземпляр
Я пытаюсь использовать selenium / phantomjs с scrapy, и я пронизан ошибками. Например, возьмите следующий фрагмент кода:
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
не привязан, следовательно, исключение), и я получаю blurb (вместе с сообщением печати, которое я вставил)
Exception AttributeError: "'Service' object has no attribute 'process'" in <bound method Service.__del__ of <selenium.webdriver.phantomjs.service.Service object at 0x7fbb28dc17d0>> ignored
Googling вокруг, кажется, все предлагают обновить phantomjs, который у меня есть (1.9.8
построены из источника). Кто знает что еще может быть причиной этой проблемы и подходящего диагноза?
3 ответов
причиной такого поведения является то, как драйвер PhantomJS Service
класс есть.
есть __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
проблема была введена этим редакция. Это означает, что понижение до 2.40.0
также может помочь.
У меня была эта проблема, потому что phantomjs был недоступен из скрипта (не был в пути). Вы можете проверить это, запустив phantomjs в консоли.
Selenium версии 2.44.0 на pypi нуждается в следующем патче в Service.__init__
of selenium.webdriver.common.phantomjs.service
self.process = None
Я думал о представлении патча, но это уже существует в самая последняя версия на код google.