2019-05-25 Python之Mongodb的使用

曾经终败给现在 2021-11-10 23:24 295阅读 0赞

Mongodb学习总结:  

  one.插入数据pass  

  two.查看数据pass  

  three.修改数据pass

  four.数据排序pass

  five.删除数据pass

一.安装Mongodb

  https://www.cnblogs.com/ymzm204/p/10947055.html

二.测试Mongodb

  (1)引入相关库

  1. import pymongo

  (2)连接数据库

  1. client = pymongo.MongoClient(host='localhost', port=27017

  (3)写入数据并且输出

  1. import pymongo
  2. myclient = pymongo.MongoClient(host='localhost', port=27017) #连接
  3. my_set1 = myclient.University.test #连接University,如果没有则创建一个数据库
  4. my_set2 = myclient.University.test2 #连接University,如果没有则创建一个数据库
  5. dblist = myclient.list_database_names() #所有的数据库名字列表
  6. print(dblist)              #查看已有的数据库
  7. my_set1.insert_one({
  8. "name":"zhangsan"}) #插入一个数据
  9. my_set2.insert_one({
  10. "name":"zhangsan"})
  11. for i in my_set1.find():
  12. print(i) #输出

  (4)结果1623092-20190525152232218-1385640163.png

三.实例运用——爬取中国大学排名并写入数据库,外加查询and创新

  (1)爬取过程中到的数据写入数据库

  1. from bs4 import BeautifulSoup
  2. import requests
  3. import pandas as pd
  4. import pymongo
  5. def client_Mongodb(port, path):
  6. myclient = pymongo.MongoClient(host='localhost', port=port) # 连接
  7. my_set = myclient.path # 连接path,如果没有则创建一个数据库
  8. return my_set
  9. def save_mongo(result):
  10. myclient = pymongo.MongoClient(host='localhost', port=27017)
  11. my_set = myclient.University.ranking
  12. try:
  13. if my_set.product.insert_one(result): #如果保存成功
  14. pass#print("数据保存成功")
  15. except Exception:
  16. print("数据保存失败")
  17. def save_list_to_Mongodb(lists):
  18. my_set = client_Mongodb(27017, 'University.ranking')
  19. product = {
  20. '排名': lists[0],
  21. '学校名称': lists[1],
  22. '省份': lists[2],
  23. '总分': lists[3],
  24. '生源质量(新生高考成绩得分)': lists[4],
  25. '培养结果(毕业生就业率': lists[5],
  26. '社会声誉(社会捐赠收入·千元': lists[6],
  27. '科研规模(论文数量·篇)': lists[7],
  28. '科研质量(论文质量·FWCI)': lists[8],
  29. '顶尖成果(高被引论文·篇)': lists[9],
  30. '顶尖人才(高被引学者·人)': lists[10],
  31. '科技服务(企业科研经费·千元': lists[11],
  32. '成果转化(技术转让收入·千元)': lists[12],
  33. '学生国际化(留学生比例)': lists[13],
  34. } # 字典类型数据
  35. save_mongo(product)
  36. def getHTMLText(url):
  37. try:
  38. r = requests.get(url, timeout=10)
  39. r.raise_for_status()
  40. r.encoding = 'utf-8'
  41. return r.text
  42. except:
  43. return ""
  44. def filUnivList(soup):
  45. data = soup.find_all('tr')
  46. for tr in data:
  47. ltd = tr.find_all('td')
  48. if len(ltd) == 0:
  49. continue
  50. singleUniv = []
  51. for td in ltd:
  52. singleUniv.append(td.string)
  53. save_list_to_Mongodb(singleUniv)
  54. def main():
  55. url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
  56. html = getHTMLText(url)
  57. soup = BeautifulSoup(html, "html.parser")
  58. filUnivList(soup)
  59. print("完成")
  60. for i in pymongo.MongoClient(host='localhost', port=27017).University.ranking.product.find():
  61. print(i) # 输出
  62. main()

结果:

1623092-20190525171001343-2076521510.png

  (2)csv格式文件写入到Mongodb数据库中

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2018/10/21 11:31
  4. # @Author : deli Guo
  5. # @Site :
  6. # @File : csv文件存入mongoDB.py
  7. # @Software : PyCharm
  8. # 导包
  9. import pymongo
  10. import csv
  11. # 创建连接MongoDB数据库函数
  12. def connection():
  13. # 1:连接本地MongoDB数据库服务
  14. myclient = pymongo.MongoClient("localhost")
  15. # 2:连接本地数据库(guazidata)。没有时会自动创建
  16. db = myclient.University
  17. # 3:创建集合
  18. my_set = db.ranking.product_test
  19. # 4:看情况是否选择清空
  20. my_set.delete_many({})
  21. return my_set #返回集合
  22. def insertToMongoDB(my_set):
  23. # 打开文件guazi.csv
  24. with open("E://testcsv.csv", 'r') as csvfile:
  25. # 调用csv中的DictReader函数直接获取数据为字典形式
  26. reader = csv.DictReader(csvfile)
  27. # 创建一个counts计数一下 看自己一共添加了了多少条数据
  28. counts = 0
  29. for each in reader:
  30. # 将数据中需要转换类型的数据转换类型。原本全是字符串(string)。
  31. '''each['index']=int(each['index'])
  32. each['价格']=float(each['价格'])
  33. each['原价']=float(each['原价'])
  34. each['上牌时间']=int(each['上牌时间'])
  35. each['表显里程']=float(each['表显里程'])
  36. each['排量']=float(each['排量'])
  37. each['过户数量']=int(each['过户数量'])
  38. '''
  39. my_set.insert_one(each)
  40. counts += 1
  41. print('成功添加了'+str(counts)+'条数据 ')
  42. # 创建主函数
  43. def main():
  44. my_set = connection()
  45. insertToMongoDB(my_set)
  46. # 判断是不是调用的main函数。这样以后调用的时候就可以防止不会多次调用 或者函数调用错误
  47. if __name__=='__main__':
  48. main()

  (3)查询某大学排名,查询某省份所有大学,排序X条件的大学

    (one)

  1. import pymongo
  2. myclient = pymongo.MongoClient(host='localhost', port=27017)#连接
  3. mydb = myclient.University #数据库
  4. mycol = mydb.ranking.product_test #集合
  5. myquery = {
  6. "学校名称": "广东技术师范大学"}
  7. for i in mycol.find(myquery):
  8. print(i)

输出结果:{’_id’: ObjectId(‘5cea018c8aac013e249fe115’), ‘’: ‘286’, ‘排名’: ‘287’, ‘学校名称’: ‘广东技术师范大学’, ‘省份’: ‘广东’,……………………..省略..}

    (two)

  1. myquery = {
  2. "省份": "广东"}

输出结果:

1623092-20190530093534992-423958297.png

    (three)降序,条件为省份为 广 字开头

  1. myquery = {
  2. "省份": { "$regex": "广"}}
  3. for i in mycol.find(myquery).sort("排名", -1):
  4. print(i)

输出:可以发现 降序指按第一个数字为准,猜测原因:“排名”数据保存到数据库时候是以 str 形式保存的,为此,修改为int可能会有效 下面为已经更改类型后的测试

1623092-20190530093649185-2040114658.png

  (4)综合算法得出新排名并保存为一个新表

  思路:添加新字段,同时根据算法添加新数据。

  1. import pymongo
  2. import re
  3. myclient = pymongo.MongoClient(host='localhost', port=27017)
  4. my_set = myclient.University
  5. my_doc = my_set.ranking.product_test
  6. #my_doc.insert_one({"name": "{}"})
  7. weight = [0.9, 0.9, 0.8, 0.0001, 0.001, 1, 0.01, 1, 0.00001, 0.0001, 1] #权重 注意不要是str
  8. i = 0
  9. my_set.ranking.product_new = my_doc
  10. for c in my_doc.find(): #所有的数据,分行获取,处理
  11. temp_data_list = []
  12. k = 0 # 设置k的初始值
  13. for b in c.values(): #字典里所有的值
  14. temp_data_list.append(b) #把值加入到列表
  15. temp_data_list2 = temp_data_list[5:16] #获取列表里面有用数据 第 6-15 个
  16. for data in range(len(temp_data_list2)): #进一步数据处理
  17. if temp_data_list2[data] == '': #把 None 补为0
  18. temp_data_list2[data] = '0' #这里有个小坑,不能赋值 为0 因为下面要去除 %和其他符号,提取数字,0为int,不是str,会有错误
  19. temp_data_list2[data] = float(re.sub("[^\d.]", "", temp_data_list2[data])) #正则表达式中'[^\d.]'表示除了数字和.),并用""替换,然后返回的就是只剩下数字的字符串 去除有 > 号的干扰,并转换为float
  20. k += temp_data_list2[data] * weight[data] #算法
  21. b = '%.2f' % k #改为小数点后两位
  22. #my_doc.update_one({}, {'$unset': {'新排名': ''}})
  23. my_doc.update_one({
  24. '_id': c['_id']}, {
  25. '$set': {
  26. '新总分': b}})
  27. i += 1
  28. print("已更新{}条数据".format(i))

1623092-20190528220028910-839384029.png

存在的小问题:部分值为空,在使用算法时候需要注意

1.部分value竟然不是str, (124 中央民族大学)

2.存在>号,需要处理

转载于:https://www.cnblogs.com/ymzm204/p/10922612.html

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读