爬虫与Python:(四)爬虫进阶二之数据存储(数据库存储)——6.MongoDB存储
MongoDB是由C++ 语言编写的,它是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,开源保证服务器的性能。MongoDB旨在为Web服务器提供可扩展性的存储解决方案。它将数据存储为一个文档,数据由键值(key => value)组成。MongoDB文档类似于JSON对象。字段值开源包含其他文档、数组及文档数组。
基于这些优势,所以经常在爬虫中涉及数据保存到MongoDB中,以便数据清洗。要确保已安装MongoDB。安装教程详见:https://www.cnblogs.com/luyj00436/p/15514788.html。
安装驱动
在Python中,要连接和使用mongoDB,就需要MongDB驱动,这里使用PyMongoDB驱动来连接。用户可以使用pip命令来安装。
python3 -m pip3 install pymongo
安装完成后,创建一个测试文件demo_test_mongodb.py。执行以下代码,如果没有出现错误,则表示安装成功。
import pymongo
1. 创建数据库
创建数据库需要使用MongoClient对象,并且指定连接的URL地址和数据库名称。在以下示例中,创建数据test_db。
1 import pymongo 2 3 # 创建数据库 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"]
2. 创建集合
MongoDB的集合类似SQL 的表。MongoDB使用数据库来创建集合,示例代码如下:
1 import pymongo 2 3 # 创建集合 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"] 6 mycol = mydb["site"] # 创建集合
在MongoDB中,集合只有自内容插入后才会创建。也就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正的创建。
3. 插入文档
MongoDB中的一个文档类似SQL表中的一条记录。在集合中插入文档使用insert_one()方法,该方法的第一个参数是字典name=>value对。以下示例向sites集合中插入文档。
1 import pymongo 2 3 # 插入文档 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"] 6 mycol = mydb["site"] # 创建集合 7 8 mydict = {"name":"张三", "age":23 , "gender":"男"} 9 x = mycol.insert_one(mydict) 10 print(x)
运行后控制台会输出:
4. 插入多个文档
在集合中插入多个文档适用insert_many()方法,该方法的第一参数是字典列表,示例代码如下:
1 import pymongo 2 3 # 插入多个文档 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"] 6 mycol = mydb["site"] # 创建集合 7 8 mylist =[ 9 {"name":"张三","age":23,"gender":"男"}, 10 {"name":"李四","age":23,"gender":"男"}, 11 {"name":"张三","age":23,"gender":"男"}, 12 {"name":"张三","age":23,"gender":"男"}, 13 ] 14 x = mycol.insert_many(mylist) 15 # 输入插入的所有文档对应的id值 16 print(x.inserted_ids)
运行后控制台输出:
5. 查询文档
MongoDB使用了find和find_one方法来查询集合中的数据,它类似SQL中的SELECT语句。用户可以使用find_one()方法来查询集合中的一条数据,下面查询sites文档中的一条数据,代码如下:
1 import pymongo 2 3 # 查询单个文档 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"] 6 mycol = mydb["site"] 7 8 x = mycol.find_one() 9 print(x)
运行后,控制台会输出当前值:
{'_id': ObjectId('6185268a346c50e66086702c'), 'name': '张三', 'age': 23, 'gender': '男'}
6. 查询集合中所有数据
find()方法可以查询集合中所有数据,类似于SQL中的SELECT * 操作。以下示例代码查找sites集合中的所有数据。
1 import pymongo 2 3 # 查询集合中所有数据 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"] 6 mycol = mydb["site"] 7 8 for x in mycol.find(): 9 print(x)
7.修改数据
用户可以在MongoDB中使用update_one()方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多于一条,则会修改第一条。
1 import pymongo 2 3 # 修改第一条name等于张三的属性为age为20 4 myclient = pymongo.MongoClient("mongodb://localhost:27017") 5 mydb = myclient["test_db"] 6 mycol = mydb["site"] 7 8 myquery={"name":"张三"} 9 newvalues = {"$set":{"age":20}} 10 mycol.update_one(myquery , newvalues) 11 12 for x in mycol.find(): 13 print(x)