2015-09-10 10 views
6

में मकड़ी वस्तु पुनः प्राप्त यह scrapy के डिफ़ॉल्ट Dupefilter वर्ग विधि request_seenScrapy - 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) 

एक कस्टम dupefilter को लागू करते समय है। मैं अन्य स्केपर मिडलवेयर

के विपरीत इस वर्ग से spider ऑब्जेक्ट को पुनर्प्राप्त नहीं कर सकता है क्या कोई तरीका है कि मैं जान सकता हूं कि spider ऑब्जेक्ट यह है? तो मैं स्पाइडर आधार पर एक मकड़ी के माध्यम से इसे अनुकूलित कर सकते हैं?

इसके अलावा मैं केवल एक मिडलवेयर को लागू नहीं कर सकता जो यूआरएल पढ़ता है और इसे एक सूची में रखता है & एक कस्टम डुप्लिटर के बजाय डुप्लिकेट की जांच करता है। इसका कारण यह है मैं रुकना चाहते हैं/फिर से शुरू क्रॉल और JOBDIR

उत्तर

2

की स्थापना का उपयोग कर डिफ़ॉल्ट रूप से अनुरोध फिंगरप्रिंट स्टोर करने के लिए scrapy की जरूरत है क्या तुम सच में लगता है कि, एक समाधान, RFPDupeFilter की request_seen विधि हस्ताक्षर ओवरराइड करने के लिए इतना है कि हो सकता है चाहते हैं यह 2 तर्क (self, request, spider) प्राप्त करता है; आपको स्प्रैयर Scheuler'senqueue_request विधि को ओवरराइड करने की आवश्यकता है क्योंकि request_seen अंदर कॉल किया जाता है। आप इस तरह नया अनुसूचक और नए dupefilter मूल्य बना सकते हैं:

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

और settings.py में उनके रास्ते सेट:

# /settings.py 

DUPEFILTER_CLASS = 'myproject.dupefilters.MyRFPDupeFilter' 
SCHEDULER = 'myproject.scheduler.MyScheduler' 
संबंधित मुद्दे