『scrapy爬虫』06. 向mysql数据库中批量写入数据(详细注释步骤)
·
欢迎关注 『scrapy爬虫』 专栏,持续更新中
欢迎关注 『scrapy爬虫』 专栏,持续更新中
批处理方式向数据库添加数据
前面我们的思路是将250条电影数据一口气commit到数据库,万一在收集第200条数据的时候程序崩溃了,前功尽弃,最好是改进为比如说在第100条数据时就存一次,第200条时存一次,这样下次可以设置在第200条数据时开始.
留意一点就是当数据未满100,结束的时候做好处理.
import openpyxl
import pymysql
#用于将数据存入mysql的类
class DBPipeline:
# 初始化
def __init__(self):
self.conn=pymysql.connect(host='127.0.0.1',port=3306,
user='root',passwd='123456',database='mzh_scrapy',charset='utf8mb4')
self.cursor=self.conn.cursor()
self.data=[]#准备一个存放数据的容器
# 开始爬虫时候要进行的操作
def open_spider(self, spider):
pass
# 处理爬取到的数据并进行后续处理
def process_item(self, item, spider):
title=item.get('title',"")#如果没有获取到标题,默认空
score=item.get('score',0)#如果没有获取到评分,默认0
quato=item.get('quato',"")#如果没有获取到评价默认空
self.data.append((title,score,quato)) #将得到的一行的电影相关数据放入列表
if len(self.data)>=100:
# execute->改为了 executemany 支持多条数据批量传入数据库
self.cursor.executemany(
'insert into tb_top_movie(title,score,quato) values (%s,%s,%s)',self.data
)
self.conn.commit() # 把数据缓冲区的数据提交到数据库
self.data.clear()#每次添加后清空data 避免重复添加数据
return item #为什么是return? 我们要让这个管道先,return会把item数据传递给下一个管道用于保存excel的
# 关闭爬虫时候要进行的操作
def close_spider(self, spider):
if len(self.data) >= 0:#如果还有残留的数据,但是因为不满100条没有传到数据库也要做好处理
self.cursor.executemany(
'insert into tb_top_movie(title,score,quato) values (%s,%s,%s)',self.data
)
self.conn.commit()#把数据缓冲区的数据提交到数据库
self.data.clear()#每次添加后清空data 避免重复添加数据
self.conn.close()
上述代码有有重复片段进行函数化代码重构
self.cursor.executemany(
'insert into tb_top_movie(title,score,quato) values (%s,%s,%s)',self.data
)
self.conn.commit() # 把数据缓冲区的数据提交到数据库
self.data.clear()#每次添加后清空data 避免重复添加数据
代码重构
import openpyxl
import pymysql
#用于将数据存入mysql的类
class DBPipeline:
# 初始化
def __init__(self):
self.conn=pymysql.connect(host='127.0.0.1',port=3306,
user='root',passwd='123456',database='mzh_scrapy',charset='utf8mb4')
self.cursor=self.conn.cursor()
self.data=[]#准备一个存放数据的容器
# 开始爬虫时候要进行的操作
def open_spider(self, spider):
pass
# 处理爬取到的数据并进行后续处理
def process_item(self, item, spider):
title=item.get('title',"")#如果没有获取到标题,默认空
score=item.get('score',0)#如果没有获取到评分,默认0
quato=item.get('quato',"")#如果没有获取到评价默认空
self.data.append((title,score,quato)) #将得到的一行的电影相关数据放入列表
if len(self.data)>=100:
self._write_to_db()
return item #为什么是return? 我们要让这个管道先,return会把item数据传递给下一个管道用于保存excel的
def _write_to_db(self):
# execute->改为了 executemany 支持多条数据批量传入数据库
self.cursor.executemany(
'insert into tb_top_movie(title,score,quato) values (%s,%s,%s)', self.data
)
self.conn.commit() # 把数据缓冲区的数据提交到数据库
self.data.clear() # 每次添加后清空data 避免重复添加数据
# 关闭爬虫时候要进行的操作
def close_spider(self, spider):
if len(self.data) >= 0:#如果还有残留的数据,但是因为不满100条没有传到数据库也要做好处理
self._write_to_db()
self.conn.close()
总结
大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!
版权声明:
发现你走远了@mzh原创作品,转载必须标注原文链接
Copyright 2024 mzh
Crated:2024-3-1
欢迎关注 『scrapy爬虫』 专栏,持续更新中
欢迎关注 『scrapy爬虫』 专栏,持续更新中
『未完待续』
更多推荐
所有评论(0)