前言:
爬虫爬取到的数据最终是要保存下来滴~ 别以为爬下来就完事了,具体流程还有数据去重,数据分析,最后数据可视化等等操作呢… 这一章节,我们聊聊 “数据存储”
在 Python2 中,连接 MySQL 的库大多是使用 MySQLDB,但是此库官方并不支持 Python3,所以在这里推荐使用的库是 PyMySQL。
环境准备:
安装好PyMysql库
本地mysql环境的部署
PyMysql使用介绍:
获取连接对象
我们要连接到 mysql 这个库,首先应该获取一个connect 对象(输入本地部署的Mysql参数)
1 | import pymysql |
获取操作游标
紧接着,需要实例化一个操作游标对象。
1 | import pymysql |
cursor 则为mysql 里面的 操作游标,这个概念和光标有些类似。语句的执行操作,都是依靠操作游标的。
我们拿到操作游标后,就很容易了。因为python执行的 sql 语句跟 mysql 里面是一样的…但还是有一丢丢不同的,让我们接着往下看。
插入数据
注意我们这里使用了异常处理,因为在PyMysql 里面是采用
事务
这个概念进行操作的插入数据需要使用 commit 进行数据提交;当捕捉到错误时,db对象进行 rollback 事件回滚(只针对插入、更新、删除这些对数据库进行更改的操作,事件回滚就是:要么执行成功,要么不执行)
还有一点要注意的是:里面的参数,不管什么类型,统一使用%s作为占位符
动态插入数据:
有时候我们面临的实际情况,你不知道有多少字段插入(上面的情况是我们”写死“的),可以说,插入的字段是不确定因素的,我们应该学会根据实际情况去构造 sql 语句。
在很多情况下,我们要达到的效果是插入方法无需改动,做成一个通用方法,只需要传入一个动态变化的字典给就好了。比如我们构造这样一个字典:
- 上面这条执行语句, 就替代之前那条 很 low 的写法,这么一来,无论字典有多少个键值对,我们都能进行插入。
数据查询:
是的,对于数据库的增删改查,什么最重要? (大声告诉我!)—— 没错! 就是查询!!
旁白君吐槽:“自嗨型作者…”
于是,旁白君大手一挥,说:“这个还不简单,我最拿手了。”于是抢走了作者的键盘,刷刷的写下这么一串代码
1 | import pymysql |
但是,结果却是这样的…
what? 这是什么鬼东西,我的数据呢??
作者邪魅一笑,眼中三分不屑三分冷漠四分讥笑,慢吞吞的拿走旁白君的键盘,自信的啪啪啪添加上了这么几条代码:
1 | sql = 'select * from {table} WHERE age >= 20'.format(table=table) |
看到输出的结果,作者在旁白君羡慕的眼神中满意的点了点头
旁白君对着图仔细看了看说:“刚好四条!原来我刚才输出的4是执行成功的条目数!”
“没错,悟性还挺高!” 作者留下潇洒离去的背影,并甩给旁白君一本秘籍——“数据查询的方法”
数据查询的方法:
- 使用select语句查询后不会直接返回查询的具体数据,而是返回执行成功的条目数,我们需要使用fetchone或者fetchall方法可以将数据读取出来。
- fetchone() 方法,这个方法可以获取结果的第一条数据,返回结果是元组形式,元组的元素顺序跟字段一一对应,也就是第一个元素就是第一个字段 id,第二个元素就是第二个字段 name,以此类推。
- fetchall() 方法,它可以得到结果的所有数据,然后将其结果和类型打印出来,它是二重元组,每个元素都是一条记录。我们将其遍历输出,将其逐个输出出来。
- 我们还可以用 while 循环加 fetchone() 的方法来获取所有数据,而不是用 fetchall() 全部一起获取出来,fetchall() 会将结果以元组形式全部返回,如果数据量很大,那么占用的开销会非常高。所以推荐使用如下的方法来逐条取数据
总结
这一篇主要是理解如何连接数据库、事务的概念(默认开启事务),以及使用对数据库对字典形式的数据进行操作。然后 使用sql语句进行增删改查(主要是动态数据、插入更新数据部分)
在这一期皮了一下,希望大家喜欢,啊哈哈。
各位,我们下期再见!