2015-09-10 13 views
6

Dies ist standardmäßig Dupefilter Klassenmethode des scrapy request_seenScrapy - Retrieve Spinne Objekt in 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) 

Während eine benutzerdefinierte dupefilter implementieren. Ich kann nicht das spider Objekt aus dieser Klasse im Gegensatz zu anderen scrapy Middleware

abrufen Gibt es eine Möglichkeit, ich kann wissen, welche spider Objekt das ist? so kann ich es über eine Spinne auf Spinnenbasis anpassen?

Auch ich kann nicht nur eine Middleware implementieren, die URLs liest und in eine Liste einträgt & prüft Duplikate anstelle eines benutzerdefinierten Dupefilters. Das ist, weil ich pausieren müssen/resume kriecht und scrapy muß die Anforderung Fingerabdruck standardmäßig zu speichern, mit dem JOBDIR

Einstellung

Antwort

2

Wenn Sie wirklich wollen, dass kann eine Lösung, die die request_seen Methode Unterzeichnung der RFPDupeFilter außer Kraft zu setzen, so dass es erhält 2 Argumente (self, request, spider); als Sie müssen auch die scrapy Scheuler'senqueue_request Methode überschreiben, weil request_seen innen genannt wird.

# /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 

und stellen Sie sich ihre Wege in settings.py -

# /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 

:

# /settings.py 

DUPEFILTER_CLASS = 'myproject.dupefilters.MyRFPDupeFilter' 
SCHEDULER = 'myproject.scheduler.MyScheduler' 
Sie können neue Scheduler und neue dupefilter wie diese Creat
Verwandte Themen