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:
- Wird dies eine geeignete Lösung für große Datenmengen sein?
- Wenn das Set extrem groß wird, wird die Spinne dann zu langsam?
- Gibt es eine bessere Lösung, um das Problem anzugehen?
2 Antworten
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.
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.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.