Python 继续入门4(保存数据)

(提醒)补充.py文件标头

在这里插入图片描述
效果:创建一个.py文件就创建定义标头
在这里插入图片描述

🤵🏼、了解SQLite

1.1 SQLite超便捷简介
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

1.2 SQLite 存储类型
每个存储在 SQLite 数据库中的值都具有以下存储类之一:

存储类描述
NULL值是一个 NULL 值
INTEGER值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中
(亲和类型)INT,INTEGER,TINYINT,SMALLINT,MEDIUMINT,BIGINT,UNSIGNED BIG INT,INT2,INT8
REAL值是一个浮点值,存储为 8 字节的 IEEE 浮点数字
(亲和类型)DOUBLE,DOUBLE PRECISION,FLOAT
TEXT值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储
(亲和类型)CHARACTER(20),VARCHAR(255),VARYING CHARACTER(255),NCHAR(55),NATIVE CHARACTER(70),NVARCHAR(100),CLOB
BLOB值是一个 blob 数据,完全根据它的输入存储
NUMERIC值是一个时间搓类型
(亲和类型)DECIMAL(10,5),BOOLEAN,DATE,DATETIME

👩‍👦、通过实列操作SQLite数据库

1.testSQLite.py:(实列类)

import sqlite3

conn = sqlite3.connect("testsql.db")   #打开或创建db文件

print("Openten............")

c = conn.cursor()   #获取游标

sql = '''
    create table company
    (id int primary key not null,
    name text not null,
    age int not null,
    address char(50),
    salary real);
'''
c.execute(sql)      #执行sql语句
conn.commit()       #提交数据库操作
conn.close()        #执行完关闭

print("成功建表")

2.执行完会在当前目录创建一个testsql.db文件
在这里插入图片描述
3.然后点击最右边框Database进入后点击+号
在这里插入图片描述
4.进入后执行项目文件下创建的testsql.db文件
在这里插入图片描述
5.然后打开后点击Company(表内容)
在这里插入图片描述

👨‍👩‍👦、SQLite数据库进行CUID操作

1.插入数据

conn = sqlite3.connect("testsql.db")   #打开或创建db文件
print("Openten............")
c = conn.cursor()   #获取游标
sql = '''
    insert into company(id,name,age,address,salary)
    values(1,'张三',32,"上海",8000)
'''
sql1 = '''
    insert into company(id,name,age,address,salary)
    values(2,'李四',28,"上海1",10000)
'''
c.execute(sql)      #执行sql语句
c.execute(sql1)      #执行sql语句
conn.commit()       #提交数据库操作
conn.close()        #执行完关闭

print("成功添加")

2.查询数据

conn = sqlite3.connect("testsql.db")   #打开或创建db文件
print("Openten............")

c = conn.cursor()   #获取游标
sql = "select id,name,age,address,salary from company"

cursor = c.execute(sql) #执行sql语句

for row in cursor:
    print("id = ",row[0])
    print("name = ",row[1])
    print("age = ",row[2])
    print("address = ",row[3])
    print("salary = ",row[4],"\n")

conn.commit()       #提交数据库操作
conn.close()        #执行完关闭

print("查询成功")

3.修改数据

conn = sqlite3.connect("testsql.db")   #打开或创建db文件
print("Openten............")

c = conn.cursor()   #获取游标
sql = "update company set name = '吴小姐' where id = 1"

c.execute(sql) #执行sql语句
conn.commit()       #提交数据库操作
conn.close()        #执行完关闭

print("修改成功")

4.删除数据

conn = sqlite3.connect("testsql.db")   #打开或创建db文件
print("Openten............")

c = conn.cursor()   #获取游标
sql = "delete from company  where id = 1"

c.execute(sql) #执行sql语句
conn.commit()       #提交数据库操作
conn.close()        #执行完关闭

print("修改成功")

👨‍👩‍👧‍👦、爬取网页的数据源迁移到SQLite数据库

(重点)1-4步是介绍每个方法的作用>>>>>>第5步是全部源码以及操作数据库
1.得到指定一个URL网页内容

#得到指定一个URL网页内容
def askURL(url):
    head = {  # 1.模拟一个游览器头部信息
        "User-Agent": " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
    }
    request = urllib.request.Request(url, headers=head)  # 2.封装请求头传递参数
    html = ""
    try:
        response = urllib.request.urlopen(request)  # 3.请求参数响应到需要爬取的网页中
        html = response.read().decode("utf-8")  # 4.进行编码格式防止乱码
        # print(html)
    except urllib.error.URLError as e:  # 5.异常处理以及捕捉异常
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)

    return html  # 6.返回一个html网页数据

2.爬取网页

