如何避免使用MongoDB在Scrapy中添加重复数据?

时间:2017-07-22 06:09:48

标签: mongodb web-scraping scrapy pymongo scrapy-spider

我想避免添加重复数据,只需1)更新一个字段(视图数量)或2)网站中已更改的所有字段。为此,我使用的是我在网站上找到的ID(origin_id)。

管道

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记录

{
    "_id" : ObjectId("59725e919a1a6b7f0350027a"),
    "origin_id" : "12256699",
    "views":"556",
    "url":"...",
    "title":"...",
}

如果您想了解更多详情,请与我们联系......

1 个答案:

答案 0 :(得分:0)

如果文档中存在views,则需要1字段增加origin_id字段。

请注意您只能设置其他字段,因为它们包含非数字值。

为了跳过额外的查询以检查集合中是否存在origin_id的文档,这也是必要的。

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