如何在Spider中访问`request_seen()`?

时间:2018-04-20 15:56:42

标签: scrapy scrapy-spider

我有蜘蛛,我有一种情况,我想检查我要安排的请求是否已经存在于request_seen()中?

我不希望任何方法检查下载/蜘蛛中间件,我只想检查我的蜘蛛内部。

有没有办法调用该方法?

2 个答案:

答案 0 :(得分:2)

您应该能够像蜘蛛一样从蜘蛛中访问欺骗过滤器:

self.dupefilter = self.crawler.engine.slot.scheduler.df

然后您可以在其他地方使用它来检查:

req = scrapy.Request('whatever')
if self.dupefilter.request_seen(req):
    # it's already been seen
    pass
else:
    # never saw this one coming
    pass

答案 1 :(得分:0)

我用管道做了类似你的事情。以下命令是我使用的代码。

您应该指定一个标识符,然后使用它来检查它是否被查看。

class SeenPipeline(object):
    def __init__(self):
        self.isbns_seen = set()
    def process_item(self, item, spider):
        if item['isbn'] in self.isbns_seen:
            raise DropItem("Duplicate item found : %s" %item)
        else:
            self.isbns_seen.add(item['isbn'])
            return item

注意:您也可以在蜘蛛中使用这些代码