Python爬虫 #016 MongoDB数据库

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

1. MongoDB简介

  • MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

  • 对于数据量大,写入操作频繁,对事务性要求不高的数据,适合使用 MongoDB来实现数据的存储



2. MongoDB安装

2.1 下载


2.2 安装

  • 文件下载完之后,直接双击运行:

  • 这一步要选择“Custom”,下一步设置安装路径:

  • 修改安装路径:

  • 注:安装路径不要有空格!比如:D:\Program Files\MongoDB\Server\4.0 中的 “Program Files” 不符合!

  • 这一步,取消勾选安装Compass,不然会等待很久很久。我等了一个小时也没安装完。猜测是安装过程中会去官网下载compass的安装文件,下载速度很慢

  • compass 官网下载地址:https://downloads.mongodb.com/compass/mongodb-compass-community-1.18.0-win32-x64.msi,下载后直接安装即可

  • 如果安装了杀毒软件,后面会弹出提示框,允许即可:

  • 这一步选择“Ignore”,忽略即可,最后点击finish完成安装

  • 安装完之后进入安装目录的bin文件夹下,可看到以下文件:mongo.exe 是客户端,mongod.exe 是服务端


2.3 配置环境

  • 设置环境变量:将安装路径下的bin文件夹的目录添加在环境变量中

  • 启动服务:

    启动mongodb服务,需要指定数据存储的路径(dbpath),在D:\MongoDB 目录中创建文件夹data

    以管理员身份运行cmd,执行代码:

    mongod --dbpath D:\MongoDB\data

  • 连接mongodb

    上面启动服务窗口不要关 管理员身份新开一个窗口,执行命令:mongo,最下面有小三角 > 表示已连接成功!



3. 将MongoDB制作成windows服务

  • 创建配置文件
    mongodb的安装路径(我的是 D:\MongoDB),创建文件 mongod.cfg ,及log文件夹,在log文件夹中创建mongod.log文件(文件路径 和文件名可随意取)

  • 在mongod.cfg写入以下内容(后缀改为.txt再写入内容,记得最终后缀改为 .cfg)

    logpath=D:\MongoDB\log\mongod.log   # 日志路径  
    dbpath=D:\MongoDB\data             # 数据存放路径
    
  • Cmd中管理员身份运行如下代码:

    安装mongodb服务:

    mongod --config "D:\MongoDB\bin\mongod.cfg" --install

    启动 mongodb:

    net start mongodb

    关闭 mongodb:

    net stop mongodb

    如图即表示配置成功:

  • MongoDB常用操作

    先启动mongoDB

    show dbs        # 查看所有数据库
    use dbname      # 进入dbname数据库,
    db.framename.find()  # 查看当前数据库(dbname),中表单(framename)的内容
    

    示例:记得使用完后关闭数据库



4. Python操作MongoDB

4.1 增

import pymongo

# 获取连接mongodb的对象,127..为mongodb地址(此处为本机),port为mongodb端口号
## 需要先启动mongodb服务
client = pymongo.MongoClient("127.0.0.1", port=27017)

# 获取数据库(object为数据库,如果没有该数据库,则自动创建)
db = client.object

# 获取数据库中的集合
collection = db.data

# 写入数据
## 写入一条数据
# collection.insert_one({'str':'aaa'})

## 写入多条,注意要用到 []
collection.insert_many([{'str':'aaa','id':'1'}, {'str':'bbb','id':'2'}, {'str':'ccc','id':'3'}])

4.2 删

import pymongo

# 连接
client = pymongo.MongoClient("127.0.0.1", port=27017)

# 获取数据库(object是已有的数据库)
db = client.object

# 打开数据库集合
collection = db.data

# 删一条数据
# collection.delete_one({'id':'2'})

# 删多条数据
collection.delete_many({'str':'ccc'})

4.3 改

import pymongo

client = pymongo.MongoClient("127.0.0.1", port=27017)

db = client.object

collection = db.data

# 修改一条数据,前面的{..}为被修改的数据,后面的{...}为修改后
# collection.update_one({'id':'3'},{"$set":{'id':'4'}})

# 修改多条,我的集合中有很多bbb
collection.update_many({'str':'bbb'},{"$set":{'str':'BBB'}})

4.4 查

import pymongo

# 连接
client = pymongo.MongoClient("127.0.0.1", port=27017)

# 获取数据库(object是已有的数据库)
db = client.object

# 打开数据库集合
collection = db.data

# 根据条件查一条数据,
# result = collection.find_one({'id':'3'})
# print(result)

# 查多条数据
result = collection.find()
for i in result:
    print(i)


5. 实战案例


5.1 豆瓣Top250电影信息

import requests
from lxml import etree
import time
import pymongo

client = pymongo.MongoClient("127.0.0.1", port=27017)
db = client.douban
collection = db.data

data_list = []
a = 0
fp = open(r'C:\Users\ASUS PC\Desktop\movies.txt',mode='a',encoding='utf-8')
for i in range(10):
    url = 'https://movie.douban.com/top250?start=' + str(a) +'&filter='
    print(url)
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3730.400 QQBrowser/10.5.3805.400'
    }
    response = requests.get(url, headers = headers)
    data = response.text

    html = etree.HTML(data)
    movies = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
    # print(len(movies))

    for movie in movies:
        # 每次循环都会被清空,(每获得一部电影信息就清空)
        data_dict = {}
        # 标题,有的标题只有中文名
        titles = movie.xpath('./div/div[2]/div[1]/a/span[@class="title"]')
        if len(titles) == 2:
            ch_title = titles[0].text
            en_title = titles[1].text.replace('/', '')
        else:
            # 没有中文名,英文名设为None
            ch_title = titles[0].text
            en_title = "无"
        # 排名
        rank = movie.xpath('.//em')[0].text
        # 评分
        grade = movie.xpath('.//span[@class="rating_num"]')[0].text
        # 评价人数
        evaluate = movie.xpath('.//div[@class="star"]/span[4]')[0].text
        # 链接
        href = movie.xpath('.//div[@class="hd"]/a/@href')[0]
        # 一句话简介(第246条没有)
        try:
            line = movie.xpath('.//span[@class="inq"]')[0].text
        except:
            line="无"
        # print(line)
        # 电影信息
        message = movie.xpath('.//div[@class="bd"]/p')[0].text.strip()
        data_dict={"排名":rank,"评分":grade,"评价人数":evaluate,"电影中文名":ch_title,"电影英文名":en_title,"链接":href,"in a word":line,"信息":message}
        data_list.append(data_dict)
    a += 25
    time.sleep(2)
fp.close()
print(data_list)
collection.insert_many(data_list)
print("写入数据库成功")
posted @ 2023-06-28 23:01  枫_Null  阅读(42)  评论(0)    收藏  举报