Ich möchte verhindern, dass Scrapy doppelte Elemente in der Datenbank speichert. Zu diesem Zweck habe ich dieselbe Strategie verwendet, die im Abschnitt "Filter duplizieren" des Scrapy-Lernprogramms gezeigt wird. hier .

Was ich geschrieben habe ist folgendes:

id = str(item['product'] + item['price'])
print id
if id in self.ids_seen:
        raise DropItem("Duplicate item found!")
else:
        self.ids_seen.add(id)
        self.collection.insert(dict(item))
        log.msg("Entry added to MongoDB database!",
            level=log.DEBUG, spider=spider)

Alles funktioniert gut und die Duplikate werden gelöscht.

Meine Fragen sind:

  1. Wird dies eine geeignete Lösung für große Datenmengen sein?
  2. Wenn das Set extrem groß wird, wird die Spinne dann zu langsam?
  3. Gibt es eine bessere Lösung, um das Problem anzugehen?
1
Simus 14 Aug. 2015 im 12:30

2 Antworten

Beste Antwort

Ich arbeite gerade an einem ähnlichen Projekt. Ich bin mir nicht sicher, wie lange du bist str(item['product'] + item['price']) Zeichenfolgen sind, aber zum Überprüfen mit der Datenbank bin ich und speichere einen MD5-Hash aller Elemente, die ich in der Datenbank speichere. Auf diese Weise kann ich schnell einen eindeutigen Hash eines Elements erstellen und prüfen, ob es für die Datenbank vorhanden ist. Ja, es bedeutet, dass Sie mehr Daten speichern, aber das Überprüfen einer Datenbank auf eindeutige Hashes ist effizienter als das Überprüfen langer Zeichenfolgen.

Ich verwende das Hashhlib-Modul von Python für das MD5-Hashing.

Abhängig von der Größe Ihres Datasets können Sie andere Hashing-Algorithmen wie SHA1 in Betracht ziehen, um Kollisionen zu vermeiden. Ich benutze nur MD5 für seine Geschwindigkeit.

0
Darec 14 Aug. 2015 im 15:43

Ich hatte einmal eine ähnliche Situation, in der ich mit einem großen Datensatz zu tun hatte. Schließlich habe ich mich entschlossen, jedes Mal zu überprüfen, ob die Kennung des Artikels bereits in der Datenbank vorhanden war. Im Vergleich zu Ihrer Lösung können Sie mit dieser Lösung den Crawler mehrmals neu starten und sicherstellen, dass Ihre Datenbank keine Duplikate enthält. Darüber hinaus können Sie damit sogar Ihre Datenbank aktualisieren.

0
lucab0ni 14 Aug. 2015 im 13:13