tutorial spiders spider sitemapspider create python scrapy web-crawler

python - spiders - Scrapy-Spider rastrea URL duplicadas



show scrapy version (1)

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

Estoy rastreando una página de resultados de búsqueda y raspado de título e información de enlace de la misma página. Como es una página de búsqueda, también tengo 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 Página2 y Página3 para rastrear y funciona perfectamente. Pero cuando se rastrea la segunda página, nuevamente tiene enlaces a Página1 (página anterior) y Página3 (página siguiente). ASÍ rastrea de nuevo Page1 con referencia como Página2 y entra en ciclo.

La versión de scrapy, que uso es 0.17.

He buscado en la web las respuestas y he intentado lo siguiente, 1)

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

Pero el comando único no se identificó 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 he intentado tener un filtro personalizado, que encontré el fragmento en la web, pero no entiendo mucho de él. El código es el siguiente. Se captura el ID y el estado de la visita, pero no identifica las páginas ya rastreadas.

Nota: el fragmento está copiado 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 coincidir cada vez que una página está dividida o no con la lista.

Cualquier idea sobre esto, por favor.