我想覆盖Scrapy的默认RFPDupefilter课程,如下所示:
from scrapy.dupefilters import RFPDupeFilter
class URLDupefilter(RFPDupeFilter):
def request_fingerprint(self, request):
if not request.url.endswith('.xml'):
return request.url
理由是,我想让requests.seen
'人类可读的'通过使用已删除的URL(足够唯一)而不是哈希。但是,我想省略以.xml
结尾的网址(对应于网站地图网页)。
如果请求网址以request_fingerprint
结尾,则None
方法会返回.xml
。这是dupefilter的有效实现吗?
答案 0 :(得分:1)
如果你研究request_seen()
类的DupeFilter
方法,你可以看到scrapy如何比较指纹:
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)
fp in self.fingerprints
,在您的情况下,这将解析为None in {None}
,因为您的指纹为None
且self.fingerprints
为set
类型对象。这是有效的python并正确解析
所以,是的,你可以返回None
。
修改:但是,这会让第一个xml
响应通过,因为fingerprints
集合中还没有None
指纹。理想情况下,您希望在dupefilter中修复request_seen
方法,如果指纹为False
,则只需返回None
。