【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

时间:2023-03-08 20:05:00

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

广东职业技术学院  欧浩源

1、引言

网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQLMongoDBRedis等。对于爬取返回为JSON格式的数据,选择NoSQL非关系型数据库MongoDB来存储会容易很多。在本文中,首先介绍MongoDB数据库的安装与启动,然后讲述该数据库的基本操作,接着用Python语句操作该数据库,最后将“豆瓣电影TOP250”爬虫搜集的数据存到到该数据库中,由浅入深,从理论到实践,全面掌握MongoDB数据库的基本应用。

2、什么是MongoDB数据库?

MongoDB是一款由C++语言编写,基于分布式文件存储的NoSQL数据库,具有免费、操作简单、面向文档存储、自动分片、可扩展性高、查询功能强大等特点,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对(key--value)组成。MongoDB的文档类似于JSON对象,如果你不懂JSON对象的话,也可以理解为Python中的字典

3、MongoDB的下载与安装

【1】进入官方网站:www.mongodb.com,进入download页面,选择“community sever”标签,下载windows的msi版本。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【2】双击下载后的安装程序,选择“Complete”安装完整版本。这个过程非常简单,除了“下一步”就是最后的“完成”。完成后,程序默认安装在“C:\Program Files\MongoDB中”。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用   【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【3】在C盘创建两个文件夹,分别为:"C:\MongoDBData\db"和"C:\MongoDBData\log",作为数据日志的文件夹。db文件夹存放MongoDB的数据库,log文件夹存放数据库的操作记录。在log文件夹中创建一个日志文件mongodb.log。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【4】创建MongoDB的数据库文件。以管理员身份打开cmd控制台,将当前路径切换到MongoDB的安装目录的bin目录下,即“C:\Program Files\MongoDB\Server\3.4\bin”。在路径下输入“mongod.exe --dbpath c:\MongoDBData\db”。该命令将MongoDB的数据库文件创建到已经建好的db文件夹中。如果创建成功,可以看到具体的信息。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【5】MongoDB主要的启动方式有两种:以程序的方式打开和以Windows服务的方式打开。在实际使用中,用Windows服务的方式打开会比较方便。首先以管理员的身份运行cmd控制台,并且把当前目录切换到MongoDB安装目录的bin目录下,然后输入:

mongod.exe --logpath "C:\MongoDBData\log\mongodb.log" --logappend --dbpath "c:\MongoDBData\db" --serviceName "MongoDB" --install
通过这个指令安装Windows服务运行模式,其中“MongoDB”为服务器名称。然后通过输入“net start MongoDB”指令,启动MongoDB。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

如果看到上述的信息,则表示MongoDB已经成功启动了。如果你打开计算机管理系统的服务模块,能清楚看到MongoDB已经启动了。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

到这里,关于MongoDB的下载、安装、配置、启动已经全部完成,接下来就可以*的使用了。在下一次打开电脑的时候,并不需要再次输入配置和启动命令,直接进入MongoDB安装目录下的bin文件夹,双击“Mongo.exe”即可打开数据库的交互窗口,即Mongo Shell

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

为了测试MongoDB是否打开成功,可在提示符下输入“show dbs”查看所有的数据库。如果成功的话,你能看到以下的返回信息。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

5、MongoDB的基本操作

【1】查看当前数据库名称:db
【2】查看所有数据库名称:show dbs
【3】切换数据库:use 数据库名称
    如果数据不存在,则则指向数据库,但不创建,直到插入数据或创建集合时,数据库才被创建。默认的数据库为test。如果你没有创建新的数据库,集合将存放在test数据库中。
【4】删除当前数据库:db.dropDatabase()
    删除当前指向的数据库,如果数据库不存在,则什么也不做。
【5】创建集合:db.createCollection(name ,option)
    不限制集合大小,如:db.createCollection("student")
    限制集合大小,如:db.createCollection("student",{capped:true,size:10})
【6】查看当前数据库的集合:show collections
【7】删除集合:db.集合名称.drop()
例1:查看当前的数据库,并切换到“spider01”数据,然后在该数据库中创建集合“student”,最后查看当前数据库中的集合。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【8】插入数据:db.集合名称.insert(document)
    如:db.stu.insert({name:"Marry", age:21})
【9】保存数据:db.集合名称.save(document)
【10】全文档数据更新:
    db.集合名称.update(
        <query>,
        <update>,
        {multi : <boolean>}
    )
    第1个参数:查询条件,即要修改那些数据。
    第2个参数:更新内容,即改为什么数据。
    第3个参数:可选,是否多行更新,默认为false,更新一行。
【11】指定属性更新:
    语法如上,通过操作符$set,指定更新的属性。
【12】删除数据:
    db.集合名称.update(
        <query>,
        {justone : <boolean>}
    )
    第1个参数:查询条件,要删除的数据。
    第2个参数:默认为false,删除多条数据。
