(提醒)补充.py文件标头
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 |
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(表内容)
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("修改成功")
(重点)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
3.2 选择File指向创建的.db文件
3.3 连接成功出现对应的.db文件内容打开schemas>>main>>表
3.4 检查一下数据是否正确(保存数据完成)