• 爬虫入门【8】Python连接MongoDB的用法简介


    MongoDB的连接和数据存取

    MongoDB是一种跨平台,面向文档的NoSQL数据库,提供高性能,高可用性并且易于扩展。
    包含数据库,集合,文档等几个重要概念。
    我们在这里不介绍MongoDB的特点和用法了,感兴趣的可以查一下官方文档。
    在此重点介绍如何使用python连接MongoDB,并通过PyMongo操作MongoDB数据库。
    这里默认MongoDB已经安装好啦,安装教程可以参考:
    http://www.yiibai.com/mongodb/mongodb_environment.html
    感谢易百教程~~~~~

    安装PyMongo

    目前最新版本为3.5.1。请注意不要单独安装bson包了,否则会与PyMongo不兼容。

    使用MongoClient建立连接

    使用PyMongo时,第一步是运行mongod实例创建一个MongoClient,代码如下:
    当然,在使用代码测试之前,请务必保证MongoDB服务已经打开,否则连接不上的~~~~

    from pymongo import MongoClient
    client=MongoClient()
    #这是设置连接默认主机和端口,也可以明确指定主机和端口
    
    from pymongo import MongoClient
    #client = MongoClient()
    client = MongoClient('localhost', 27017)
    #client = MongoClient('mongodb://localhost:27017/')
    #上面几种方法都可以。
    

    获取数据库

    如果连接已经成功的话, 那么我们就要开始访问数据库了:
    第一种方法是用Client实例的属性方法,也就是.DatabaseName的方式
    假设我们的数据库名称为pyTest吧,看代码:

    db=client.pyTest
    

    第二种方法就是使用字典方式,看代码:

    db=client['pyTest']
    

    获取集合

    得到数据库的连接后,我们就可以进一步获取数据库中额集合了,也就是collection,类似与SQL中的数据表,用于保存数据。同样有两种方法,假设我们在pyTest数据库中存在一个叫first的表格。

    collection=db.first
    #collection=db['first']
    

    值得注意的是,MongoDB中关于集合和数据库的创建,是不同于传统SQL数据库的,他们是懒创建的,只有当出第一个文档(数据)插入集合时,才会创建集合和数据库。

    文档(data)

    在MongoDB中,存储的一个个数据就称作文档,是BSON格式的。用字典来表示文档,例如一个表示博客的文档:

    post = {"author": "xingzhui",
             "text": "My first blog post!",
             "tags": ["mongodb", "python", "pymongo"],
             "date": datetime.datetime.utcnow()}
    #可以看出文档是字典格式的,key-value对组成的,如果一个key对应多个value,需要用[]将所有的value包围起来。
    

    插入文档

    要将文档插入到集合中,可以使用insert_one()方法,这只是插入一条;
    如果想要插入多条文档的话,那么就要使用insert_many()方法了。
    两个方法的参数差不多。举个栗子,假如上面我们的一起操作都顺利的话。

    #获取pyTest数据中名为posts的集合,如果该集合不存在,那么就创建他
    posts = db.posts
    #将post数据插入到posts里面,并获取插入的文档的主键id
    post_id = posts.insert_one(post).inserted_id
    print ("post id is ", post_id)
    
    #我们将上面的语句拆分一下
    result=db.posts.insert_one(post)
    print(result.inserted_id)
    

    我们再讲一个insert_many()的栗子:

    >>> db.test.count()
    0
    >>> result = db.test.insert_many([{'x': i} for i in range(2)])
    >>> result.inserted_ids
    [ObjectId('54f113fffba522406c9cc20e'), ObjectId('54f113fffba522406c9cc20f')]
    >>> db.test.count()
    2
    

    值得注意的是,如果文档不包含_id字段,会自动添加_id,并且_id的值在集合中必须是唯一的。
    如果我们想要列出该数据库中的所有集合,可以使用下面的代码:

    cur_collection=db.collection_names(False)
    print(cur_collection)
    

    使用find_one()获取单个文档

    MongoDB中执行的最简单的查询类型是find_one(),返回与查询匹配的单个文档,如果没有获取到匹配的文档,返回None。只有当知道只有一个匹配的文档,或者只对第一个匹配感兴趣时,可以考虑使用find_one()方法。
    下面举个例子:

    #获取第一个文档,结果就是之前插入的字典格式,并且多了一个_id。
    post_first=db.posts.find_one()
    print(post_first)
    
    #获取具有匹配的特定元素,比如author为xingzhui的文档,作为指定的查询条件。
    post_xingzhui=db.posts.find_one({'author':'xingzhui'})
    print(post_xingzhui)
    

    通过ObjectId查询

    有时候,我们也可以通过_id找到一个post,比较适用于我们自行指定_id的时候,举个例子:

    post = {"_id": 200,
             "author": "Suifeng",
             "text": "This is is my first post!",
             "tags": ["Docker", "Shell", "pymongo"],
             "date": datetime.datetime.utcnow()}
    
    post_id=db.posts.insert_one(post).inserted_id
    print(post_id)
    
    post_user=db.posts.find_one({'_id':post_id})
    print('By Post ID:',post_user['author'])
    
    #输出结果
    200
    By Post ID: Suifeng
    

    批量插入 insert_many()

    为了适应更复杂的查询,我们再向posts集合中再插入一些文档。
    出了插入单个文档外,还可以插入多个文档,使用insert_many()来执行。
    通过一个命令,插入多个文档。
    举个例子:

    new_posts = [{"_id": 1000,
                   "author": "Curry",
                   "text": "Another post!",
                   "tags": ["bulk", "insert"],
                   "date": datetime.datetime(2017, 11, 12, 11, 14)},
                  {"_id": 1001,"author": "Maxsu",
                   "title": "MongoDB is fun",
                   "text": "and pretty easy too!",
                   "date": datetime.datetime(2019, 11, 10, 10, 45)}]
    
    result=db.posts.insert_many(new_posts)
    print('Bulk Inserts Result is:',result.inserted_ids)
    

    值得注意的是:
    insert_many()的结果返回了两个ObjectId实例,每个ID表示插入的一个文档。
    另外的是,我们在第二个post中把tag字段替换成了title字段,同样可以插入到数据库中。
    MongoDB是无模式的,表示的就是这个意思。

    查询多个文档

    要查询获得超过单个文档作为查询的结果,可以使用find()方法,find()返回一个Cursor实例,它允许遍历所有匹配的文档。

    for post in db.posts.find():
        print(post)
    

    同样的我们可以将过滤参数传递给find方法,比如

    for post in db.posts.find({'author':'xingzhui'}):
        print(post)
    

    计数统计

    如果只想知道有多少文档匹配查询,可以执行count()方法操作,而不是一个完整的查询。
    可以得到一个集合中的所有文档的计数:

    print(db.posts.count())
    print(db.posts.find({"author": "xingzhui"}).count())
    

    好了,至此我们已经将爬虫中可能用到的所有基础知识都介绍了一遍,后面我们就要开始爬虫的实战了。
    我打算用一个月的时间,将静态网页、动态网页、登陆验证等不同类型的爬虫方法做介绍,希望大家能有兴趣。
    一起进步!

  • 相关阅读:
    Mysql表设计需要注意的问题
    Mysql开始root远程访问权限
    python学习之简介
    常用的Git命令
    Java虚拟机类加载机制
    java垃圾回收机制的理解
    解析和操作XML文件
    Hibernate的工作流程以及三种状态(面试题)
    SSH整合
    Spring事务管理的注解方式
  • 原文地址:https://www.cnblogs.com/xingzhui/p/7875420.html
Copyright © 2020-2023  润新知