# 爬取网页
def getData(baseUrl):
    datalist = []

    for i in range(0, 10):  # 1.调用获取页面信息的函数·十次
        url = baseUrl + str(i * 25)  # 2.每进入一遍读取25次数据
        # 2.获取数据
        html = askURL(url)  # 3.保存获取到的网页源码
        soup = BeautifulSoup(html, "html.parser")  # 1.获取到html类型的数据
        # 3.逐一解析数据
        for item in soup.find_all("div", class_="item"):  # 2.循环遍历符合指定字符串,形成列表
            # print(item)                                   #3.测试:获取到指定内容的所有信息
            data = []  # 4.保存一组指定的数据
            item = str(item)  # 5.把遍历出来的item数据转为字符串
            alink = re.findall(finlink, item)[0]  # 6.使用re正则查找符合指定字符串
            data.append(alink)  # 7.保存到data
            imglink = re.findall(finimg, item)[0]
            data.append(imglink)  # 添加图片
            titlelink = re.findall(fintitle, item)
            if (len(titlelink) == 2):  # 查询出来有两条相同数据需要不同添加
                ctitle = titlelink[0]
                data.append(ctitle)  # 添加名称
                otitle = titlelink[1].replace("/", "")  # replace替换函数("条件","替换")
                data.append(otitle)
            else:
                data.append(titlelink[0])
                data.append(' ')  # 给相同列流于位置

            ratinglink = re.findall(finrating, item)[0]
            data.append(ratinglink)  # 添加评分

            judgelink = re.findall(finpj, item)[0]
            data.append(judgelink)  # 添加评价

            inqlink = re.findall(fininq, item)
            if (len(inqlink) != 0):
                inq = inqlink[0].replace("。", "")
                data.append(inq)  # 添加概况
            else:
                data.append(" ")  # 保留位置为空

            bd = re.findall(finBd, item)[0]  # 添加内容
            bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)  # 替换指定内容
            bd = re.sub('/ ', " ", bd)
            data.append(bd.strip())  # strip()去左右空格

            # 把解析好的数据添加到datalist中
            datalist.append(data)
            # print(datalist)
    return datalist

3.初始化数据库(创建新的表)

# 初始化数据库
def init_db(dbpath):
    # movie250 = ('id', '电影链接', '电影图片链接', '中文电影名', '英文电影名', '电影评分', '电影评价', '电影概况', '电影的相关内容')
    sql = '''
        create table movie250
         (
         id integer primary key autoincrement,
         info_link text,
         pic_link text,
         cname varchar,
         ename varchar,
         score numeric,
         rated numeric,
         instroduction text,
         info text 
         )
    '''
    conn = sqlite3.connect(dbpath)
    conn.execute(sql)
    conn.commit()
    conn.close()

4.保存datalist网页数据

# 保存数据 .db方式
def saveData2DB(datalist, dbpath):
    init_db(dbpath)  # 创建表内容
    conn = sqlite3.connect(dbpath)  # 创建db连接文件
    cur = conn.cursor()  # 获取游标

    for data in datalist:  # 遍历datalist
        for index in range(len(data)):  # 获取data长度
            if index == 4 or index == 5:
                continue
            data[index] = '"' + data[index].strip() + '"'  # 拼接字符串
            sql = '''
                        insert into movie250
                        (info_link,pic_link,cname,ename,score,rated,instroduction,info)
                         values (%s)
                  '''%",".join(data)
        # print(sql)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()

5.连接sqlist数据库查看保存的数据

第一步:先上源码

# -*- codeing = utf-8 -*-
# @Time  2020-12-6
# @Author: Hjj
# @File: Demo1.py
# @Software: PyCharm

from bs4 import BeautifulSoup  # 1.网页解析~获取数据
import re  # 2.正则表达式~进行文字匹配
import urllib.request, urllib.error  # 3.制定URL~获取网页数据
import xlwt  # 4.进行保存Excel操作
import sqlite3  # 5.进行SQLite数据库操作


def main():
    baseUrl = "https://movie.douban.com/top250?start="
    # 1.爬取网页
    datalist = getData(baseUrl)
    # 4.保存数据
    dbpath = "movie.db"
    saveData2DB(datalist, dbpath)


# 获取影片的链接
finlink = re.compile(r'<a href="(.*?)">')  # 指定读取详情规则
# 获取影片图片
finimg = re.compile(r'<img.* src="(.*?)"', re.S)  # re包中S函数去除换行避免获取不全数据
# 获取影片片名
fintitle = re.compile(r'<span class="title">(.*)</span>')
# 获取影片评分
finrating = re.compile(r'<span class="rating_num" .*>(.*)</span>')
# 获取影片评价
finpj = re.compile(r'<span>(\d*)人评价</span>')
# 找到概况
fininq = re.compile(r'<span class="inq">(.*)</span>')
# 获取影片的相关内容
finBd = re.compile(r'<p class="">(.*?)</p>', re.S)


