使用Python自带的SQLite3保存爬取到的数据
爬虫获取到数据以后涉及到如何处理数据的问题,对于一次性的数据来说,可以将数据打印到屏幕上,如果想要进行保存,可以选择存储到txt
文件中,或者存储到json
文件,也可以使用Python自带的pickle
库将数据以字典或者列表的形式存储到本地。但是如果数据量比较大,而且想要在访问数据时更加快速,那么可以选择使用数据库来保存数据。数据库也有很多种选择,SQLite3的好处是Python自带,无需安装任何额外的东西,所以使用SQLite3来上手用数据库保存数据是个不错的选择
之前有篇文章是关于建立IP池的,当时是用的pickle
保存爬取到的IP,那么这次就用数据库来替代pickle
保存IP
首先我们需要连接到数据库:
import sqlite3
conn = sqlite3.connect('pool.db')
这个时候如果pool.db
这个数据库不存在将会被自动创建,接下来,需要对这个数据库进行一系列操作,需要定义一个cursor()
:
c = conn.cursor()
接下来的操作主要有:建表,向表中添加数据,查询表中的数据,删除部分数据
在数据库中新建一个表
try:
c.execute('''CREATE TABLE IP
(ID INTEGER PRIMARY KEY AUTOINCREMENT,
IPPORT VARCHAR(50) NOT NULL UNIQUE);''')
conn.commit()
print("created new table IP")
except:
pass
之所以使用try...except...
是因为这样保证了如果名为IP的表没有被创建将会被创建,即使已经被创建了程序也不会出错。c.execute()
中的内容新建了一个名为IP的表(table),里面含有两个字段,一个是自动自增的名为ID的字段,也是这个表的主键;另一个就是名为IPPORT的字段,定义为VARCHAR
类型,并且用UNIQUE
限制了保存进去的IP不允许重复,每次execute
执行一个数据库指令之后,还需要commit()
才会使指令实际生效。因为这个例子是用数据库保存IP池,所以我的数据库只需要一个用来保存IP的字段就够了,如果是其他数据,可以根据需要建立不同的字段
向表中添加数据
try:
insert_cmd = "INSERT INTO IP (IPPORT) VALUES ('{}')".format(ip_port)
c.execute(insert_cmd)
conn.commit()
except:
pass
使用try...except...
是因为之前定义的IPPORT字段是唯一的,如果插入的IP相同那么就会报错,所以用try...except...
避免插入相同IP的时候程序中止
查询数据
至此保存IP池的工作已经完成了,如果接下来想要从数据库中读取保存到的IP,我们需要对IP这个表进行查询:
ip_list = list(c.execute("SELECT * FROM IP"))
这个查询语句就将IP表中的所有数据提取出来保存到了一个列表(list)中,这个列表中的每一项数据的形式是一个tuple:(row,data)
,第一个是该数据的行号,第二个才是这个数据
删除数据
有时我们会遇到失效的IP,这个时候我们想在数据库中将其删除:
del_cmd = "DELETE FROM IP WHERE IPPORT = \"" + ip_port + "\""
c.execute(del_cmd)
conn.commit()
还有一个常用的语句,就是如果我们想知道一个表中一共有多少行数据,我们可以用:
len(list(c.execute("SELECT * FROM IP")))