Win10中采集网页数据保存到MongoDB数据库中

大数据学习路线图

Win10中采集网页数据保存到MongoDB数据库中
作者:厦门大学计算机系林子雨副教授
说明:本博客是与林子雨编著《数据采集与预处理》教材配套的教学资料。
操作系统:Windows10
数据库:MongoDB6.0
Python:3.8.7

MongoDB是一个基于分布式文件存储的数据库,采用C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是目前非关系数据库当中功能最丰富、最像关系数据库的数据库。
传统的关系数据库一般由数据库(database)、表(table)和记录(record)3个层次概念组成,而MongoDB由数据库(database)、集合(collection)和文档对象(document)3个层次组成。MongoDB中的集合对应关系型数据库中的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。MongoDB与关系数据库的概念对比如表1所示。

一、安装MongoDB

进入Win10操作系统,访问MongoDB官网(https://www.mongodb.com/try/download/community ), 下载MongoDB安装文件,比如mongodb-windows-x86_64-6.0.4-signed.msi。下载好后进行安装,如图1所示,选择“Complete”,会弹出如图2所示界面,所有选项都采用默认设置,点击“Next”按钮进入下一步。这时会进入MongoDB Compass的安装选择界面(如图3所示),MongoDB Compass 是一个图形界面管理工具,这里可以不安装,因此,"Install MongoDB Compass"不勾选,然后点击“Next”按钮进入下一步,完成安装。

图1 选择安装类型

图2 服务配置

图3 安装MongoDB Compass

需要配置系统环境变量,具体方法是:使用快捷键“win+i”打开“设置”界面,在上方搜索框中输入“高级系统设置”(如图4所示),然后点击“查看高级系统设置”。在弹出的界面中(如图5所示),点击“环境变量”。在弹出的界面中(如图6所示),在“系统变量”中选中“Path”,然后单击“编辑”按钮,在弹出的界面中(如图7所示),点击“浏览”按钮,然后找到MongoDB安装目录的bin子目录(如图8所示),再点击“确定”按钮,环境变量就设置成功了(如图9所示),然后点击界面中的“确定”按钮即可结束操作。

图4 Windows设置

图5 系统属性

图6 系统变量

图7 编辑环境变量

图8 浏览文件夹

图9 添加环境变量成功

在MongoDB安装目录的data目录下新建一个名为db的文件夹(如图10所示)。

图10 在data目录下新建一个名为db的文件夹
在MongoDB的安装目录下新建一个文件mongo.config(如图11所示)。

图11 在安装目录下新建一个文件mongo.config

在mongo.config里面写入如下内容:

dbpath=C:\Program Files\MongoDB\Server\6.0\data\db #数据库路径
logpath=C:\Program Files\MongoDB\Server\6.0\log\mongodb.log #日志输出文件路径
logappend=true #错误日志采用追加模式
journal=true #启用日志文件,默认启用
quiet=true #过滤掉无用的日志信息,若需要调试使用请设置为false
port=27017 #端口号 默认为27017

在Windows系统中使用快捷键“Win+R”,打开“运行”界面,在文本框里面输入“cmd”,点击“确定”,打开一个cmd窗口。
在cmd窗口里面输入如下命令启动MongoDB(如图12所示):

> cd C:\Program Files\MongoDB\Server\6.0
> mongod --dbpath C:\Program Files\MongoDB\Server\6.0\data\db


图12 cmd窗口

打开一个浏览器,输入网址“http://localhost:27017/ ”,如果网页上出现如下一行信息,就说明启动成功了:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

再新建一个cmd窗口,在里面执行如下命令安装MongoDB服务(如图13所示):

> cd C:\Program Files\MongoDB\Server\6.0
> mongod --config "C:\Program Files\MongoDB\Server\6.0\mongo.config" --install --serviceName "MongoDB"


图13 安装MongoDB服务
打开任务管理器(如图14所示),可以看到MongoDB服务正在运行。

图14 任务管理器
这样安装的MongoDB,每次开机都会自动运行。如果要设置为手动运行,可以使用快捷键“Win+R”打开“运行”对话框,输入“services.msc”,会弹出服务管理界面(如图15所示),在所有服务中就可以找到MongoDB服务“MongoDB Server(MongoDB)”,在“MongoDB Server(MongoDB)”双击鼠标左键,会弹出如图16所示界面,可以在“启动类型”里面把“自动”修改为“手动”,这样,以后就需要在开机以后手动启动MongoDB。手动启动MongoDB的方法是,在开机后,打开服务管理界面,如图15所示,然后在“MongoDB Server(MongoDB)”上面单击鼠标右键,在弹出的菜单中点击“启动”即可。

图15 服务管理界面

图16 MongoDB服务配置界面

二、安装MongoDB Shell

在MongoDB6之前,我们配置完环境变量后,可以直接通过终端输入"mongo"进入MongoDB Shell,但MongoDB6没有mong.exe和mongdb.exe,终端输入"mongo"会报错。因此,我们需要自己下载和安装MongoDB Shell。
访问MongoDB Shell下载地址(https://www.mongodb.com/try/download/shell ),下载MongoDB Shell安装文件,比如mongosh-1.6.2-win32-x64.zip。直接把MongoDB Shell安装文件解压缩到MongoDB安装目录下(如图17所示)。然后,参考之前的操作方法,把“C:\Program Files\MongoDB\Server\6.0\mongosh-1.6.2-win32-x64\bin”添加到PATH环境变量中(如图18所示)。

图17 把MongoDB Shell安装文件解压缩到MongoDB安装目录下

图18 设置环境变量
新建一个cmd窗口,在里面执行如下命令进入MongoDB Shell(如图19所示):

> mongosh


图19 MongoDB Shell界面
进入MongoDB Shell模式以后,默认连接的数据库是test数据库,可以在命令提示符“>”后面输入各种Shell命令来操作MongoDB数据库。
可以输入如下命令退出MongoDB Shell模式:

> exit

或者也可以直接按键盘的Ctrl+C组合键,退出Shell命令模式。

三、MongoDB基础操作

1. 常用操作命令

常用的操作MongoDB数据库的相关命令包括:
(1)show dbs:显示数据库列表;
(2)show collections:显示当前数据库中的集合(类似关系数据库中的表table);
(3)show users:显示所有用户;
(4)use yourDB:切换当前数据库至yourDB;
(5)db.help() :显示数据库操作命令;
(6)db.yourCollection.help() :显示集合操作命令,yourCollection是集合名;
MongoDB没有创建数据库的命令,如果要创建一个名称为“School”的数据库,需要先运行“use School”命令,之后做一些操作,比如,使用命令“db.createCollection('teacher')”创建集合,这样就可以创建一个名称为“School”的数据库。

2.简单操作演示

下面以一个School数据库为例进行操作演示,将在School数据库中创建两个集合teacher和student,并对student集合中的数据进行增、删、改、查等基本操作。需要说明的是,文档数据库中的集合(Collection),相当于关系型数据库中的表(table)。

(1)切换到School数据库

命令如下:

> use School

注意,MongoDB无需预创建School数据库,在使用时会自动创建。

(2)创建集合

创建集合(Collection)的命令如下:

> db.createCollection('teacher')

执行上述命令的屏幕截图如图20所示。

图20 创建集合
实际上,MongoDB在插入数据的时候,也会自动创建对应的集合,无需预定义集合。

(3)插入数据

插入数据的具体命令如下:

> db.student.insertOne({_id:1, sname: 'zhangsan', sage: 20})  #_id可选

运行完以上命令,student已自动创建,这也说明MongoDB不需要预先定义集合(collection),在第一次插入数据后,集合会被自动创建。此时,可以使用“show collections”命令查询数据中当前已经存在的集合,如图21所示。

图21 show collections命令执行结果

(4)查找数据

查找数据所使用的基本命令格式如下:

> db.youCollection.find(criteria, filterDisplay)

其中,criteria表示查询条件,是一个可选的参数;filterDisplay表示筛选显示部分数据,如显示指定某些列的数据,这也是一个可选的参数,但是,需要注意的是,当存在该参数时,第一个参数不可省略,若查询条件为空,可用{}做占位符。
(a)查询所有记录

> db.student.find()

该命令相当于关系数据库的SQL 语句“select * from student”。
(b)查询sname='zhangsan'的记录

> db.student.find({sname: 'zhangsan'})

该命令相当于关系数据库的SQL 语句“select * from student where sname='zhangsan'”。
(c)查询指定列sname、sage数据

> db.student.find({},{sname:1, sage:1})

该命令相当于关系数据库的SQL 语句“select sname,sage from student”。其中,sname:1 表示返回sname列,默认_id字段也是返回的,可以添加_id:0 (意为不返回_id),写成{sname: 1, sage: 1,_id:0 },就不会返回默认的_id字段了。

(d)AND条件查询

> db.student.find({sname: 'zhangsan', sage: 20})

该命令相当于关系数据库的SQL 语句“select * from student where sname = 'zhangsan' and sage = 20”。
(e)OR条件查询

> db.student.find({$or: [{sage: 20}, {sage: 25}]})

该命令相当于关系数据库的SQL 语句“select * from student where sage = 22 or sage = 25”。

(5)修改数据

修改数据的基本命令格式如下:

> db.youCollection.updateOne(criteria, objNew, upsert, multi )

对于该命令做如下说明:
(1)criteria:表示update的查询条件,类似sql update查询内where后面的条件;
(2)objNew : update的对象和一些更新的操作符(如$set)等,也可以理解为SQL语句中的update语句中的set后面的内容。
(3)upsert : 如果不存在update的记录,是否插入objNew,true表示插入,默认是false,表示不插入。
(4)multi: MongoDB默认是false,只更新找到的第一条记录,如果这个参数为true,就会把按条件查出来的多条记录全部更新。默认是false,只修改匹配到的第一条数据。
上面各个参数中,其中criteria和objNew是必选参数,upsert和multi可选参数。
这里给出一个实例,语句如下:

> db.student.updateOne({sname: 'zhangsan'}, {$set: {sage: 22}}, false, true)

该命令相当于关系数据库的SQL 语句“update student set sage =22 where sname = 'zhangsan';”。执行该命令的屏幕截图如图22所示。

图22 修改数据

(6)删除数据

> db.student.remove({sname: 'zhangsan'})

该命令相当于关系数据库的SQL 语句“delete from student where sname='chenliu'”。
执行该命令过程的屏幕截图如图23所示。

图23 删除数据

(7)删除集合

> db.student.drop()

四、使用Python操作MongoDB

Python要连接MongoDB需要MongoDB驱动,这里我们使用pymongo驱动来连接MongoDB。打开一个cmd窗口,执行如下命令在Python中安装pymongo模块(如图24所示):

>pip install pymongo -i https://pypi.tuna.tsinghua.edu.cn/simple


图24 安装pymongo

1.测试数据库是否存在

打开IDLE,新建一个Python文件,输入如下代码:

import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
if "School" in dblist:print("数据库已存在!")

执行上述代码,就可以验证数据库是否存在。

2.查询某集合下的第一条数据

在MongoDB Shell中执行如下命令创建集合并插入一条数据:

> use School
> db.student.insertOne({_id:1, sname: 'zhangsan', sage: 20})

新建一个Python文件,输入如下代码:

import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["School"]
mycol = mydb["student"]
record = mycol.find_one()
print(record)

执行上述代码,就可以查询得到集合student下的第一条数据。

五、采集网页数据保存到MongoDB数据库中

由于很多网站设计了反爬机制,会导致爬取网页失败,因此,这里直接采集一个本地网页文件web_demo1.html,它记录了不同关键词的搜索次数排名,其内容如下:

<html>
<head><title>Search Index</title></head>
<body>
<table>
<tr><td>RANK</td><td>KEY WORD</td><td>SEARCH INDEX</td></tr>
<tr><td>1</td><td>Big Data</td><td>187767</td></tr>
<tr><td>2</td><td>Cloud Computing</td><td>178856</td></tr>
<tr><td>3</td><td>Internet of Things</td><td>122376</td></tr>
</table>
</body>
</html>

编写网络爬虫程序,读取网页内容进行解析,并把解析后的数据保存到MongoDB数据库中,具体代码如下:

# html_to_mongodb.py
import requests
from bs4 import BeautifulSoup
import requests
import pymongo

# 读取本地HTML文件
def get_html():
    path = 'web_demo.html'
    htmlfile= open(path,'r')
    html = htmlfile.read()
    return html

# 解析HTML文件
def parse_html(html):
    soup = BeautifulSoup(html,'html.parser')
    all_tr=soup.find_all('tr')[1:]    
    all_tr_list = []
    info_list = []
    for i in range(len(all_tr)):
        all_tr_list.append(all_tr[i])    
    for element in all_tr_list:
        all_td=element.find_all('td')
        all_td_list = []
        for j in range(len(all_td)):
            all_td_list.append(all_td[j].string)
        #print(all_td_list)
        info_list.append(all_td_list)    
    return info_list

# 保存数据库
def save_mongodb(info_list):
    myclient=pymongo.MongoClient(host='localhost',port=27017)
    mydb=myclient['mydatabase']
    mycol=mydb['searchindex']
    for item in info_list:
        data={
            '_id':item[0],
            'keyword':item[1],
            'index':item[2]
        }
        mycol.insert_one(data)
        print("插入数据")

if __name__ =='__main__':
    html = get_html()
    info_list = parse_html(html)    
    save_mongodb(info_list)

执行代码文件,然后到MongoDB Shell中执行如下语句查看数据:

> use mydatabase
> show collections
> db.searchindex.find()

可以看到,如图25所示,有3条数据被成功插入了数据库中。

图25 查询数据