python将爬虫得到的数据导入数据库并实现增删改查(保姆级)
1.创建数据库并导入数据
#导包
from pymongo import MongoClient
import csv
# 创建连接MongoDB数据库函数,插入数据
def insertToMongoDB():
conn = MongoClient("localhost") # 1:连接本地MongoDB数据库服务
db = conn.Tools # 2:连接本地数据库。没有时会自动创建
set1 = db.data # 3:创建集合
set1.delete_many({}) # 4:看情况是否选择清空
with open('tools.csv','r',encoding='utf-8')as csvfile:# 打开文件,这里是爬虫得到的数据
reader=csv.DictReader(csvfile) # 调用csv中的DictReader函数直接获取数据为字典形式
counts=1 # 创建一个counts计数一下
for each in reader:
cnt = str(counts)
each["_id"] = cnt
#这里加'_id'是因为数据库中创建的字典会给一个'_id',如果不想用它默认给的就自己提前创建一个
set1.insert_one(each)
counts += 1
print('成功添加了'+cnt+'条数据 ')
#注意这个函数全局只用一次即可导入数据到数据库。不需要重复用,每次调用都会将你之前创好的数据库删了重来!
2.打印全部信息
def ST():
#这里单独又执行了连接数据库的操作
conn=MongoClient("localhost")
db=conn.Tools
set1=db.data
res = set1.find()
for row in res:
for i,j in row.items():
print(i,";",j)
3.查询单条信息
#查询单行信息,这里做的是不管你输入什么字段,多少个字段的数据都能查出,不完整数据也可以,但是需要将数据放到一个字典作为参数传入。
def Search(dict):
#连接数据库,上面的方式和这种方式都可以
conn = MongoClient("localhost")
db = conn["Tools"]
set1 = db["data"]
#将字典中的每个字段都作为查找依据
lista=[]
listb=[]
for i,j in dict.items():
lista.append(i)#存放字典的键
listb.append(j)#存放字典的值
Slist=[]
for q in range(len(lista)):
#这里单独将id拿出来是因为id字段不会重复,按id查询结果肯定只有一条,查到了就可以返回,节省时间
if lista[q]=='_id':
try:
res=set1.find({lista[q]:listb[q]})
list1=[]
list1.append(res[0])
return list1
except:
return []
res=set1.find()
for row in res:
for i, j in row.items():
#str.find(a,b)能够判断b是否是a的子串,如果是字串则返回b在a中的位置,不是则返回-1.所以即使输入的是不完整信息也能够实现查询
if i==lista[q] and str.find(j,listb[q])!=-1:
Slist.append(row)
#下面做的是删除掉查询中查到多次的信息。因为上面的是可以分别根据所给的每个字段查询一遍,最终给出的是并集,可能会有重复。(过程繁琐,可删)
l=[]
ll=[]
for i in Slist:
l.append(i['_id'])
#列表去重并保持原顺序不变
lq = list(set(l))
lq.sort(key=l.index)
j=0
for i in Slist:
if i['_id'] == lq[j]:
ll.append(i)
j += 1
else:
pass
if len(ll) == 0:
return False, ll
else:
return True, ll
4.增加信息
#这里用户不增加完整的信息,只增加几条字段也可以(但必须有id号),同样需要传入字典
def Add(dict):
#这个字典是一个包含所有键值的字典,当用户输入不完整信息,比如他只输入一个ToolName和id。那么其他的值自动补上Unknown
aaaa = {'_id': 'Unknown',
'ToolName': 'Unknown',
'ToolIntroduc': 'Unknown',
'ToolURL': 'Unknown',
'ToolColumns': 'Unknown',
'ToolKeyword': 'Unknown'}
for i, j in dict.items():
aaaa[i] = j
#连接数据库
conn = MongoClient("localhost")
db = conn["Database"]
set1 = db["data"]
res = set1.find()
flag=1
for row in res:
if row['_id'] == aaaa['_id']:
flag=0
if flag==1:
set1.insert_one(aaaa)
print('增加成功!')
else :
print('增加失败!')#当新增的id号在数据库中已经存在,则不添加进去
5.删除信息
#输入ID号直接删除
def Delete(ID):
conn = MongoClient("localhost")
db = conn["Tools"]
set1 = db["data"]
try:
res = set1.find({"_id": ID})
set1.delete_one(res[0])
print("删除成功!")
except:
print("删除失败!")
6.修改信息
#这里需要传入完整的,拥有所有键值对的字典以便将一条记录全部更新
def Update(dict):
conn = MongoClient("localhost")
db = conn["Tools"]
set1 = db["data"]
ID=dict['_id']
try:
res = set1.find({"_id": ID})
qqq = res[0]
for i,j in dict.items():
qqq[i]=j
#这里本人用update报错,但是应该有更简便的方法,欢迎指点
set1.delete_one(res[0])#删除原有信息
set1.insert_one(qqq)#插入更新后的信息
print('更新成功!')
except:
print('更新失败!')