在上篇博文中,博主使用python爬取了豆瓣电影的影片信息,接下来,博主考虑到在之前做的JavaWeb电影院项目中需要向数据库中一个个的插入影片数据,十分的繁琐,那么在使用了python爬虫后,这个操作变被大大的简化了,我们只需要在获取影片信息的基础上进行数据插入即可,接下来便是实现过程。
如何爬取影片数据:
爬取电影信息
结果如图所示
在使用python的数据库操作时需要先安装pymysql这个第三方库
博主考虑到要方便今后的项目开发以及python支持面向对象编程,因此对数据库操作进行了封装
参数初始化
类初始化,在创建类时便会执行
def __init__(self):
self.host = '127.0.0.1'
self.port = 3306
self.user = 'root'
self.password = 'px980305'
self.db = 'python'
self.charset = "utf8"
创建连接
def get_con(self):
try:
conn = pymysql.connect(host=self.host, user=self.user, password=self.password, db=self.db, port=self.port, charset=self.charset)
return conn
except pymysql.Error:
print ("connect error")
执行操作
在python的数据库操作中,是以游标对象来进行数据库增删改查操作的
插入操作
插入操作中,传入的参数类型不同,那么sql语句的写法也不相同
参数为元组类型时
5.1.1参数是元组
#必须加括号,只能是(%s)格式; 参数必须是(str,)
# 实例1.1.1:一个参数
str_insert= "INSERT INTO m1805 (id) VALUES (%s)"# 只能是(%s)格式
cursor.execute(str_insert,('7')) #必须加括号必须是字符串
con.commit()
# 实例1.1.2:多个参数
str_insert= "INSERT INTO m1805 (id,name) VALUES (%s,%s)"# 只能是(%s)格式
cursor=con.cursor()
cursor.execute(str_insert,('123','Jim'))#必须加括号必须是字符串
con.commit()
参数为字典类型时
#必须加括号包括,只能是%(字典键名)s格式; 参数必须是字典
#实例1.2.1:
arg = {'x':'33'}
str_insert= "INSERT INTO m1805 (id) VALUES (%(x)s)"
cursor.execute(str_insert,arg)
con.commit()
#实例1.2.2:
arg = {'x':'44','y':'Bob'}
str_insert= "INSERT INTO m1805 (id,name) VALUES (%(x)s,%(y)s)"
cursor.execute(str_insert,arg)
con.commit()
在执行插入操作时,我们传入的参数为:
sql = "insert into movice(name,cover,score) values(%s,%s,%s)"
data = [("呵呵",'img/1.jpg',"9.0"), ("呵呵",'img/1.jpg',"9.0")]
很明显,我们使用的是元组类型
def dml_by_where(self, sql, params):
try:
con = self.get_con()#获取连接
cur = con.cursor()#获取游标对象
for d in params:#遍历参数
if self.SHOW_SQL:
print('执行sql:[{}],参数:[{}]'.format(sql, d))
cur.execute(sql, d)#具体执行
con.commit()
except pymysql.Error:
con.rollback()
print ("update error")
finally:#关闭资源
cur.close()
con.close()
那么至此,数据库部分的插入功能便完成了,接下来则是调用了
定义一个插入操作函数方法
def ins_by_param(sql,data):
db.dml_by_where(sql, data)
生成MysqlClass对象实例,即开始数据库操作,将元组数据保存在列表中,将爬虫获取的数据信息进行提取封装为元组加入到列表中
db=MysqlClass()
mydata=[]
for x in data:
d=(x['movie_name'],"./images/"+x['movie_name']+".jpg",x['movie_rate'])
mydata.append(d)
执行插入操作
添加语句会被循环执行,执行次数由元组个数所决定
sql = "insert into movice(name,cover,score) values(%s,%s,%s)"
ins_by_param(sql,mydata)
至此,数据插入操作便完成了
下面封上数据库封装部分的源代码,里面还封装
import pymysql
class MysqlClass:
SHOW_SQL = False
def __init__(self):
self.host = '127.0.0.1'
self.port = 3306
self.user = 'root'
self.password = 'px980305'
self.db = 'python'
self.charset = "utf8"
# 建立连接
def get_con(self):
try:
conn = pymysql.connect(host=self.host, user=self.user, password=self.password, db=self.db, port=self.port, charset=self.charset)
return conn
except pymysql.Error:
print ("connect error")
# 插入更新方法,eg:sql='insert into pythontest values(%s,%s,%s,now()',params=(6,'C#','good book')
def dml_by_where(self, sql, params):
try:
con = self.get_con()
cur = con.cursor()
for d in params:
if self.SHOW_SQL:
print('执行sql:[{}],参数:[{}]'.format(sql, d))
cur.execute(sql, d)
con.commit(
except pymysql.Error:
con.rollback()
print ("update error")
finally:
cur.close()
con.close()
# 不带参数的更新方法
def dml_nowhere(self, sql):
try:
con = self.get_con()
cur = con.cursor()
count = cur.execute(sql)
con.commit()
return count
except pymysql.Error:
con.rollback()
print ("update error")
finally:
cur.close()
con.close()
码字不易给个赞呗!