2015-09-10 10 views
6

To scrapy domyślnego Dupefilter klasa metoda request_seenScrapy - Pobieranie obiektu pająk w 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) 

Realizując własny dupefilter. Nie mogę pobrać obiektu z tej klasy, w przeciwieństwie do innego oprogramowania pośredniczącego do scrapy. Czy jest jakiś sposób, aby się dowiedzieć, który to obiekt jest ? więc mogę go spersonalizować za pomocą pająka na pająku?

Nie mogę również zaimplementować oprogramowania pośredniego, które odczytuje adresy URL i umieszcza je na liście, sprawdzając duplikaty zamiast niestandardowego filtru dwustronnego. To dlatego, że muszę wstrzymać/wznowić indeksuje i potrzebują scrapy przechowywać żądania odcisk domyślnie używając JOBDIR ustawienie

Odpowiedz

2

Jeśli naprawdę chcesz, że rozwiązaniem może być zastąpić podpis request_seen Sposób RFPDupeFilter, tak że otrzymuje 2 argumenty: (self, request, spider); niż trzeba zastąpić również metodę scrapy Scheuler'senqueue_request, ponieważ jest ona wywoływana w środku. Możesz creat nowy scheduler i nowy dupefilter tak:

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

i ustawić swoje ścieżki w settings.py:

# /settings.py 

DUPEFILTER_CLASS = 'myproject.dupefilters.MyRFPDupeFilter' 
SCHEDULER = 'myproject.scheduler.MyScheduler' 
Powiązane problemy