2015-08-12 3 views
0

У меня есть паук, где я должен использовать Selenium для очистки динамических данных на странице. Вот как это выглядит:Как бросить водитель селена при закрытии паука

class MySpider(
    name = 'myspider' 
    start_urls = ['http://example.org'] 

    def __init__(self, *args, **kwargs): 
     super(, self).__init__(*args, **kwargs) 
     self.driver = webdriver.Firefox() 
     self.driver.implicitly_wait(5) 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 

    def spider_closed(self, spider): 
     if self.driver: 
      self.driver.quit() 
      self.driver = None 

Проблема здесь заключается в том, что, когда я отменить работу в Scrapyd он не остановится, пока я вручную закрыть окно. Я, очевидно, не смогу этого сделать, когда я развожу паук на реальный сервер.

Вот что я вижу в Scrapyd регистрирует каждый раз, когда я ударил «Отменить»:

2015-08-12 13:48:13+0300 [HTTPChannel,208,127.0.0.1] Unhandled Error 
    Traceback (most recent call last): 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/twisted/web/http.py", line 1731, in allContentReceived 
     req.requestReceived(command, path, version) 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/twisted/web/http.py", line 827, in requestReceived 
     self.process() 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/twisted/web/server.py", line 189, in process 
     self.render(resrc) 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/twisted/web/server.py", line 238, in render 
     body = resrc.render(self) 
    --- <exception caught here> --- 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/scrapyd/webservice.py", line 18, in render 
     return JsonResource.render(self, txrequest) 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/scrapy/utils/txweb.py", line 10, in render 
     r = resource.Resource.render(self, txrequest) 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/twisted/web/resource.py", line 250, in render 
     return m(request) 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/scrapyd/webservice.py", line 55, in render_POST 
     s.transport.signalProcess(signal) 
     File "/home/dmitry/.virtualenvs/myproject/local/lib/python2.7/site-packages/twisted/internet/process.py", line 339, in signalProcess 
     raise ProcessExitedAlready() 
    twisted.internet.error.ProcessExitedAlready: 

Но работа по-прежнему в списке заданий и он отмечен как «Запуск». Итак, как я могу отключить драйвер?

+0

Вы можете быть лучше использовать паука межплатформенное здесь. http://stackoverflow.com/a/24460462/2368836 – rocktheartsm4l

ответ

0

Импорт SignalManager:

from scrapy.signalmanager import SignalManager 

Затем замените:

dispatcher.connect(self.spider_closed, signals.spider_closed) 

С:

SignalManager(dispatcher.Any).connect(self.spider_closed, signal=signals.spider_closed) 
+0

Я уже пробовал, что результат тот же –

0

Вы пробовали реализации from_crawler на паука? Я сделал только это на трубопроводах, а также расширения, но он должен работать одинаково для пауков ..

@classmethod 
def from_crawler(cls, crawler, *args, **kwargs): 
    o = cls(*args, **kwargs) 
    crawler.signals.connect(o.spider_closed, signal=signals.spider_closed) 
    return o 

http://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.spiders.Spider.from_crawler

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