欢迎关注 『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爬虫』 专栏,持续更新中
『未完待续』


Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