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.