# 爬取网页
def getData(baseUrl):
    datalist = []

    for i in range(0, 10):  # 1.调用获取页面信息的函数·十次
        url = baseUrl + str(i * 25)  # 2.每进入一遍读取25次数据
        # 2.获取数据
        html = askURL(url)  # 3.保存获取到的网页源码
        soup = BeautifulSoup(html, "html.parser")  # 1.获取到html类型的数据
        # 3.逐一解析数据
        for item in soup.find_all("div", class_="item"):  # 2.循环遍历符合指定字符串,形成列表
            # print(item)                                   #3.测试:获取到指定内容的所有信息
            data = []  # 4.保存一组指定的数据
            item = str(item)  # 5.把遍历出来的item数据转为字符串
            alink = re.findall(finlink, item)[0]  # 6.使用re正则查找符合指定字符串
            data.append(alink)  # 7.保存到data
            imglink = re.findall(finimg, item)[0]
            data.append(imglink)  # 添加图片
            titlelink = re.findall(fintitle, item)
            if (len(titlelink) == 2):  # 查询出来有两条相同数据需要不同添加
                ctitle = titlelink[0]
                data.append(ctitle)  # 添加名称
                otitle = titlelink[1].replace("/", "")  # replace替换函数("条件","替换")
                data.append(otitle)
            else:
                data.append(titlelink[0])
                data.append(' ')  # 给相同列流于位置

            ratinglink = re.findall(finrating, item)[0]
            data.append(ratinglink)  # 添加评分

            judgelink = re.findall(finpj, item)[0]
            data.append(judgelink)  # 添加评价

            inqlink = re.findall(fininq, item)
            if (len(inqlink) != 0):
                inq = inqlink[0].replace("。", "")
                data.append(inq)  # 添加概况
            else:
                data.append(" ")  # 保留位置为空

            bd = re.findall(finBd, item)[0]  # 添加内容
            bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)  # 替换指定内容
            bd = re.sub('/ ', " ", bd)
            data.append(bd.strip())  # strip()去左右空格

            # 把解析好的数据添加到datalist中
            datalist.append(data)
            # print(datalist)
    return datalist


# 得到指定一个URL网页内容
def askURL(url):
    head = {  # 1.模拟一个游览器头部信息
        "User-Agent": " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
    }
    request = urllib.request.Request(url, headers=head)  # 2.封装请求头传递参数
    html = ""
    try:
        response = urllib.request.urlopen(request)  # 3.请求参数响应到需要爬取的网页中
        html = response.read().decode("utf-8")  # 4.进行编码格式防止乱码
        # print(html)
    except urllib.error.URLError as e:  # 5.异常处理以及捕捉异常
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)

    return html  # 6.返回一个html网页数据



# 保存数据 .db方式
def saveData2DB(datalist, dbpath):
    init_db(dbpath)  # 创建表内容
    conn = sqlite3.connect(dbpath)  # 创建db连接文件
    cur = conn.cursor()  # 获取游标

    for data in datalist:  # 遍历datalist
        for index in range(len(data)):  # 获取data长度
            if index == 4 or index == 5:
                continue
            data[index] = '"' + data[index].strip() + '"'  # 拼接字符串
            sql = '''
                        insert into movie250
                        (info_link,pic_link,cname,ename,score,rated,instroduction,info)
                         values (%s)
                  '''%",".join(data)
        # print(sql)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()


# 初始化数据库
def init_db(dbpath):
    # movie250 = ('id', '电影链接', '电影图片链接', '中文电影名', '英文电影名', '电影评分', '电影评价', '电影概况', '电影的相关内容')
    sql = '''
        create table movie250
         (
         id integer primary key autoincrement,
         info_link text,
         pic_link text,
         cname varchar,
         ename varchar,
         score numeric,
         rated numeric,
         instroduction text,
         info text 
         )
    '''
    conn = sqlite3.connect(dbpath)
    conn.execute(sql)
    conn.commit()
    conn.close()


# 执行指定函数
if __name__ == "__main__":
    main()
    print("爬取完毕.................................")

第二步: 执行成功状态

在这里插入图片描述

第三步:连接数据库查询保存的网页数据源

3.1 点击Database加入+号点击Data Source选择SQList

在这里插入图片描述

3.2 选择File指向创建的.db文件

在这里插入图片描述

3.3 连接成功出现对应的.db文件内容打开schemas>>main>>表
在这里插入图片描述

3.4 检查一下数据是否正确(保存数据完成)

在这里插入图片描述

  • 16
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值