使用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")))

你可能感兴趣的:(使用Python自带的SQLite3保存爬取到的数据)