2014-01-14 4 views
1

Я пытаюсь приостановить работу механизма scrapy (работающего искателя) из промежуточного программного обеспечения.Как использовать self.crawler.engine.pause() от промежуточного программного обеспечения в scrapy

, когда я пытаюсь вызвать self.crawler.engine.unpause() Я получаю эту ошибку:

объекта «cRetry» не имеет атрибута «искателю»

Это мой промежуточное программное обеспечение. Как я могу получить доступ к объекту искателя?

class cRetry(RetryMiddleware): 

    errorCounter = 0 


    def process_response(self, request, response, spider): 
     if response.status in self.retry_http_codes: 
      reason = response_status_message(response.status) 
      return self._retry(request, reason, spider) or response 
     elif "error" in response.body: 
      self.errorCounter = self.errorCounter + 1 
      if self.errorCounter >= 10: 
       self.crawler.engine.pause() 
       os.system("restart.sh") 
       print "Reset" 
       time.sleep(10) 
       self.crawler.engine.unpause() 
       self.errorCounter = 0 
      reason ="Restart Required" 
      return self._retry(request, reason, spider) or response 
     ### end 
     return response 

ответ

1

Из моего понимания, вы можете переопределить __init__ и from_crawler методы напоминают что-то вроде:

class cRetry(RetryMiddleware): 

    errorCounter = 0 

    def __init__(self, crawler): 
     super(cRetry, self).__init__(crawler.settings) 
     self.crawler = crawler 

    @classmethod 
    def from_crawler(cls, crawler): 
     return cls(crawler) 

    def process_response(self, request, response, spider): 
     # ... 

Подпись __init__ на самом деле, кажется, не имеет значения, то entry point for the main library всегда from_crawler(cls, crawler). Это class method и принимает имя класса в качестве первого аргумента (затем используя его для вызова конструктора).

+0

Я переопределяю в своем файле spider.py? Я уже переопределяю init. когда я добавляю параметр искателя, например, я получаю сообщение об ошибке: __init __ (self, crawler, filename = None, domain = ". com"), __init __() принимает не менее 2 аргументов без ключевого слова (1 данный) – Jabb

+0

Вы должны переопределить их в cRetry. [Оригинальные] (https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/downloadermiddleware/retry.py) из RetryMiddleware не передают 'искатель' в' __init__', а только 'искатель. settings'. Таким образом, вам нужно изменить 'from_crawler' для передачи' искателя', а затем настроить вызов '__init__' для вызова родительского конструктора (так как вы не хотите потерять другие настройки и т. Д.) – Aufziehvogel

+0

Я пробовал ваше решение, и теперь оно throws: TypeError: unbound метод from_crawler() должен быть вызван с экземпляром cRetry в качестве первого аргумента (вместо этого был получен экземпляр CrawlerProcess). Я полагаю, что мне нужно изменить from_crawler (cls, ** crawler **). Уже пытался from_crawler (cls, ** self **), поэтому он передает экземпляр cRetry. Но успеха нет. – Jabb

0

Благодаря aufziehvogel :-)

Вы предложение работали с небольшим modifiction. @classmethod нужно добавить, тогда он работает как шарм.

+0

Спасибо, исправил. – Aufziehvogel

+0

есть аналогичный трюк для расширений конвейера? –

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