2017-10-08 91 views
0

我想保存我的数据,编辑它,然后再次保存为同一个对象(它是一个字典?)。scrapy如何屈服于现有物体mongodb

我用yield {'Id':id,'Name':name,'Age':age}将数据保存为mongodb。

之后,我用下面的代码读出的数据:

import scrapy 
import pymongo 
from pymongo import MongoClient 

class example(scrapy.Spider): 
    name = 'example' 
    allowed_domains = ['example.com'] 
    start_urls = ['https://example.com'] 

def __init__(self): 
    self.db = MongoClient() 
    self.datab = self.db.database_name.collection_name.find({}) 


def parse(self, response): 
    for data in self.datab: 
     name = data['Name'] 
     print(name) 

上面的代码将打印在数据的基础上的所有名称。 但例如如果我想编辑的名字是这样的:

for data in self.datab: 
     name = data['Name'] 
     if name == 'dani': 
      name = 'daniel' 
      yield{'Name':name} 

我希望它是产生于同一个对象以前。

~~~~~~~~~~~~~~~~~~~~~~

编辑: pipelines.py:

import pymongo 
from pymongo import MongoClient 
from scrapy.conf import settings 

class MongoDBPipeline(object): 
def __init__(self): 
    connection = MongoClient(settings['MONGODB_SERVER'], settings['MONGODB_PORT']) 
    db = connection[settings['MONGODB_DB']] 
    self.collection = db[settings['MONGODB_COLLECTION']] 

def process_item(self, item, spider): 
    self.collection.insert(dict(item)) 
    return item 

settings.py:

ITEM_PIPELINES = { 
    'quotes_spider.pipelines.MongoDBPipeline': 300, 
} 
MONGODB_SERVER = 'localhost' 
MONGODB_PORT = 27017 
MONGODB_DB = 'database_name' 
MONGODB_COLLECTION = 'collection_name' 
+0

您是否使用管道来保存这个?如果是这样,后置管道代码也加入 –

+0

@Tarun Lalwani – daniel

回答

1

您需要更改

self.collection.insert(dict(item)) 

if "_id" in item: 
    _id = item.pop("_id") 
    self.collection.update_one({"_id":_id}, {"$set": item}) 
else: 
    self.collection.insert(dict(item)) 

而且这

for data in self.datab: 
    name = data['Name'] 
    if name == 'dani': 
     name = 'daniel' 
     yield {'_id': data['_id'], 'Name': name} 

所以基本上,当你想更新你会产生_id和更新的领域。当你想要插入时,你将产生没有_id