繁体   English   中英

Scrapy - 在dupefilter中检索蜘蛛对象

[英]Scrapy - Retrieve spider object in dupefilter

这是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)

在实施定制的dupefilter时。 我不能从这个类中检索spider对象,这与其他scrapy中间件不同

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

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

如果你真的想要它,一个解决方案可以覆盖RFPDupeFilterrequest_seen方法签名,这样它就会收到2个参数(self, request, spider) ; 还需要覆盖scrapy Scheuler'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

-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM