我目前有一个包含很多蜘蛛的项目,其中大约一半需要一些自定义规则来过滤重复请求。这就是我为每个需要它的蜘蛛扩展RFPDupeFilter类和自定义规则的原因。
我的自定义欺骗过滤器检查请求网址是否来自需要自定义过滤的网站并清除网址(删除查询参数,缩短路径,提取唯一部分等),以便所有相同的指纹都相同页面。到目前为止一直很好,但是目前我有一个函数,大约有60个if / elif语句,每个请求都会通过。这不仅不是最理想的,而且也难以维持。
所以这就是问题所在。有没有办法创建过滤规则,“清理”蜘蛛内的网址?对我来说理想的方法是扩展Spider类并定义一个clean_url方法,该方法默认只返回请求url,并在需要自定义的蜘蛛中覆盖它。我调查了它,但是我似乎找不到从dupe过滤器类访问当前蜘蛛方法的方法。
任何帮助都将受到高度赞赏!
答案 0 :(得分:4)
您可以实现下载中间件。
middleware.py
class CleanUrl(object):
seen_urls = {}
def process_request(self, request, spider):
url = spider.clean_url(request.url)
if url in self.seen_urls:
raise IgnoreRequest()
else:
self.seen_urls.add(url)
return request.replace(url=url)
settings.py
DOWNLOADER_MIDDLEWARES = {'PROJECT_NAME_HERE.middleware.CleanUrl: 500}
# if you want to make sure this is the last middleware to execute increase the 500 to 1000
如果你这样做的话,你可能想要一起禁用dupefilter。