[英]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
设置存储请求指纹
如果你真的想要它,一个解决方案可以覆盖RFPDupeFilter
的request_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.