zoukankan      html  css  js  c++  java
  • python爬虫学习之MongoDB学习笔记

    python爬虫学习之MongoDB学习笔记

    1. 简介

    MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前noSql数据库产品中最热门的一种。

    2. 特点

    1. 面向集合(Collenction-Orented)
      意思是数据被分组存储在数据集中, 被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表(table),不同的是它不需要定义任何模式(schema)

    2. 模式自由(schema-free)
      意味着对于存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢?例如,下面两个记录可以存在于同一个集合里面: {"welcome" : "Beijing"} {"age" : 25}

    3. 文档型
      意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “BSON” 即 “Binary Serialized document Notation.”

    4. collection无结构

    5. 文档相互独立,没有固定结构

    3. 安装与启动

    安装mongdb和gui软件(最后有文件)
    开启服务命令(地址换成自己的,可以写成bat文件):
    F:PythonProjectsstudyvenvMongDBinmongod.exe --dbpath F:PythonProjectsstudyvenvMongDBdatadb
    

    4. mongodb最基础命令

    • show databases; #查看已有数据库
    • use dataName; #选择数据库(没有就创建)
    • show tables; # 查看已有的表
    • show collections # 同上,
    • db.createCollection('表名');#建表
    • db.表名.drop(); #删除表
      注:table在mongodb里叫collections

    5. 数据库操作

    1.1 查看数据库

    列出所有在物理上存在的数据库

    show dbs
    

    1.2 切换数据库/创建数据库

    如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建

    use 数据库名
    

    1.3 删除数据库

    删除当前指向的数据库
    如果数据库不存在,则什么也不做

    use 数据库名
    db.dropDatabase()
    

    2 集合的操作

    2.1 创建集合

    db.createCollection(集合名,{capped:true,size:num})
    
    • capped:默认值为false表示不设置上限,值为true表示设置上限
    • size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节

    2.2 删除集合

    db.集合名称.drop()
    

    2.3 查看集合

    show tables
    show collections
    

    6. 数据的操作

    1.1 数据的增加

    注意:插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId

    1.1.1 insert

    而insert则会忽略操作,insert可以一次性插入一个列表,而不用遍历,效率高

    db.集合名称.insert(document)
    

    1.1.2 save

    使用save函数里,如果原来的对象不存在,那他们都可以向collection里插入数据,如果已经存在,save会调用update更新里面的记录,save则需要遍历列表,一个个插入,效率稍低

    db.集合名称.save(document)
    

    1.1.3 举例

    已存在数据: {_id : 'abc123', " name " : " 小王 " }

    再次进行插入操作时 insert({_id : 'abc123', " name " : " 小李 " }) 会报主键重复的错误提示
      

    save({ _id : 'abc123', " name " : " 小李 " }) 会把 小王 修改为 小李

    如果集合中不存在 _id : 'abc123',

    insert({_id : 'abc123', " name " : " 小李 " }) 增加一条数据

    save({ _id : 'abc123', " name " : " 小李 " }) 增加一条数据

    1.1.4 增加多条

    db.集合名.insert([{k1:v1},{k2:v2}])
    

    1.2 数据的修改

    1.2.1 格式

    db.集合名称.update(
       <query>,
       <update>,
       {multi: <boolean>}
    )
    
    • 参数query:查询条件,类似sql语句update中where部分
    • 参数update:更新操作符,类似sql语句update中set部分
    • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新

    1.2.2 举例

    # 只更新找到的第一条,并且会修改结构
    db.person.update({name:"zs"},{age:16})
    # 只更新数据,为不更新文档结构
    db.person.update({name:"zs"},{$set:{age:123})
    # 更新所有找到匹配的数据
    db.person.update({name:"zs"},{$set:{age:123}, {multi: true})
    

    1.3 数据的删除

    # 删除所有匹配数据
    db.person.remove({name:"zs"})
    # 只更新一条
    db.person.remove({name:"zss"},{justOne:true})
    

    1.4 数据的查找

    db.集合名.find()
    

    7. Mongo的简单查询

    1.1 find

    查找到所有匹配数据

    db.集合名.find({条件文档})
    

    1.2 findOne

    只返回匹配的第一个数据

    db.集合名.findOne({条件文档})
    
    1. 运算符

    语法 操作 格式
    $eq 等于 {:}
    lt |小于 |{:{$lt:}}
    lte |小于或等于 |{:{lte:}}
    gt |大于 |{:{gt:}}
    gte |大于或等于 |{:{gte:}}
    ne |不等于 |{:{ne:}}
    or |或 |{or:[{},{}]}
    in |在范围内|{age:{in:[val1,val2]}}
    nin |不在范围内|{age:{$nin:[val1,val2]}}

    举例

    db.person.find({age:{$gt:16}})
    db.person.find({$or:[{age:{$gte:18}},{name:"zs"}])
    
    1. 模糊匹配

    使用//或$regex编写正则表达式

    db.person.find({name:/^zs/})
    db.person.find({name:{$regex:'^zs'}}})
    
    1. 自定义查询

    使用$where后面写一个函数,返回满足条件的数据

    db.person.find({$where:function(){return this.age>20}})
    
    1. limit

    用于读取指定数量的文档

    db.集合名称.find().limit(NUMBER)
    
    1. skip

    用于跳过指定数量的文档

    db.集合名称.find().skip(2)
    
    1. sort

    用于对结果集进行排序

    db.集合名称.find().sort({字段:1,...})
    
    • 参数1为升序排列
    • 参数-1为降序排列

    6 .count

    用于统计结果集中文档条数

    db.集合名称.find({条件}).count()
    

    8. mongoDB的连接与数据操作

    import pymongo
    
    # 连接数据库
    # 默认
    client = pymongo.MongoClient()
    # 自定义
    # client = pymongo.MongoClient('ip',port)
    
    # 选择实例(数据库)
    person = client.person
    # 选择集合(表)
    student = person.student
    
    #操作数据
    # 查找所有信息
    # result = student.find()
    # for r in result:
    #     print(r)
    
    # print(result.next())
    
    # 筛选
    # result = student.find({"age":20})
    # for r in result:
    #     print(r)
    
    # 排序
    # result = student.find().sort("age",1)
    # result = student.find().sort("age",pymongo.ASCENDING)
    # for r in result:
    #     print(r)
    
    # 分页(偏移)
    # result = student.find().limit(3)
    # for r in result:
    #     print(r)
    #
    #
    # result = student.find().limit(3).skip(2)
    # for r in result:
    #     print(r)
    
    # 统计
    # result = student.find().count()
    # print(result)
    
    # 增加数据
    # data = {"name":'曾强','age':22}
    # student.insert(data)
    # result = student.count()
    # print(result)
    
    # 删除数据
    # data = {"name":'zq2','age':20}
    # student.remove(data)
    
    # 更新
    data = {"name":"zq1"}
    result = student.find_one(data)
    print(result)
    result["country"]="中国"
    student.update(data,{'$set':result})
    

    9.实战案例

    爬取豆瓣电影top250电影信息
    保存数据到MongoDB数据库中
    

    douban.py

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class DoubanSpider(scrapy.Spider):
        name = 'douban'
        allowed_domains = ['douban.com']
        start_urls = ['https://movie.douban.com/top250?start={}&filter='.format(num*25) for num in range(10)]
    
        def parse(self, response):
            # 抓取电影名和评分
            names = response.xpath('//div[@class="hd"]//span[@class="title"][1]/text()').extract()
            scores = response.xpath('//span[@class="rating_num"]/text()').extract()
    
            for name, score in zip(names,scores):
                yield {
                    'name':name,
                    'score':score
                }
    
    

    pipelines.py

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    import pymongo
    
    class MongoPipeline(object):
        def open_spider(self,spider):
            self.client = pymongo.MongoClient()
    
        def process_item(self, item, spider):
            self.client.douban.movie.insert_one(item)
            return item
    
        def close_spider(self,spider):
            self.client.close()
    
    

    setting.py配置(略)

    资料

    链接:https://pan.baidu.com/s/10e8PphvR7Um0-WPAylw8Yw

    提取码:h8i8

    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    MongoDB的安装和常用命令
    mysql安装、使用与遇见的问题汇总
    devicePixelRatio,Viewport,移动端适配
    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法
    正则表达式
    npm 常用命令
    Markdown 基本语法
    mysql忘记root密码
    mysql5.7.12/13在安装新实例时报错:InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero
    mysqld数据位于a盘,执行delete from table, 发现另外2个盘磁盘使用率接近100%,而a盘的使用率反而很低,y??
  • 原文地址:https://www.cnblogs.com/zq98/p/15028015.html
Copyright © 2011-2022 走看看