如何基于scrapy中的URL过滤重复的请求

我正在为CrawlSpider使用scrapy为网站编写爬虫。

Scrapy提供了一个内置的重复请求过滤器,该过滤器根据URL过滤重复请求。另外,我可以使用CrawlSpider的规则成员过滤请求。

我想要做的是过滤请求,例如:

http:://www.abc.com/p/xyz.html?id=1234&refer=5678

如果我已经去过

http:://www.abc.com/p/xyz.html?id=1234&refer=4567

注意: refer是一个不会影响我得到的响应的参数,所以我不在乎该参数的值是否发生变化。

现在,如果我有一个集合所有ID的集合,则可以在我的回调函数parse_item(这是我的回调函数)中忽略它来实现此功能。

但这意味着我不需要时至少仍要获取该页面。

那么,我可以告诉scrapy不应基于url发送特定请求的方式是什么?

回答:

你可以编写用于重复删除的自定义中间件并将其添加到设置中

import os

from scrapy.dupefilter import RFPDupeFilter

class CustomFilter(RFPDupeFilter):

"""A dupe filter that considers specific ids in the url"""

def __getid(self, url):

mm = url.split("&refer")[0] #or something like that

return mm

def request_seen(self, request):

fp = self.__getid(request.url)

if fp in self.fingerprints:

return True

self.fingerprints.add(fp)

if self.file:

self.file.write(fp + os.linesep)

然后,你需要在settings.py中设置正确的DUPFILTER_CLASS

DUPEFILTER_CLASS = 'scraper.duplicate_filter.CustomFilter'

在那之后它应该工作

以上是 如何基于scrapy中的URL过滤重复的请求 的全部内容, 来源链接: utcz.com/qa/434598.html

回到顶部