【13】简单查询:db.集合名称.find({条件文档})
【14】返回第一个查询结果:db.集合名称.findOne({条件文档})
【15】将结果格式化输出:db.集合名称.find({条件文档}).pretty()

【16】查询集合的记录总数:db.集合名称.find().count()
例2:向“student”集合中插入三条数据,通过简单查询显示该集合的数据。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

例3:将“name”为“Peter”的文档删除,将name为“Marry”的“age”改为65,通过查询,将查询结果格式化输出,最后将所有文档删除,在通过简单查询确认。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【17】退出MongoDB数据库:quit()

6、PyMongo库的安装与引入

按装PyMongo库就可以使用Python语言操作MongoDB数据库了。其安装方式非常简单:
    pip install pymongo
    安装完成后,从pymongo中引入MongoClient:
    from pymongo import MongoClient
    然后,就可以使用Python对MongoDB数据进行各种操作了。

7、PyMongo库的基本操作

操作MongoDB数据库之前,首先需要连接MongoDB客户端,然后连接数据库,如果该数据库不存在,就会创建一个数据库;接着选择数据集合,如果该集合不存在,也会创建一个;然后才能进行数据操作。

例4:连接MongoDB客户端,然后连接数据库“spider01”,选择数据集合"student"。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【1】插入单条记录:insert_one()
例5:向"student"集合中插入一条学生记录。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【2】插入多条记录:insert_many()
    在该方法中,要插入的记录以列表的形式进行传递。
例6:向"student"集合中插入三条学生记录。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【3】查找单条记录:find_one()
例7:查询"student"集合中,age为28的记录中的第一条。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【4】查找多条记录:find_many()
例8:查询"student"集合中,age为28的所有记录。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【5】查询所有记录:find()
例9:查询"student"集合的所有记录。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【6】更新单条记录:update_one()
例10:将"student"集合中,name为“李四”的记录的“scorce”的值修改为66.6。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【7】更新多条记录:update_many()
例11:将"student"集合中,age为28的记录的“scorce”的值修改为88.8。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【8】删除单条记录:delete_one()
例12:将"student"集合中,name为"李四"的记录删除。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

【9】删除多条记录:delete_many()
例13:将"student"集合的所有记录删除。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

熟练掌握了数据库的增、删、查、改的基本操作之后,再去学习和提升就不会存在太大的障碍了。实际上使用pymongo库来操作数据库是非常简单的,将来碰到更加复杂的需求,在网络上查一下官方文档或者技术博客,应该都能很快的顺利解决。

7、MongoDB的爬虫应用

【网络爬虫入门01】中,应用Requests和BeautifulSoup技术实现了从“豆瓣电影TOP250”中将电影名称豆瓣评分相关链接爬取下来,并保存到文本文件中的网络爬虫。在这里我们对其进行升级一下,把爬取下来的目标数据存储到MongoDB数据库中,其实现的思路很简单:
    <1> 引入pymogo库。
    <2>连接服务器和数据库。
    <3>选择数据集合进行增、删、查、改操作。
    从实现代码来看,把爬取到的数据存储到数据库只需要一行代码。这个网络爬虫跟MongoDB数据库相关的代码,也就下面几句:

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

整个网络爬虫的实现代码如下:

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

到底爬虫获取的数据有没有存储到数据库中指定的集合中呢?我们可以打开mongo.exe的交互终端进行查看。

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

如果你觉得上面通过交互终端进行数据查询很不方便,你也可以利用Python语句编写代码,查询集合中“评分”为“9.5分”的记录。其实现代码也相当的简洁:

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

如果要将上述代码放到爬虫里面,在程序将数据向数据库存储完毕之后,再读出其中“评分”为“9.5分”的记录作为验证。整个代码可以这样实现:

【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

8、小结

在大数据处理时代中,MongoDB的地位将会非常突出,关键它学起来也不难,如果结合Python语句进行开发应用,其效率是非常高的。在网络爬虫的应用中,对于关联度很低、结构很松散的数据,特别是一些JSON格式的数据,使用MongoDB来存储数据那是再完美不过了。

9、附件:源码

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
db = client.spider01
collection = db.movie250
user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;)"
headers = {"User-Agent":user_agent}
url = "https://movie.douban.com/top250?start="
for i in range(0,10):
fullurl = url + str(i * 25)
res = requests.get(fullurl, headers = headers)
soup = BeautifulSoup(res.text, "lxml")
mlist = soup.find_all('div', {'class':'info'})
for m in mlist:
title = m.find('a').find('span').text
score = m.find('div',class_='star').find('span',class_='rating_num').text + '分'
link = m.find('a')['href']
dat = {'电影':title,'评分':score,'链接':link}
collection.insert_one(dat)
print("====豆瓣电影TOP250数据爬取分析保存完毕====")
cursor = collection.find({'评分':'9.5分'})
for doc in cursor:
print(doc)
print("*** 广东职业技术学院-欧浩源-2017年10月 ***")