scrapy爬虫在第一个重复项处停止

3 投票
3 回答
2137 浏览
提问于 2025-04-17 20:40

我正在使用 scrapy 0.20 和 python 2.7。

我想避免重复的项目。

我不想在命令行中使用 JOBDIR 这个参数。相反,我是在我的脚本中这样做的:

settings.overrides['JOBDIR']= 'my customer jobdir'

然后我在我的设置中这样做:

DUPEFILTER_CLASS = 'MyProject.CustomFilter.CustomFilter'

CustomFilter 中,我使用了这个:

def request_seen(self, request):
        fp = self.__getid(request.url)
        if (fp is not None) and (fp in self.fingerprints):
            return True
        elif fp is not None:
            self.fingerprints.add(fp)
            if self.file:
                self.file.write(fp + os.linesep)
        else:
            return False 

其中 __getid 是我用的一个辅助函数。

我的问题

当爬虫遇到第一个重复的项目时,它就停止工作了。

我在命令行中看到这个信息:

2014-03-03 10:43:44-0800 [GeneralSpider] DEBUG: Filtered duplicate request: <GET
 http://www.justproperty.com/apartments/old-town/1057362-most-affordable-2-b-r-i
n-old-town-for-sale.html> - no more duplicates will be shown (see DUPEFILTER_CLA
SS)

3 个回答

0

我觉得你应该检查一下爬虫中的物品返回逻辑。我之前也遇到过同样的问题。

1

在settings.py文件中把DUPEFILTER_DEBUG设置为True。

这样,调度器中的重复过滤器会在一次爬虫运行中过滤掉所有已经访问过的链接(这意味着在后续的运行中会重置)。

如果你想继续爬取,忽略重复的链接,可以使用IgnoreVistedItems这个中间件。它会在不同的运行之间保持状态,避免访问过去见过的链接,但只针对最终的项目链接,这样网站的其他部分可以重新爬取(以便找到新的项目)。

希望这对某些人有帮助。

1

你可以在你的请求中使用参数 dont_filter=True。这样做会告诉 Scrapy 不要忽略重复的请求。具体的说明可以在这里找到。

撰写回答