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

:爬取网页数据通过SQLite保存到数据库中............

  • 、了解SQLite
  • ‍、通过实列操作SQLite数据库
  • ‍‍、SQLite数据库进行CUID操作
  • ‍‍‍、爬取网页的数据源迁移到SQLite数据库

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

Python 继续入门4(保存数据)_第1张图片
效果:创建一个.py文件就创建定义标头
Python 继续入门4(保存数据)_第2张图片

、了解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文件
Python 继续入门4(保存数据)_第3张图片
3.然后点击最右边框Database进入后点击+号
Python 继续入门4(保存数据)_第4张图片
4.进入后执行项目文件下创建的testsql.db文件
Python 继续入门4(保存数据)_第5张图片
5.然后打开后点击Company(表内容)
Python 继续入门4(保存数据)_第6张图片

‍‍、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('(\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'')  # 指定读取详情规则
# 获取影片图片
finimg = re.compile(r', re.S)  # re包中S函数去除换行避免获取不全数据
# 获取影片片名
fintitle = re.compile(r'(.*)')
# 获取影片评分
finrating = re.compile(r'(.*)')
# 获取影片评价
finpj = re.compile(r'(\d*)人评价')
# 找到概况
fininq = re.compile(r'(.*)')
# 获取影片的相关内容
finBd = re.compile(r'

(.*?)

'
, 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('(\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

Python 继续入门4(保存数据)_第7张图片

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

Python 继续入门4(保存数据)_第8张图片

3.3 连接成功出现对应的.db文件内容打开schemas>>main>>表
Python 继续入门4(保存数据)_第9张图片

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

Python 继续入门4(保存数据)_第10张图片

你可能感兴趣的:(Python,python,mysql,java,sqlite,数据库)