2014-12-28 6 views
6

Ich versuche Selen/Phantomjs mit Scrapy zu verwenden, und ich bin mit Fehlern gespickt. Nehmen wir zum Beispiel den folgenden Codeausschnitt:Scrapy mit Selen, Webdriver nicht instanziieren

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 

Viele der Zeiten der Fahrer sie es (so die driver ist ungebunden, damit die Ausnahme) zu instanziiert gescheitert scheint hat, und ich erhalte die Klappentext (zusammen mit der Druck Botschaft, die ich in setzen)

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

googeln um, so scheint es, jeder schlägt PhantomJS aktualisieren, die ich habe (1.9.8 aus dem Quellcode). Würde jemand wissen, was sonst dieses Problem und eine geeignete Diagnose verursachen könnte?

+0

Welche Version des Selen-Pakets verwenden Sie? – alecxe

+0

@alecxe v2.44.0 von 'pip' – pad

Antwort

6

Der Grund für dieses Verhalten ist, wie der PhantomJS-Treiber Service class implementiert ist.

Es gibt eine __del__ Methode definiert, die self.stop() Methode aufruft:

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

Und self.stop() die Dienstinstanz wird unter der Annahme, noch am Leben ist versucht, es ist Attribut zuzugreifen:

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 

    ... 

exakt das gleiche Problem ist in diesem Beitrag perfekt beschrieben:


Was sollten Sie tun, ist leise AttributeError auftreten zu ignorieren, während die Treiberinstanz beenden:

try: 
    driver.quit() 
except AttributeError: 
    pass 

Das Problem dieses revision eingeführt wurde. Das bedeutet, dass ein Downgrade auf 2.40.0 ebenfalls hilfreich wäre.

+0

danke, ich werde das tun. Irgendwelche Ideen für die Diagnose? Ich habe die Anzahl der gleichzeitigen Anfragen auf 1 geändert, aber es hat nicht geholfen. Meine Vermutung war, dass zu viele Prozesse erzeugt werden, die den Fehler verursachen könnten. – pad

+0

@pad hat 'AttributError' Hilfe gefunden? – alecxe

+0

Entschuldigung, ich werde in einer Stunde darüber berichten können (eine andere Spinne läuft). Obwohl wir diesen Fehler einfach unter den Teppich kehren, richtig :). – pad

2

Ich hatte dieses Problem, weil Phantomjs nicht von Skript verfügbar war (war nicht im Pfad). Sie können dies überprüfen, indem Sie phantomjs in der Konsole ausführen.

+0

Mein Problem war Speicher. Ich habe Service.py einen kleinen Patch gemacht, der diesen Streufehler beseitigt. Vielleicht mache ich eine Pull-Anfrage, wenn ich es mehr untersucht habe. Fortfahren .. – pad

+0

Executable ist kein Problem, weil 'phantomjs' der Standard ist, der von' __init__' verwendet wird und das gleiche auf meinem System. Wir sehen beide den gleichen Fehler, weil wenn "self.stop()" aufgerufen wird, aber kein "self.process" zu beenden ist. In beiden Fällen ist also etwas schiefgelaufen -> Prozess ist nicht definiert, Attributfehler wird ausgegeben. – pad

0

Selen Version 2.44.0 auf pypi muss den folgenden Patch in Service.__init__ von selenium.webdriver.common.phantomjs.service

self.process = None 

ich ein Stück einreichen dachte aber dies ist bereits in der most recent version auf Code Google.