这是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设置来存储请求指纹
如果您确实想要这样做,解决方案可以是覆盖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)
| 归档时间: |
|
| 查看次数: |
867 次 |
| 最近记录: |