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('更新失败!')