2017-07-22 2 views
0

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 ...

+0

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. –

+0

Zum Beispiel die Anzahl der Ansichten, die nicht aktualisiert werden –

+0

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) –

Antwort

0

Sie müssen von 1views Feld erhöhen, wenn die origin_id existiert in das Dokument.

Beachten Sie, dass können Sie nur gesetzt die anderen Felder, wie sie nicht-numerische Werte halten.

Dies ist auch erforderlich, um eine zusätzliche Abfrage zu überspringen, die überprüft, ob ein Dokument mit der origin_id in der Sammlung vorhanden ist.

self.collection.update({ 
    'origin_id': item['origin_id']}, 
    { 
     '$set': {'url': item['url'], 'title': item['title']}, 
     '$inc': {'views': 1} 
    } 
}, 
upsert=True) 
+0

Vielen Dank ... aber ich bekomme die Anzahl der Ansichten direkt von der Seite, die ich schabe. Beispiel: Nehmen wir an, die Anzahl der Ansichten war 555 im Dokument (beim ersten Mal scrapped der Inhalt), dann, wenn ich den gleichen Inhalt scrapped die Anzahl der Ansichten wurde 799! Wie kann ich die Anzahl der Ansichten im Dokument überschreiben? Bitte helfen Sie –

+0

Wenn ich Sie richtig verstehe, möchten Sie Daten für eine ID überschreiben, die bereits existiert. Ich denke nicht, dass Sie die Ansichten dafür erhöhen müssen. Sie können das im Set schreiben. Wie wäre es mit '' $ set ': {' url ': item [' url '],' titel ': item [' titel '],' views ': item [' views ']} '? Sie sollten die inkrementelle Abfrage auch entfernen –

+0

Das ist, was ich will, aber immer noch nicht die Anzahl der Aufrufe aktualisieren! Übrigens möchte ich nicht die gesamten Daten überschreiben, da nur die Anzahl der Ansichten aktualisiert wird, die von der Seite, die ich gerade scrappe, aktualisiert werden ... –

Verwandte Themen