2017-02-22 3 views
1

Ich versuche, separate Elemente in separaten Mongodb-Sammlungen mit Pymongo und Scrapy zu speichern.Scrapy Schreiben in mehrere MongoDB-Sammlungen

Wie soll ich mich wenden ein, eine Pipeline zu schaffen, dass 1) ein Wörterbuch der pymongo Verbindungen beginnt, wenn die Spinne öffnet, 2) Prozesse und identifiziert ein Element mit Namen, 3) und fügt das Element an einer der Sammlungen innerhalb einer bestimmten Anfrage.

Ich bin nicht sicher, ob es sogar möglich ist, in mehrere Sammlungen in scrapy zu schreiben. Jeder Einblick würde geschätzt werden!

+0

Nicht sicher über Ihre Frage, haben Sie dieselben Daten in zwei Datenbanken gespeichert werden sollen ? – Umair

+0

Gelöst es! Danke Umair – Chris

Antwort

1

Ich habe zunächst versucht, ein dict Objekt von Sammlungen zu machen, in denen eine Spinne verschiedene Gegenstände schreiben konnte.

Nach einigen Recherchen stieß ich in mongodb docs auf "Verbindungspooling" und erkannte, dass ich das dict-Objekt von Verbindungen zu mehreren Endpunkten statt mehrere Sammlungen mit 1 Verbindung machen musste.

class MongoDBPipeline(BaseItemExporter): 

#... 

    #item types for mongo to insert to correct collection 
    writeTypes = [ 
     'ent_pfrm', 'ent_prsn', 
     'ent_sctn', 'ent_meet', 
     'ent_venu', 'ent_affn' 
    ] 

#... 

    def open_spider(self, spider): 

     #Set db dict 
     self.database = dict([(name,connection[self.config['database']][name]) for name in self.writeTypes]) 

Sobald ein Element verarbeitet wird, erhalten den Namen, überprüfen Sie die dict, und einfügen, wenn ein Spiel dort

ist
def process_item(self, item, spider): 

    def item_type(item): 
     return type(item).__name__.replace('_Item','').lower() # Team_Item => team 

    item_name = item_type(item) 

    #check if the item matches one of the 'writeTypes' 
    if item_name in self.database.keys(): 
     dbcol = self.database[item_name] 
     dbcol.insert(item) 

    return item