Ich möchte vermeiden, doppelte Daten hinzuzufügen und nur 1) ein Feld (Anzahl der Ansichten) oder 2) alle Felder, die auf der Website geändert wurden, zu aktualisieren. Dazu benutze ich eine ID (origin_id), die ich in der Website gefunden habe, die ich gerade scrappe.Wie vermeidet man das Hinzufügen doppelter Daten in Scrapy mit MongoDB?
Pipelines
class MongoDBPipeline(object):
def __init__(self):
connection = pymongo.MongoClient(
settings['MONGODB_SERVER'],
settings['MONGODB_PORT']
)
db = connection[settings['MONGODB_DB']]
self.collection = db[settings['MONGODB_COLLECTION']]
def process_item(self, item, spider):
valid = True
for data in item:
if not data:
valid = False
raise DropItem("Missing {0}!".format(data))
if valid:
# Update item if it is in the database and insert otherwise.
self.collection.update({'origin_id': item['origin_id']}, dict(item), upsert=True)
return item
MongoDB Rekord
{
"_id" : ObjectId("59725e919a1a6b7f0350027a"),
"origin_id" : "12256699",
"views":"556",
"url":"...",
"title":"...",
}
Bitte lassen Sie mich wissen, wenn Sie weitere Informationen wünschen ...
Also, was ist das Problem? Dies sind "Upserts". Von Natur aus aktualisiert es entweder die vorhandenen Daten basierend auf den Informationen in der Abfrage oder "erstellt", wobei diese Abfrage dazu führt, dass nichts gefunden wird. Es ist also wirklich unklar, was dein Problem ist. Wenn überhaupt ein Problem auftritt. –
Zum Beispiel die Anzahl der Ansichten, die nicht aktualisiert werden –
Alles, was Sie tun, ist das Senden des Ergebnisses von 'dict (item)' und das Überschreiben von allem, was gefunden wurde. Was erwarten Sie? Was hat das mit Duplikaten zu tun? Wenn Sie hierher kommen, um Fragen zu stellen, müssen Sie "sehr spezifisch" sein und ein erwartetes Ergebnis zeigen und es Menschen ermöglichen, sich zu reproduzieren. Siehe [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) –