1.安装mongoDB数据库
我是在windows环境中安装的mongoDB,方法见https://www.cnblogs.com/Forever77/p/11193704.html
2.安装pymongo模块
windows环境中,直接在cmd命令窗口中执行pip3 install pymongo
验证是否安装成功,通过python进入交互环境,输入import pymongo不报错即可
3.python操作mongoDB基本方法
- from pymongo import MongoClient #导入模块
- client = MongoClient('mongodb://username:password@ip:port') #初始化数据库连接
- database = client['dbname'] #创建数据库
- table = database['tablename'] #创建数据库中的表
- table.insert(dic) #向数据表中插入对象
以下以通过requests爬取豆瓣https://book.douban.com/tag/%E6%BC%AB%E7%94%BB?start=0&type=T的书籍信息为例进行说明。
①初始化数据库连接
import requests import lxml import re import pymongo from bs4 import BeautifulSoup myclient = pymongo.MongoClient('mongodb://localhost:27017/')#本地计算机ip可使用localhost表示,此种情况参数可直接省略
如果mongoDB运行在本地且没有修改过默认端口(27017),也没有设置权限验证,那么初始化连接的参数可以直接省略,client = MongoClient()
如果没有设置权限验证,可省略用户名和密码部分,client = MongoClient('mongodb://ip:port')
如果运行在本地但是设置了权限验证,可省略ip和port部分,client = MongoClient('mongodb://username:password')
②创建数据库
db = myclient['douban'] # db = myclient.douban
创建数据库可通过方括号或者.方法,创建数据表同理。
③创建数据表,即collection
table = db['book'] # table = db.book
如果要对多个数据库或表进行操作,通常将库名或表名保存在列表中,然后使用循环通过方括号来操作。
table_name=['book1','book2','book3','book4','book5'] for table in table_name: table = db[table] ...
④插入记录
insert_one(),参数为字典,每次只能插入一条记录
insert_many(),参数为由字典组成的列表,一次可插入多条记录
insert(), 既可插入字典也可插入由字典组成的列表,insert()方法正在被遗弃
例如随意创建一个数据库school,再在school中创建一个集合student,存储学生的姓名、年龄和爱好。
>>> db = myclient['school'] >>> table = db['student'] >>> dic1 = {'name':'Alice','age':23,'hobby':'dance'} >>> dic2 = {'name':'Jack','age':25,'hobby':'football'} >>> dic3 = [ {'name':'Jane','age':26,'hobby':'panio'}, {'name':'Bob','age':25,'hobby':'tennis'}] >>> dic4 = [ {'name':'Alan','age':22,'hobby':'paint'}, {'name':'Smith','age':24,'hobby':'sing'}] >>> table.insert(dic1) ObjectId('5dd8ba03202fc313bb9d053b') >>> table.insert_one(dic2) <pymongo.results.InsertOneResult object at 0x0000028B17582E48> >>> table.insert_many(dic3) <pymongo.results.InsertManyResult object at 0x0000028B175B6DC8> >>> table.insert(dic4) [ObjectId('5dd8ba1a202fc313bb9d053f'), ObjectId('5dd8ba1a202fc313bb9d0540')]
可以看到insert()的返回会返回插入记录的主键,而insert_one()和insert_many()返回一个pymongo结果对象,不过这对插入结果并没有什么影响。
⑤查询记录
table.find(查询条件,列筛选),查询条件和列筛选都用字典形式表达
find()的返回结果是一个可迭代的pymongo对象,需要通过循环将内容取出。
>>> result1 = table.find({'age':25},{'_id':0,'age':0}) >>> result1 <pymongo.cursor.Cursor object at 0x0000028B175867F0> >>> result2 = [s for s in table.find({'age':25},{'_id':0,'age':0})] >>> result2 [{'name': 'Jack', 'hobby': 'football'}, {'name': 'Bob', 'hobby': 'tennis'}] >>> result3 = [s for s in table.find({'age':{'$gt':23,'$lte':25}},{'_id':0})] >>> result3 [{'name': 'Jack', 'age': 25, 'hobby': 'football'}, {'name': 'Bob', 'age': 25, 'hobby': 'tennis'}, {'name': 'Smith', 'age': 24, 'hobby': 'sing'}]
⑥更新记录
update_one({查询条件},{更新操作}) 更新满足条件的第一条记录
update_many({查询条件},{更新操作}) 更新所有满足条件的记录
update({查询条件},{更新操作}) 更新满足条件的第一条记录,update()用法正在被淘汰
>>> table.update({'age':25},{'$set':{'hobby':'reading'}}) {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True} >>> table.update_one({'age':25},{'$set':{'hobby':'football'}}) <pymongo.results.UpdateResult object at 0x0000028B175C0988> >>> table.update_many({'age':25},{'$set':{'hobby':'running'}}) <pymongo.results.UpdateResult object at 0x0000028B175C0348>
⑦删除记录
delete_one({查询条件},{更新操作}) 删除满足条件的第一条记录
delete_many({查询条件},{更新操作}) 删除所有满足条件的记录
没有delete()方法
>>> dic5= [ {'name':'Alex1','age':28,'hobby':'skiing'}, {'name':'Alex2','age':28,'hobby':'skiing'}, {'name':'Alex3','age':28,'hobby':'skiing'}] >>> table.insert(dic5) [ObjectId('5dda508b202fc313bb9d0541'), ObjectId('5dda508b202fc313bb9d0542'), ObjectId('5dda508b202fc313bb9d0543')] >>> table.delete_one({'age':28}) <pymongo.results.DeleteResult object at 0x0000028B17582748> >>> table.delete_many({'age':28}) <pymongo.results.DeleteResult object at 0x0000028B175B66C8>
附:爬取豆瓣书籍信息
import requests import lxml import re import pymongo from bs4 import BeautifulSoup myclient = pymongo.MongoClient() db = myclient['douban'] table = db['book'] # use douban urllist = [] for i in range(10): url = 'https://book.douban.com/tag/%E6%BC%AB%E7%94%BB?start='+str(20*i)+'&type=T' urllist.append(url) for url in urllist: req = requests.get(url) soup = BeautifulSoup(req.text,'lxml') book_all = soup.find('ul',class_='subject-list').find_all('li')for li in book_all: dic = {} dic['书名'] = li.h2.text.replace(' ','').replace(' ','') dic['其他信息'] = li.find('div',class_ = 'pub').text.replace(' ','').replace(' ','') dic['评分'] = li.find('span',class_ = 'rating_nums').text comment = li.find('span',class_ = 'pl').text.replace(' ','').replace(' ','') dic['评价人数'] = re.search('d+',comment).group(0) table.insert_one(dic)