Scrapy - Spider crawlt doppelte URLs

Ich durchsuche eine Suchergebnisseite und entferne Titel- und Linkinformationen von derselben Seite. Als Suchseite habe ich auch die Links zu den nächsten Seiten, die ich im SgmlLinkExtractor angegeben habe.

Die Beschreibung des Problems lautet: Auf der ersten Seite habe ich die Links von Seite2 und Seite3 zum Crawlen gefunden und es funktioniert perfekt. Wenn es jedoch die zweite Seite crawlt, enthält es erneut Links zu Seite 1 (vorherige Seite) und Seite 3 (nächste Seite). SO crawlt es erneut Page1 mit dem Verweis als Page2 und seiner Going-In-Schleife.

Die Scrapy-Version, die ich verwende, ist 0.17.

Ich habe im Internet nach Antworten gesucht und Folgendes versucht: 1)

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

Der eindeutige Befehl wurde jedoch nicht als gültiger Parameter identifiziert.

2) Ich habe versucht, den Standardfilter in den Einstellungen als DUPEFILTER_CLASS = RFPDupeFilter anzugeben

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

3) Ich habe auch versucht, einen benutzerdefinierten Filter zu haben, den ich im Web gefunden habe, verstehe aber nicht viel davon. Der Code lautet wie folgt. Die Besuchs-ID und der Status werden erfasst, die bereits gecrawlten Seiten werden jedoch nicht identifiziert.

Hinweis: Das Snippet wurde aus dem Web kopiert und ich habe nicht viele Details dazu.

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)

Meine Absicht ist es, dass die Spinne selbst die bereits gecrawlten Webseiten ignoriert, anstatt die gecrawlten Seiten in einer Liste zu haben und jedes Mal zuzuordnen, wenn eine Seite mit der Liste gecrawlt wird oder nicht.

Irgendwelche Gedanken dazu bitte.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage