Scrapy with selenium,webdriver 无法实例化

Posted

技术标签:

【中文标题】Scrapy with selenium,webdriver 无法实例化【英文标题】:Scrapy with selenium, webdriver failing to instantiate 【发布时间】:2015-02-24 18:24:17 【问题描述】:

我正在尝试将 selenium/phantomjs 与 scrapy 一起使用,但我遇到了很多错误。比如下面的代码sn -p:

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 从源代码构建)。有人知道还有什么可能导致这个问题和合适的诊断吗?

【问题讨论】:

你使用的是什么selenium 包版本? @alecxe v2.44.0 来自pip 【参考方案1】:

出现这种行为的原因是 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

    ...

这个帖子完美地描述了同样的问题:

Python attributeError on __del__

您应该做的是在退出驱动程序实例时默默地忽略AttributeError

try:
    driver.quit()
except AttributeError:
    pass

这个问题是由这个revision 引入的。这意味着降级到2.40.0 也会有所帮助。

【讨论】:

谢谢,我会这样做的。对诊断有什么想法吗?我将并发请求的数量更改为 1,但它没有帮助。我的猜测是产生了太多进程,这可能会导致错误。 @pad 抓到AttributeError 有帮助吗? 抱歉,我可以在一小时内报告(另一个蜘蛛正在运行)。虽然这样我们只是在掩盖这个错误,对吧:)。 还将尝试降级解决方案并报告。 我尝试了两种解决方案。正如您所写,捕捉AttributeError 会很好地抑制它的显示。不幸的是,降级到 2.40.0 对错误本身没有帮助。【参考方案2】:

我遇到了这个问题,因为 phantomjs 在脚本中不可用(不在路径中)。 您可以通过在控制台中运行 phantomjs 来检查它。

【讨论】:

我的问题是内存。我对 service.py 做了一个小补丁,它消除了这个杂散错误。当我对它进行更多调查时,也许我会提出拉取请求。续…… 可执行文件不是问题,因为phantomjs__init__ 使用的默认值,在我的系统上也是如此。我们都看到了同样的错误,因为当 self.stop() 被调用但没有 self.process 终止时。因此,在这两种情况下,都出现了问题 -> 未定义进程,抛出属性错误。【参考方案3】:

pypi 上的 Selenium 版本 2.44.0 需要在 Service.__init__selenium.webdriver.common.phantomjs.service 中的以下补丁

self.process = None

我正在考虑提交一个补丁,但这已经存在于谷歌代码上的most recent version 中。

【讨论】:

以上是关于Scrapy with selenium,webdriver 无法实例化的主要内容,如果未能解决你的问题,请参考以下文章

selenium 常用api

Scrapy实战---Scrapy对接selenium爬取京东商城商品数据

将 Selenium 与 Scrapy 集成

爬虫07 /scrapy图片爬取中间件selenium在scrapy中的应用CrawlSpider分布式增量式

scrapy中间件中使用selenium切换ip

Scrapy+selenium爬取简书全站