我目前有一个有相当多蜘蛛的项目,其中大约一半需要一些自定义规则来过滤重复的请求。这就是为什么我对RFPDupeFilter类进行了扩展,为每个需要它的蜘蛛提供了自定义规则。
我的自定义dupe过滤器检查请求url是否来自需要自定义筛选的站点,并清除url (删除查询参数、缩短路径、提取唯一部分等),以便所有相同页面的指纹相同。到目前为止,我有一个函数,它有大约60条if/elif语句,每个请求都要通过。这不仅是次优,而且也很难维护。
那么问题来了。有没有一种方法可以创建过滤规则,即“清除”蜘蛛内部的urls?对我来说,理想的方法是扩展Spider类并定义一个clean_url方法,默认情况下它只返回请求url,并在需要自定义的蜘蛛中重写它。我研究了它,但是我似乎找不到从dupe filter类访问当前蜘蛛方法的方法。
任何帮助都将不胜感激!
发布于 2014-08-07 20:33:04
您可以实现一个下载中间件。
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。
https://stackoverflow.com/questions/25186265
复制相似问题