本专栏是以杨秀璋老师爬虫著作《Python网络数据爬取及分析「从入门到精通」》为主线、个人学习理解为主要内容,以学习笔记形式编写的。 本专栏不光是自己的一个学习分享,也希望能给您普及一些关于爬虫的相关知识以及提供一些微不足道的爬虫思路。 专栏地址:Python网络数据爬取及分析「从入门到精通」 更多爬虫实例详见专栏:Python爬虫牛刀小试
前文回顾:
「Python爬虫系列讲解」一、网络数据爬取概述
「Python爬虫系列讲解」二、Python知识初学
「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试
「Python爬虫系列讲解」四、BeautifulSoup 技术
「Python爬虫系列讲解」五、用 BeautifulSoup 爬取电影信息
目录
1 MySQL 数据库
1.1 MySQL 的安装与配置
1.2 SQL 基础语句详解
1.2.1 显示数据库
1.2.2 使用数据库
1.2.3 创建数据库
1.2.4 创建表
1.2.5 查看表信息
1.2.6 删除表
1.2.7 插入语句
1.2.8 查询语句
1.2.9 更新语句
1.2.10 删除语句
2 Python 操作 MySQL 数据库
2.1 安装 MySQL 扩展库
2.2 程序接口 DB-API
2.2.1 模块属性
2.2.2 链接数据库函数
2.2.3 游标对象
2.3 Python 调用 MySQLdb 扩展库
2.3.1 查询数据库名称
2.3.2 查询表
2.3.3 新建表
2.3.4 插入数据
3 Python 操作 SQLite 3 数据库
4 本文小结
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。在数据库管理系统中,用户可以对数据进行新增、删除、更新、查询等操作,从而转变为用户所需要的各种数据,并进行灵活的管理。前几期文章介绍的 Python 网络数据爬取所得到的语料通常采用 TXT 文本、Excel 或 CSV 格式进行存储,而本文将重点介绍 MySQL 数据库相关知识及 Python 操作 MySQL 的方法,介绍如何将爬取的数据存储到数据库中,从而更方便地进行数据分析和数据统计。
1 MySQL 数据库
数据库技术是信息管理系统、自动化啊办公系统、销售统计系统等各种信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。常用的数据库包括 Oracle、DB2、MySQL、Server、Sybase、VF 等。其中,MySQL 数据库具有性能优良、稳定性好、配置简单以及支持各种操作系统等优点。
1.1 MySQL 的安装与配置
关于 MySQL 的安装和配置可参考博文:https://www.cnblogs.com/2020javamianshibaodian/p/mysql8020anzhuangjiaocheng.html
这里就不展开叙述了。
1.2 SQL 基础语句详解
数据库中最重要的就是 SQL Structure Query Language 语句,它是结构化查询语言,是使用关系模型的数据库应用语言。
SQL 语句主要划分为 3 类,如下:
DDL(Data Definition Language)语句:数据库定义语言。该语句定义不同的数据字段、数据库、数据表、列、索引等数据库对象。常用的语句关键字包括 create、drop、alter 等。
DML(Data Manioulation Language)语句:数据库操作语句。该语句用于插入、删除、更新和查询数据库的记录,是数据库操作中最常用的语句,并能检查数据的完整性。常用的语句关键字包括 insert、delete、update 和 select。
DCL(Data Control Language)语句:数据控制语句。该语句用于控制不同数据字段的许可和访问级别,定义数据库、表、字段、用户权限和安全级别。常用的语句关键字包括 grant、revoke 等。
1.2.1 显示数据库
代码语言:javascript复制show databases
注:如果某个数据库已经存在,则可以使用 use 语句直接使用;如果数据库不存在,则需要使用 create 语句创建数据库。
1.2.2 使用数据库
如果想直接使用已经存在的数据库 bookmanage,则直接使用如下语句:
代码语言:javascript复制use bookmanage
1.2.3 创建数据库
如果想创建新的数据库,则使用 create 关键字创建。
代码语言:javascript复制create database course
1.2.4 创建表
这里假设要创建 books 图书表,该表包括图书编号 bookid、图书名称 bookname、价格 price 和 图书日期 bookdate 字段。
代码语言:javascript复制create table books(bookid int primary key,
bookname varchar(20),
price float,
bookdate date
)
其中,创建的表名称为 books;图书编号为 int 类型,同时主键(primary key),用于唯一标识表的字段;图书名称为 varchar 类型,长度为 20;价格为 float 类型;图书日期为 date 类型。
1.2.5 查看表信息
如果想查看当前数据库中存在多少张表,则使用 show 关键字。
代码语言:javascript复制show tables
由上述代码可知,当前仅存在一张表 books。如果想查看该表的定义,则使用 desc 关键字。
代码语言:javascript复制desc books
1.2.6 删除表
如果想要删除表 books,则使用 drop 关键字。
代码语言:javascript复制drop table books
1.2.7 插入语句
数据库和表创建成功之后,需要向表中插入数据,使用的关键字是 insert。
比如像表 books 中插入信息,代码如下:
代码语言:javascript复制insert into books(bookid, bookname, price, bookdate) values ('1', '人工智能导论', '88', '2020-07-02')
使用 select 查询语句显示结果:
代码语言:javascript复制select * from books
在执行 insert 语句的过程中,如果省略所有字段,则只需要 values 值一一对应即可。
代码语言:javascript复制insert into books
value('2', '软件工程导论', '77.7', '2020-07-02')
同样,如果指向插入某几个字段的数据,则只需要 values 值对应一致即可,比如:
代码语言:javascript复制insert into books(bookid, bookname)
value('3', 'Python程序设计语言')
1.2.8 查询语句
查询语句基本语法格式如下:
代码语言:javascript复制select 字段 from 表名 [where 条件]
该语句用于查询指定字段的数据,当字段为 “ * ” 符号时,它用于查询表中的所有指令;where 紧跟查询条件,该参数可以省略。
如果全部显示 books 表中的所有字段和数据
代码语言:javascript复制select * from books
如果想显示需要的字段,则可以用逗号分隔
代码语言:javascript复制select bookid,bookname,price from books
如果需要增加查询条件,则使用 where 语句。比如查询编号大于 1 且价格非空的书
代码语言:javascript复制select bookid,bookname,price,bookdate from books where bookid>1;
select bookid,bookname,price,bookdate from books where price is not null;
1.2.9 更新语句
更新语句使用 update 关键字。
例如将《人工智能导论》更新为《网络数据爬取及分析》
代码语言:javascript复制update books set bookname= '网络数据爬取及分析' where bookid='1';
更新语句执行之前:
更新语句执行之后:
1.2.10 删除语句
删除语句使用 delete 关键字。
例如将日期为空的数据删除,具体代码如下:
代码语言:javascript复制delete from books where bookdate is null;
删除语句执行前:
删除语句执行后:
值得注意的是, MySql 执行 DELETE 或 UPDATE 命令时,报 Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 错误,这是因为 MySql 运行在 safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,执行命令如下命令: SET SQL_SAFE_UPDATES = 0; 修改下数据库模式,然后就可以继续执行 DELETE/UPDATE 了 如果想改会 safe-updates模式,执行如下命令即可 SET SQL_SAFE_UPDATES = 1; (报错解决办法来源:参考博文地址:https://blog.csdn.net/m2606707610/article/details/86531526)
2 Python 操作 MySQL 数据库
Python 访问数据库需要对应的接口程序,接口程序可以理解为 Python 的一个模块,它提供了数据库客户端的接口供您访问。
2.1 安装 MySQL 扩展库
代码语言:javascript复制pip install mysql
2.2 程序接口 DB-API
Python 接口程序一定要遵守 Python DB-API 规范。DB-API 定义了一系列必须的操作对象和数据库存取方式,以便为各种各样的底层数据库系统和不同的数据库接口提供一致的访问接口。由于 DB-API 为不同的数据库提供一致的访问接口,这使其在不同的数据库之间移植代码成为一轻松的事情。
2.2.1 模块属性
DB-API 模块的定义如下表所示
模块 | 含义 |
---|---|
apilevel | 模块兼容的 DB-API 版本号 |
threadsafety | 线程安全级别 |
paramstyle | 支持 SQL 语句参数风格 |
connect | 链接数据库函数 |
Python 调用 MySQL 需要导入 MySQLLdb 库,代码为“import MySQLdb”。
2.2.2 链接数据库函数
链接数据库的函数是 connect() 函数,其生成一个 connect 对象,用于访问数据库。
参数 | 英文含义 | 中文解释 |
---|---|---|
user | Username | 数据库用户名 |
password | Password | 数据库登录密码 |
host | Hostname | 数据库主机名 |
database | DatabaseName | 数据库名 |
port | Port | 数据库端口号,默认3306 |
dsn | Data source name | 数据源名称 |
下面代码显示的是 Python 导入 MySQLdb 扩展库,并调用 connect() 函数链接数据库 :
代码语言:javascript复制import MySQLdb
conn = MySQLdb.connect(host='localhost', db='MySQL', user='root', passwd='123456', port=3306, charset='utf8')
方法 | 含义 |
---|---|
close() | 关闭数据库链接,或者关闭游标对象 |
commit() | 提交当前事务 |
rollback() | 取消当前事务,数据库中常称为回滚操作 |
cursor() | 创建游标或类游标对象 |
errorhandler(cxn,errcls,errval) | 作为已给游标的句柄 |
注:事务是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行,从而保证数据的完整性和安全性。
2.2.3 游标对象
由上述内容可知,connect() 方法用于提供连接数据库的接口,但是如果要对数据库操作还需要使用游标对象。
方法 | 含义 |
---|---|
fetchone() | 取出 (fetch) 一个 (one) 值,即获取结果集的一行数据 |
fetchmany(size) | 取出 (fetch) 多个 (many) 值,这里的参数 size 是界限,得到结果集的下几行 |
fetchall() | 取出 (fetch) 所有 (all) 值 |
execute(sql) | 执行数据库操作,参数为 SQL 语句 |
close() | 关闭游标。当不需要游标时,尽可能地关闭它 |
2.3 Python 调用 MySQLdb 扩展库
前面创建了数据库 bookmanage 和表 books,用于记录图书管理系统中的书籍信息,这一节介绍如何通过 Python 来显示。
2.3.1 查询数据库名称
查看本地数据库中所包含的数据库名称需使用“show database”语句。
代码语言:javascript复制import MySQLdb
try:
# 访问用户 root 的本地 MySQL 数据库
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306)
cur = conn.cursor()
# 执行显示所有数据库名称的语句
res = cur.execute('show databases')
print(res)
# 返回结果循环获取
for data in cur.fetchall():
print('%s' % data)
cur.close()
conn.close()
except MySQLdb.Error as e:
print('MySQL Error %d: %s' % (e.args[0], e.args[1]))
如果本地数据库已经存在,而用户却忘记其数据库的名称,则银狐可以通过该方法查询本地 MySQL 中把傲寒的所有数据库,然后再链接该数据库进行相关的操作。
2.3.2 查询表
这里需要查询 bookmanage 数据库中表 books 的内容,代码如下:
代码语言:javascript复制import MySQLdb
try:
# 连接数据库
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306, db='bookmanage', charset='utf8')
# cursor()函数定义游标
cur = conn.cursor()
res = cur.execute('select * from books') # 执行查询操作
print('表中含', res, '条数据n')
# 获取所有数据
for data in cur.fetchall():
print('%s %s %s %s' % data)
cur.close()
conn.close()
except MySQLdb.Error as e:
print('MySQL Error %d: %s' % (e.args[0], e.args[1]))
我们发现,输出结果与 MySQL 中的结果是一致的。
2.3.3 新建表
下面创建一张学生表,主要是调用 commit() 函数提交数据,执行 create table 语句,代码如下:
代码语言:javascript复制import MySQLdb
try:
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306, db='bookmanage', charset='utf8')
cur = conn.cursor()
sql = "create table students(id int not null primary key auto_increment,"
"name char(30) not null,"
"sex char(20) not null)"
cur.execute(sql)
# 查看表
print('插入后包含表:')
cur.execute('show tables')
for data in cur.fetchall():
print('%s' % data)
cur.close()
conn.commit()
conn.close()
except MySQLdb.Error as e:
print('MySQL Error %d: %s' % (e.args[0], e.args[1]))
2.3.4 插入数据
插入数据也是先定义好 SQL 语句,然后调用 execute() 函数来实现。
通常插入的新数据需要通过扮靓进行赋值,其值不是固定的。
代码语言:javascript复制import MySQLdb
try:
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306, db='bookmanage', charset='utf8')
cur = conn.cursor()
sql = "insert into students values(%s, %s, %s)"
cur.execute(sql, ('3', 'zzr', '男'))
# 查看表
print('插入数据:')
cur.execute('select * from students')
for data in cur.fetchall():
print('%s %s %s' % data)
cur.close()
conn.commit()
conn.close()
except MySQLdb.Error as e:
print('MySQL Error %d: %s' % (e.args[0], e.args[1]))
3 Python 操作 SQLite 3 数据库
SQLite 是一款轻型数据库,是一种遵守事务 ACID 性质的关系型数据库管理系统,它占用的资源非常低,能都支持 Windows/Linux/Unix 等主流操作系统,同时能够与很多程序语言如 C3、PHP、Java、Python 等结合使用。
SQLite 3 借适用 SQLite 3 模块与 Python 进行集成。SQLite 3 模块提供了一个与 DB-API 2.0 规范兼容的 SQL 接口。用户可以直接使用 SQLite 3 模块,因为 Python 2.5.x 以上版本都默认自带模块。
SQLite 3 的使用方法与前文介绍的 MySQLLdb 库类似,首先必须创建一个表示数据库的连接对象,然后有选择地创建光标对象,再定义 SQL 语句执行,最后关闭对象和连接。
模块 | 含义 |
---|---|
sqlite.connect(...) | 打开一个到 SQLite 数据库文件 database 的连接 |
connection.cursor() | 创建一个 curor,将在 Python 数据库编程中用到 |
cursor.execute(sql) | 执行一个 SQL 语句,注意SQL 语句可以被参数化 |
cursor.executescript(sql) | 一旦接收到脚本,就会执行多个 SQL 语句。SQL语句应用分号分隔 |
connection.commit() | 提交当前的事务 |
connection.rollback() | 回滚至上一次调用 commit() 对数据库所做的更改 |
connection.close() | 关闭数据库连接 |
cursor.fetchone() | 获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时返回 None |
cursor.fetchmany() | 获取查询结果集中的下一行组数据,返回一个列表 |
cursor.fetchall() | 获取查询结果集中所有的数据行,返回一个列表 |
下面介绍的是 Python 操作 SQLite 3 的基础用法(与 MySQLdb 类似),主要内容包括:
- 在本地创建一个 test.db 的数据库文件。
- 执行游标中的 execute() 函数,创建表 PEOPLE,包括的字段有序号、姓名、年龄、公司和薪水,字段涉及各种数据类型。
- 执行插入数据操作,注意需要调用 conn.commit() 函数。
- 执行查询操作,SQL 语句为“"SELECT id, name, age, company, salary from PEOPLE"”,然后通过 for 循环获取查询结果,显示“小杨”、“小颜”、“小红”的信息。
- 执行更新操作并查询数据结果,将序号为“2”的公司信息更改为“华为”。
- 执行删除操作,删除公司名称为“华为”的数据,最后剩下小红的信息。
import sqlite3
# 连接数据库,如果数据库不存在则创建
conn = sqlite3.connect('test.db')
cur = conn.cursor()
print('数据库创建成功n')
# 创建表 PEOPLE(序号、姓名、年龄、公司、薪水)
cur.execute('create table people'
'(id int primary key not null,'
'name text not null,'
'age int not null,'
'company char(50),'
'salary real);')
print('prople 表创建成功!n')
conn.commit()
# 插入数据
cur.execute('insert into people(id, name, age, company, salary) '
'values(1, "小杨",26, "华为", 10000.00)');
cur.execute('insert into people(id, name, age, company, salary) '
'values(2, "小颜",26, "百度", 8800.00)');
cur.execute('insert into people(id, name, age, company, salary) '
'values(3, "小红",28, "腾讯", 98000.00)');
conn.commit()
print('插入数据成功!n')
# 查询操作
cursor = cur.execute('select id, name, age, company, salary from people')
print('数据查询成功!')
print('序号', '姓名', '年龄', '公司', '薪水')
for row in cursor:
print(row[0], row[1], row[2], row[3], row[4])
print('')
# 更新操作
cur.execute('update people set company="华为" where id=2')
conn.commit()
print('数据更新成功!')
cursor = cur.execute('select id, name, company from people')
for row in cursor:
print(row[0], row[1], row[2])
print('')
# 删除操作
cur.execute('delete from people where company="华为";')
conn.commit()
print('数据删除成功!')
cursor = cur.execute('select id, name, company from people')
for row in cursor:
print(row[0], row[1], row[2])
print('')
# 关闭连接
conn.close()
4 本文小结
数据库是按照数据结构来组织、存储和管理数据的仓库。用户可以通过数据库来存储和管理所需的数据,包括简单的数据表格、海量数据等。数据库被广泛应用于各行各业,比如信息管理系统、办公自动化系统、各种云信息平台等。本文为什么要介绍 Python 操作数据库知识呢?一方面,数据爬取、数据存储、数据分析、数据可视化是密不可分的 4 部分,当爬取了相关数据后,需要将其存储至数据库中,这能够更加标准化、智能化、自动化、便捷地管理数据,也为后续的数据分析提供强大的技术支持,能够自定义提取所需数据块进行分析;另一方面,数据库为实现数据共享、实现数据集中控制、保证数据的一致性和可维护性提供保障,所以,学习 Python 操作数据库是非常必要的。
欢迎留言,一起学习交流~
感谢阅读