Scrapy – Spider rastrea URL duplicadas

Estoy rastreando una página de resultados de búsqueda y recojo el título y la información del enlace desde la misma página. Como es una página de búsqueda, también tengo los enlaces a las páginas siguientes, que he especificado en el SgmlLinkExtractor para permitir.

La descripción del problema es: En la primera página, he encontrado los enlaces de Page2 y Page3 para rastrear y funciona perfectamente. Pero cuando se rastrea la 2ª página, nuevamente tiene enlaces a la página 1 (página anterior) y a la página 3 (página siguiente). Por lo tanto, de nuevo rastrea Page1 con referencia como Page2 y su bucle de entrada.

La versión scrapy, que uso es 0.17.

Busqué respuestas en la web y probé lo siguiente: 1)

Rule(SgmlLinkExtractor(allow=("ref=sr_pg_*")), callback="parse_items_1", unique= True, follow= True), 

Pero el comando único no fue identificado como un parámetro válido.

2) He intentado especificar el filtro predeterminado en la configuración como DUPEFILTER_CLASS = RFPDupeFilter

  DUPEFILTER_CLASS = RFPDupeFilter NameError: name 'RFPDupeFilter' is not defined 

3) También intenté tener un filtro personalizado, que encontré el fragmento en la web, pero no entiendo mucho de él. El código es el siguiente. La identificación y el estado de la visita se capturan, pero no identifica las páginas ya rastreadas.

Nota: el fragmento se copia de la web y no tengo muchos detalles de esto,

 from scrapy import log from scrapy.http import Request from scrapy.item import BaseItem from scrapy.utils.request import request_fingerprint from Amaze.items import AmazeItem class IgnoreVisitedItems(object): FILTER_VISITED = 'filter_visited' VISITED_ID = 'visited_id' CONTEXT_KEY = 'visited_ids' def process_spider_output(self, response, result, spider): context = getattr(spider, 'context', {}) visited_ids = context.setdefault(self.CONTEXT_KEY, {}) ret = [] for x in result: visited = False if isinstance(x, Request): if self.FILTER_VISITED in x.meta: visit_id = self._visited_id(x) if visit_id in visited_ids: log.msg("Ignoring already visited: %s" % x.url, level=log.INFO, spider=spider) visited = True elif isinstance(x, BaseItem): visit_id = self._visited_id(response.request) if visit_id: visited_ids[visit_id] = True x['visit_id'] = visit_id x['visit_status'] = 'new' if visited: ret.append(MyItem(visit_id=visit_id, visit_status='old')) else: ret.append(x) return ret def _visited_id(self, request): return request.meta.get(self.VISITED_ID) or request_fingerprint(request) 

Mi intención es hacer que la araña en sí ignore las páginas web ya rastreadas, en lugar de tener las páginas rastreadas en una lista y hacer coincidir cada vez que una página esté tergiversada o no con la lista.

Cualquier pensamiento sobre esto por favor.

No se le da un ejemplo de código de su Spider, pero, posiblemente, pase el argumento dont_filter = True , cuando llame al método de Request . Intente especificar explícitamente la Request(dont_filter=False) Esto le indica a Spider que no debe repetir solicitudes idénticas.