1.安装mongoDB数据库
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)   #向数据表中插入对象
①初始化数据库连接
importrequestsimportlxmlimportreimportpymongofrom bs4 importBeautifulSoup
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 intable_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)
>>>table.insert_many(dic3)
>>>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
>>> 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'}})
>>> table.update_many({'age':25},{'$set':{'hobby':'running'}})
⑦删除记录
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})
>>> table.delete_many({'age':28})
附:爬取豆瓣书籍信息
importrequestsimportlxmlimportreimportpymongofrom bs4 importBeautifulSoup
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 inurllist:
req=requests.get(url)
soup= BeautifulSoup(req.text,'lxml')
book_all= soup.find('ul',class_='subject-list').find_all('li')for li inbook_all:
dic={}
dic['书名'] = li.h2.text.replace(' ','').replace('\n','')
dic['其他信息'] = li.find('div',class_ = 'pub').text.replace(' ','').replace('\n','')
dic['评分'] = li.find('span',class_ = 'rating_nums').text
comment= li.find('span',class_ = 'pl').text.replace(' ','').replace('\n','')
dic['评价人数'] = re.search('\d+',comment).group(0)
table.insert_one(dic)