原创

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:\PythonProjects\study\venv\MongDB\bin\mongod.exe --dbpath F:\PythonProjects\study\venv\MongDB\data\db

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
  • 作者:曾强(联系作者)
  • 发表时间:2020-02-29 21:24
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 转载声明:转载时请注明出处:www.zengqiang.club
  • 注:如果文章有错误,望请评论指出,谢谢;如果看了文章还有不明白的地方,欢迎进群与我交流。
  • 评论