我正在尝试使用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
谷歌搜索,似乎每个人都建议更新phantomjs,我有(1.9.8
从源代码建立)。有谁知道还有什么可能导致这个问题和适当的诊断?
答案 0 :(得分:6)
此行为的原因是PhantomJS驱动程序Service
class的实现方式。
定义了__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
也会有所帮助。
答案 1 :(得分:2)
我遇到了这个问题,因为脚本中没有phantomjs(不在路径中)。 您可以通过在控制台中运行phantomj来检查它。
答案 2 :(得分:0)
pypi上的Selenium版本2.44.0需要Service.__init__
selenium.webdriver.common.phantomjs.service
中的以下补丁
self.process = None
我在考虑提交补丁,但这已存在于Google代码的most recent version中。