这是我参与「第四届青训营」笔记创作活动的第1天,笔记的内容是有关青训营项目中的一个小模块的分享
前言
这篇文章是本人在完成青训营大项目时的体会笔记,我们这个项目是做一个简易分布式爬虫系统,爬虫系统是一个非常关键的搜索引擎,但是如何能够进行高效的数据爬取是爬虫系统面临的最大挑战之一,一种可行的方式是采用分布式的方式来进行爬取以提高爬取效率。爬虫可以减少人为操作,例如可以一下子获得微博的所有热搜。
一:什么是sqlite数据库
首先我使用的python中自带的sqlite数据库,sqlite数据库的优点是:
-
SQLite是一个非常轻量级的数据库。 因此在电脑,手机,相机,家用电子设备等设备的嵌入式软件是非常好的选择。
-
SQLite的数据存储非常简单高效。 当您需要存储文件存档时,SQLite可以生成较小数据量的存档,并且包含常规ZIP存档的大量元数据。
-
SQLite可以用作临时数据集,以对应用程序中的一些数据进行一些处理。
-
在SQLite数据库中,数据查询非常简单。 您可以将数据加载到SQLite内存数据库中,并随时提取数据。可以按照您想要的方式提取数据。
-
SQLite提供了一种简单有效的方式来处理数据,而不是以内存变量来做数据处理。 例如:如果您正在开发一个程序,并且有一些记录要对其进行一些计算。 然后,您可以创建一个SQLite数据库并在其中插入记录,查询,可以选择记录并直接进行所需的计算。
-
SQLite非常容易学习和使用。它不需要任何安装和配置。只需复制计算机中的SQLite库,就可以创建数据库了。
缺点是:
SQLite一般用于处理小到中型数据存储,对于高并发高流量的应用不适用。
二:如何在python中使用sqlite数据库
在pycharm中最右边当中有一个数据库,添加sqlite数据源即可进行使用,并且在使用sqlite数据库比使用mysql要简单,再进行连接的过程中,如果所使用的库名是不存在的话,则会自动创建一个新的sqlite数据库,以下是创建一个新的sqlite数据库的python代码。
import sqlite3 #sqlite数据库的文件
conn=sqlite3.connect('date.db') #连接已存在的sqlite数据库或新建一个数据库
c=conn.cursor() #获取游标
conn.commit()
conn.close()
上述就是一个简单的创建一个数据库的代码。
三:如何简单使用sqlite数据库
这里我用存图片来作为一个例子来进行存储,假设爬虫爬出来的图片已经保存到了本地。
import sqlite3
import base64
import numpy as np
import cv2
conn=sqlite3.connect("date.db")
c=conn.cursor()
pirctur='D:\pythonProject\image\123.jpg'#图片的路径
symbol='pictureTable' #表的名称
c.execute('create table IF NOT EXISTS %s(id TEXT,image_bytes BLOB)'%symbol)#创建一个表
conn.commit()
由于sqlite数据库不能直接支持图片的存入,所以我们需要将图片进行编码再存入数据库,也就是利用b64decode来进行。
with open(pirctur,'rb') as f: #读入图片
byte=f.read()
content=base64.b64encode(byte)
sql = f"INSERT INTO main.pictureTable(id,image_bytes) VALUES (?,?)" #sql语句
c.execute(sql,(1,content)) #执行sql语句
conn.commit()
我们读入图片之后将它进行编码,编码后即可直接存入数据库,其中VALUES中的(?,?)是很安全的一种方式,其实也是可以直接在括号里面进行操作的。 以上就是图片存入数据库的简单实现。
四:如何将sqlite数据库中的图片打开来
要打开sqlite数据库中的图片的话也不是直接打开的,而是要先进行与b64decode相反的操作b64encode来进行解码,代码如下:
conn=sqlite3.connect("date.db")
c=conn.cursor()
conn.commit()
sql = f"SELECT image_bytes FROM pictureTable" #找到编码
c.execute(sql)
p=c.fetchone()
img = base64.b64decode(p[0])
nparr = np.asarray(bytearray(img), dtype="uint8")
img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imshow("img", img_decode)
cv2.waitKey(0)
这样即可读出数据库中的图片。
附上完整的代码:
import sqlite3
import base64
import numpy as np
import cv2
conn=sqlite3.connect("date.db")
c=conn.cursor()
pirctur='D:\pythonProject\image\123.jpg'#图片的路径
symbol='pictureTable'
c.execute('create table IF NOT EXISTS %s(id TEXT,image_bytes BLOB)'%symbol)#创建一个表
conn.commit()
with open(pirctur,'rb') as f: #读入图片
byte=f.read()
content=base64.b64encode(byte)
sql = f"INSERT INTO main.pictureTable(id,image_bytes) VALUES (?,?)" #sql语句
c.execute(sql,(1,content))
conn.commit()
sql = f"SELECT image_bytes FROM pictureTable"
c.execute(sql)
p=c.fetchone()
img = base64.b64decode(p[0])
nparr = np.asarray(bytearray(img), dtype="uint8")
img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imshow("img", img_decode)
cv2.waitKey(0)
以上便是简单存入图片并从中打开图片的方式。
结尾
当然mysql数据库是更加常规的,我太懒了就直接用自带的数据库比较方便,希望这篇笔记对大家有所帮助!!这里可以一键三连嘛(doge)