Scrapy - 在dupefilter中检索蜘蛛对象

wol*_*ang 6 python scrapy

这是scrapy的默认Dupefilter类方法request_seen

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)
Run Code Online (Sandbox Code Playgroud)

在实施定制的dupefilter时.spider与其他scrapy中间件不同,我无法从此类中检索对象

有什么方法我可以知道spider这是哪个对象?所以我可以通过蜘蛛蜘蛛自定义它?

此外,我不能只实现一个中间件,它读取URL并将其放入列表并检查重复项而不是自定义dupefilter.这是因为我需要暂停/恢复抓取并且需要scrapy来默认使用JOBDIR设置来存储请求指纹

ser*_*iuz 5

如果您确实想要这样做,解决方案可以是覆盖request_seen的方法签名RFPDupeFilter,以便它接收 2 个参数(self, request, spider);您还需要覆盖 scrapyScheuler's enqueue_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
Run Code Online (Sandbox Code Playgroud)

-

# /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
Run Code Online (Sandbox Code Playgroud)

并在settings.py中设置它们的路径:

# /settings.py

DUPEFILTER_CLASS = 'myproject.dupefilters.MyRFPDupeFilter'
SCHEDULER = 'myproject.scheduler.MyScheduler' 
Run Code Online (Sandbox Code Playgroud)