在前面的推文,我们学会了使用 Requests、BeautifulSoup 等第三方框架来爬取相关的网页信息。虽然一切看上去都很顺利,但是我相信很多人都已经发现了这些程序存在的短板:每次获取信息,都需要重新爬取对应的网页。这无异是很枯燥,而且效率不是特别高。那么,有没有一种方法,能够让我们存储自己爬取到的信息呢?答案当然是有的,我们今天就来学习 MySQL 的基础知识,并且学会如何在 Python 中对 MySQL 进行相关的操作。
MySQL 是最流行的关系型数据库管理系统,在 Web 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
简单的来说:MySQL 会按照一定要求,按照一定的数据结构存放你想要存放的数据。当然,现在的你不用纠结这到底是什么意思,我们只需要了解:使用 MySQL 数据库,我们能够很方便的存储我们需要存储的信息就可以了。
我们使用的是 Windows 平台,因此直接在官方的下载页面点击下载后,一路点击确认就可以了。注意!如果下载时候出现登陆页面,请点击 “No thanks, just start my download.” 的链接,便可以直接前往下载页面。
安装完 MySQL 后,我们就可以通过 CMD 控制台来登陆 MySQL。输入以下命令:
mysql -u root -p # 个人建议, MySql 可以设置简单点,我差点就忘记了。 # 简单明了:123456 啥的都可以。
系统会提示输入密码,此时我们输入上一步骤中预设的代码。CMD 控制台会出现如下图所示的提示。
第一步就是创建属于我们的数据库,其对应的代码为:
create databases [name]
[name] 是我们自己定义的数据库名。需要特别指出的是,在 Windows 中,MySQL 是不区分大小写的,但是在 Linux 中,MySQL 会识别出字母大小写,并产生不同的效果。因此,如果你使用的是 Linux 系统,那么就需要特别注意了(当然了,本文所写的代码,都通过了 Linux 平台的测试,可以正常运行)。
现在,就让我们创建一个名叫pyspider的数据库:
create database pyspider;
创建完数据库后,我们需要创建一些数据表,用来存放一些具有指定数据结构的信息。比如,我们要创建一个网页信息表 web_info,里面包含了网页的 URL 链接、网页的标题以及网页访问的终端设备:
create table web_info ( id int auto_increment primary key, url varchar(100), title varchar(100), termi varchar(20) );
在创建一个数据库表的时候,我们就要指定对应的变量名和变量属性。关于 MySQL 中的数据类型有哪几种,你可以看看这篇文章:《详解 MySQL 数据类型》。
或许到现在,你对上面的代码“一窍不通”。没关系!其实对于新人来讲,我更推荐你使用 Navicat 进行图形化页面的创建工作!鉴于文章篇幅的原因,你可以直接通过这篇文章《利用 Navicate 创建数据库和表》来学习如何更简单的创建对应的数据库和数据表。
对于本门课程来说,MySQL 仅仅是一个用来存储数据的工具,并不会对数据库的熟练程度有特别深奥的要求。但是要求低,并不是不重要,恰恰相反,数据库在我们日后的开发中占据着重要的地位。但是今天,我们只学习本门课程最重要的,也是最基础的几条语句:增加、删除、更改、查询。
查询是我们日常使用最多的一条语句,其通用的语句为:
SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N][ OFFSET M]
我们以 web_info 数据表为例,写几条常用的查询语句:
查询 web_info 里的所有信息:
select * from web_info
查询 web_info 里的所有网页标题(title):
select title from web_info
查询 web_info 里使用 PC 访问的页面所有信息:
select * from web_info where termi='PC'
统计 web-_info 里使用 PC 访问的一共有多少条记录:
select count(*) from web_info where termi='PC'
增加语句的通用语句为:
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
我们仍然举几个例子来展示如何写增加语句。
增加一条数据在 web_info 数据表中:
insert into web_info values("http://www.baidu.com","百度一下,你就知道","PC")
只在 web_info 数据表中增加一个 URL:
insert into web_info (url) values("http://gitbook.cn")
应该有人注意到上面两个增加语句的区别:第一个语句 web_info 后面直接加了 values,而第二条语句在 web_info 后面加了 (url)。为什么会有这样的区别呢?
大家可以百度一下相关的原因!当然,你可以直接查看这篇文章《MySQL 必知必会:数据插入(Insert)》。
修改数据的通用语句为:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
我们仍然从几个例子来展示如何处理修改语句。
修改 web_info 中 id 为6的网页标题为“gitbook”:
update web_info set title="gitbook" where id=6
修改 web_info 中标题为“github”的网页标题为“github and microsoft”:
update web_info set title="github and microsoft" where title="github"
删除数据的通用语句为:
DELETE FROM table_name [WHERE Clause]
我们仍然从几个例子来展示如何删除数据表的相关数据。
删除 web_info 数据表中,title 为“github”的数据:
delete from web_info where title="github"
删除 web_info 数据表中,url 为"baidu.com"的数据:
delete from web_info where url="baidu.com"
由于 Python 并没有自带的关于 MySQL 的库,因此我们要下载专用的 pymysql 库,打开 CMD 控制台,输入 pip install pymysql。安装成功后,在 Python 中导入该库,看是否成功下载。
import pymysql # 打开数据库连接 db = pymysql.connect(host='localhost',port= 3306,user = 'root',passwd='654321',db='pyspider' ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor()
其中需要解释的参数为:
host:MySQL 地址,本地地址一般为 localhost 或 127.0.0.1;
port:MySQL 端口号,默认端口号为 3306;
user:MySQL 用户名,默认的用户名为 root;
passwd:用户名密码,密码由用户自行创建,这里密码为 654321;
db:选择的数据库名称,链接数据库时对应的数据库名称,这里链接的是上面创建的数据库 pyspider。
代码如下所示:
sql = "insert into web_info values('http://www.gitbook.cn','gitbook','PC') " try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 如果发生错误则回滚 db.rollback() # 关闭数据库连接 db.close()
代码如下所示:
sql = "update web_info set title='gitbook' where id=6" try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
代码如下所示:
sql = "delete from web_info where title='github'" try: # 执行SQL语句 cursor.execute(sql) # 提交修改 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭连接 db.close()
与其他的语句相比,查询数据在 Python 中有很多不同,具体事例如下:
sql = "SELECT *FROM web_info" try: cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: id = row[0] url = row[1] title = row[2] termi = row[3] except: print ("Error: unable to fetch data") # 关闭数据库连接 db.close()
限于篇幅原因,本文只能浅显的列出常见的数据库语句。事实上,数据库操作应该是每个开发人员必须掌握,并且能够熟练掌握的一种语言或者工具;
你应该在课后翻一翻有关于 MySQL 的书籍,例如《MySQL 必知必会》或者是进阶版的《高性能 MySQL》。
如果你有关于数据库操作的基础,或者是读完了上面提到的两本书,你应该尝试着去 LeetCode写一些 SQL 语句,巩固你的知识。