Scrapy的request_fingerprint方法是否可以返回None?

时间:2017-06-05 14:12:56

标签: python scrapy

我想覆盖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的有效实现吗?

1 个答案:

答案 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},因为您的指纹为Noneself.fingerprintsset类型对象。这是有效的python并正确解析 所以,是的,你可以返回None

修改:但是,这会让第一个xml响应通过,因为fingerprints集合中还没有None指纹。理想情况下,您希望在dupefilter中修复request_seen方法,如果指纹为False,则只需返回None