美文网首页pythonIT实用分享
使用Python自带的SQLite3保存爬取到的数据

使用Python自带的SQLite3保存爬取到的数据

作者: Hardy_ | 来源:发表于2019-01-24 11:37 被阅读118次

    爬虫获取到数据以后涉及到如何处理数据的问题,对于一次性的数据来说,可以将数据打印到屏幕上,如果想要进行保存,可以选择存储到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保存爬取到的数据

        本文链接:https://www.haomeiwen.com/subject/gbzljqtx.html