2015-09-10 17 views
6

Questo è di Scrapy predefinita Dupefilter metodo di classe request_seenScrapy - Recupera oggetto ragno nel dupefilter

class RFPDupeFilter(BaseDupeFilter): 

    def request_seen(self, request): 
     fp = self.request_fingerprint(request) 
     if fp in self.fingerprints: 
      return True 
     self.fingerprints.add(fp) 
     if self.file: 
      self.file.write(fp + os.linesep) 

Mentre l'attuazione di un dupefilter personalizzato. non riesco a recuperare l'oggetto spider da questa classe a differenza di altri middleware scrapy

Esiste un modo per sapere quale oggetto è spider? quindi posso personalizzarlo tramite un ragno su base spider?

Inoltre, non posso semplicemente implementare un middleware che legge gli URL e lo inserisce in un elenco & controlla i duplicati anziché un dupifilter personalizzato. Questo perché ho bisogno di mettere in pausa/riprendere la striscia e la necessità Scrapy per memorizzare la richiesta di impronte digitali di default utilizzando il JOBDIR impostazione

risposta

2

Se davvero si vuole che, una soluzione può essere quella di ignorare la firma request_seen metodo della RFPDupeFilter, in modo che riceve 2 argomenti (self, request, spider); di quello che è necessario ignorare anche il metodo di scraping Scheuler'senqueue_request perché request_seen viene chiamato all'interno. È possibile creat nuovo scheduler e nuova dupefilter in questo modo:

# /scheduler.py 

from scrapy.core.scheduler import Scheduler 


class MyScheduler(Scheduler): 

    def enqueue_request(self, request): 
     if not request.dont_filter and self.df.request_seen(request, self.spider): 
      self.df.log(request, self.spider) 
      return False 
     dqok = self._dqpush(request) 
     if dqok: 
      self.stats.inc_value('scheduler/enqueued/disk', spider=self.spider) 
     else: 
      self._mqpush(request) 
      self.stats.inc_value('scheduler/enqueued/memory', spider=self.spider) 
     self.stats.inc_value('scheduler/enqueued', spider=self.spider) 
     return True 

-

# /dupefilters.py 

from scrapy.dupefilters import RFPDupeFilter 


class MyRFPDupeFilter(RFPDupeFilter): 

    def request_seen(self, request, spider): 
     fp = self.request_fingerprint(request) 
     if fp in self.fingerprints: 
      return True 
     self.fingerprints.add(fp) 
     if self.file: 
      self.file.write(fp + os.linesep) 

     # Do things with spider 

e impostare i loro percorsi in settings.py:

# /settings.py 

DUPEFILTER_CLASS = 'myproject.dupefilters.MyRFPDupeFilter' 
SCHEDULER = 'myproject.scheduler.MyScheduler' 
Problemi correlati