iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Scrapy将数据保存到Excel和MySQL中的方法实现
  • 351
分享到

Scrapy将数据保存到Excel和MySQL中的方法实现

Scrapy数据保存到ExcelScrapy数据保存到MySQL 2023-02-28 16:02:42 351人浏览 八月长安
摘要

目录1. excel1.1 openpyxl1.1.1 代码说明1.1.2 注意1.2 pandas1.2.1 代码说明1.2.2 常见错误1.3 openpyxl和pandas对比2. Mysql2.1 代码说明2.2

scrapy是一个用python实现的为了爬取网站数据、提取数据的应用框架。我们对于爬取到的数据存储到本地或数据库是经常要用到的操作。主要讲解两种保存方式:

说明一下爬取到的数据:

爬取豆瓣读书top250网页的相关信息:

书名title、链接link、国家country、作者author、翻译者translator、出版社publisher、出版时间time、价格price、星级star、评分score、评分人数people、简介comment

请添加图片描述

1. Excel

主要讲解两种方式:openpyxlpandas

1.1 openpyxl

class ExcelPipeline:
    def __init__(self):
        # 创建Excel文件
        self.wb = Workbook()
        # 选取第一个工作表
        self.ws = self.wb.active
        # 写入表头
        self.ws.append(['title', 'link', 'country',
                        'author', 'translator', 'publisher',
                        'time', 'price', 'star', 'score',
                        'people', 'comment'
                        ])

    def process_item(self, item, spider):
        self.ws.append([
            item.get('title', ''),
            item.get('link', ''),
            item.get('country', ''),
            item.get('author', ''),
            item.get('translator', ''),
            item.get('publisher', ''),
            item.get('time', ''),
            item.get('price', ''),
            item.get('star', ''),
            item.get('score', ''),
            item.get('people', ''),
            item.get('comment', '')
        ])
        return item

    def close_spider(self, spider):
        self.wb.save('result.xlsx')

1.1.1 代码说明

ExcelPipeline 继承自 Scrapy 的 Pipeline 类,并重写了三个方法:__init__()process_item()close_spider()

__init__() 方法中:

  • 创建了一个 Excel 文件,并选取了第一个工作表。然后,我们写入了表头。
  • 当然你也可以将这部分代码写在open_spider方法中

process_item() 方法中,我们将每一行的数据写入到工作表中。

process_item 方法:

  • 不会覆盖之前已经写入的数据,它会在数据末尾追加新的行。
  • 你调用多次 process_item 方法,每次都会在表格的末尾追加一行新数据。

close_spider() 方法中,我们保存 Excel 文件。

1.1.2 注意

可以发现我在process_item()方法中使用了item.get(key, default)

考虑可能存在某些 item 中没有某些键值的情况,这可能会导致程序出错。

当然如果你已经进行过数据处理也可以直接用item[key]

使用了 item.get(key, default) 方法来获取 item 中的键值,如果某个键不存在,则返回一个空字符串 ''

在 Scrapy 中,item 是一个字典类型,它由一系列键值对组成,每个键值对表示一个字段。在处理 item 时,我们通常需要从中获取某个字段的值。使用字典的 get 方法可以方便地实现这个功能。

get 方法有两个参数:key 表示要获取的键,default 表示键不存在时的默认值。例如:

1.2 pandas

class ExcelPipeline:
    def __init__(self):
        # 创建一个空的数据框
        self.df = pd.DataFrame(columns=['title', 'link', 'country',
                                        'author', 'translator', 'publisher',
                                        'time', 'price', 'star', 'score',
                                        'people', 'comment'
                                        ])

    def process_item(self, item, spider):
        # 将数据添加到数据框中
        item['title'] = item.get('title', '')
        item['link'] = item.get('link', '')
        item['country'] = item.get('country', '')
        item['author'] = item.get('author', '')
        item['translator'] = item.get('translator', '')
        item['publisher'] = item.get('publisher', '')
        item['time'] = item.get('time', '')
        item['price'] = item.get('price', '')
        item['star'] = item.get('star', '')
        item['score'] = item.get('score', '')
        item['people'] = item.get('people', '')
        item['comment'] = item.get('comment', '')
        series = pd.Series(item)
        self.df = self.df.append(series, ignore_index=True)
        return item

    def close_spider(self, spider):
        # 将数据框保存到 Excel 文件中
        self.df.to_excel('result.xlsx', index=False)

1.2.1 代码说明

定义了一个 ExcelPipeline 类,它包含了三个方法:__init__process_itemclose_spider

  • __init__ 方法用于初始化类实例
  • process_item 方法用于处理每个爬取到的 item,将其添加到 items 列表中
  • close_spider 方法用于在爬虫关闭时将 items 列表中的数据保存到 Excel 文件中。

1.2.2 常见错误

在代码中有大量的item['title'] = item.get('title', '')类似代码

你可以选择不写,但如果item中有一些字段的值为None,而pandas不支持将None类型的值添加到DataFrame中,会导致程序错误。这一点比openpyxl要严格的多。

字典对象转换为Series对象

self.df是一个DataFrame对象,而item是一个字典对象。因此,需要将字典对象转换为Series对象,然后再将其添加到DataFrame中。

series = pd.Series(item)
self.df = self.df.append(series, ignore_index=True)

only Series and DataFrame objs are valid这个错误一般就是发生在使用Pandas将数据转换成DataFrame时,传入的参数不是Series或DataFrame类型。

上面的代码就是用来避免这个问题的。

1.3 openpyxl和pandas对比

pandas和openpyxl都是非常强大的Python数据处理库,两者在不同的场景下可以发挥出各自的优势。

  • 如果需要处理大量的Excel文件,需要对文件进行复杂的操作,比如格式化、图表等,那么openpyxl可能更适合,因为它专注于Excel文件的读写和操作,具有更高的灵活性和控制力。
  • 如果数据已经在Python中,且需要进行各种统计分析和处理,如数据聚合、数据透视表、数据分组、数据清洗、数据可视化等,那么pandas可能更适合,因为它提供了丰富的数据处理工具和函数。

总的来说,两者都是很好的工具,具体使用哪一个取决于具体需求和场景。

2. MYSQL

可以使用Python的MySQL驱动程序,例如 mysql-connector-pythonpymysql。主要将pymysql。

class MySQLPipeline:
    def __init__(self):
        # 连接 MySQL 数据库
        self.conn = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            passWord='your_password',
            database='your_database',
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
        # 创建一个游标对象
        self.cursor = self.conn.cursor()
        # 创建表
        self.create_table()

    def create_table(self):
        # SQL 语句:创建数据表
        sql = '''CREATE TABLE IF NOT EXISTS `book` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `title` varchar(255) NOT NULL,
            `link` varchar(255) NOT NULL,
            `country` varchar(255) NOT NULL,
            `author` varchar(255) NOT NULL,
            `translator` varchar(255) NOT NULL,
            `publisher` varchar(255) NOT NULL,
            `time` varchar(255) NOT NULL,
            `price` varchar(255) NOT NULL,
            `star` varchar(255) NOT NULL,
            `score` varchar(255) NOT NULL,
            `people` varchar(255) NOT NULL,
            `comment` varchar(255) NOT NULL,
            PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci'''
        # 执行 SQL 语句
        self.cursor.execute(sql)
        # 提交事务
        self.conn.commit()

    def process_item(self, item, spider):
        # SQL 语句:插入数据
        sql = '''INSERT INTO `book` (
                `title`, `link`, `country`,
                `author`, `translator`, `publisher`,
                `time`, `price`, `star`, `score`,
                `people`, `comment`
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'''
        # 执行 SQL 语句
        self.cursor.execute(sql, (
            item['title'], item['link'], item['country'],
            item['author'], item['translator'], item['publisher'],
            item['time'], item['price'], item['star'], item['score'],
            item['people'], item['comment']
        ))
        # 提交事务
        self.conn.commit()
        return item

    def close_spider(self, spider):
        # 关闭游标对象
        self.cursor.close()
        # 关闭数据库连接
        self.conn.close()

2.1 代码说明

我们创建了一个名为MySQLPipeline的自定义ScrapyPipeline。

__init__方法中接收了MySQL数据库的配置信息。

其中还调用了create_table,当然如果保证表已经存在,也没有必要这么写

如果你嫌每次连接都要写信息的话,可以在setting.py中定义MySQL相关变量:

image-20230207083635621

请添加图片描述

create_table方法创建表book

process_item方法用于将抓取的数据插入到数据库表中。

close_spider方法用于关闭游标和连接。

2.2 pymysql介绍

2.2.1 游标对象

在Python中,连接数据库时需要创建一个数据库连接对象,然后通过这个连接对象创建一个游标对象

游标对象是执行数据库操作的主要对象,它负责向数据库发送查询和获取结果。

在Python中,常用的游标对象有CursorDictCursorSSCursor等。

  • Cursor:普通游标(默认),返回结果为元组类型。
  • DictCursor:字典游标,返回结果为字典类型。
  • SSCursor:嵌套游标,可用于处理大数据集。

在获取大量数据时效率比普通游标更高,但是会占用更多的系统资源。

与普通游标相比,嵌套游标不会将整个查询结果读入内存,而是每次只读取部分数据。

根据需要,选择不同类型的游标对象可以方便我们对返回结果进行处理。

2.2.2 各种游标说明

创建连接对象时有这么一段代码:

cursorclass=pymysql.cursors.DictCursor

用于设置游标返回的数据类型,默认返回的是元组(tuple)类型,设置为DictCursor后可以返回字典(dict)类型,更方便处理数据。一般使用普通游标就行了

三种游标主要是在查询时的方式存在区别:

cur = conn.cursor()
cur.execute('SELECT * FROM my_table')
result = cur.fetchone()  # 获取一条记录,返回的是元组类型
# 普通游标
print(result[0])  # 访问第一个字段的值
# 字典游标
print(result['id'])  # 访问数据库中字段名为 id 的字段的值,{'id': 1, 'name': 'Alice'}

# 嵌套游标
print(result[0])  # 访问第一个字段的值

如果是查询的多条数据,则返回的是元组或字典组成的列表:

# 普通游标
[(1, 'John', 'Doe'), (2, 'Jane', 'Doe'), (3, 'Bob', 'Smith')]
# 字典游标
[{'id': 1, 'first_name': 'John', 'last_name': 'Doe'}, {'id': 2, 'first_name': 'Jane', 'last_name': 'Doe'}, {'id': 3, 'first_name': 'Bob', 'last_name': 'Smith'}]

3. 特别说明

每个item在被提交给管道时都会调用一次管道类的process_item方法。

每个item都会经过process_item方法进行处理,而open_spiderclose_spider方法只会在爬虫启动和结束时执行一次。

在Scrapy中,可以通过在管道类的open_spiderclose_spider方法中建立和关闭数据库连接,以减少连接建立和关闭的次数。

__init__方法也是只在Spider启动时只执行一次

具体做法是,在open_spider方法中建立数据库连接,在process_item方法中使用连接对数据进行存储操作,在close_spider方法中关闭连接。这样做可以有效减少连接的建立和关闭次数,提高爬取效率。

如果你在open_spider方法中创建了数据库连接,那么这个连接将会被共享并被多个process_item方法使用。

同样的,如果在close_spider方法中关闭了数据库连接,那么这个连接也会被所有的process_item方法共享并在爬虫结束时关闭。

这种做法可以减少不必要的连接和关闭操作,从而提高性能。

到此这篇关于Scrapy将数据保存到Excel和MySQL中的方法实现的文章就介绍到这了,更多相关Scrapy数据保存到Excel和MySQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: Scrapy将数据保存到Excel和MySQL中的方法实现

本文链接: https://www.lsjlt.com/news/197834.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Scrapy将数据保存到Excel和MySQL中的方法实现
    目录1. Excel1.1 openpyxl1.1.1 代码说明1.1.2 注意1.2 pandas1.2.1 代码说明1.2.2 常见错误1.3 openpyxl和pandas对比2. mysql2.1 代码说明2.2...
    99+
    2023-02-28
    Scrapy数据保存到Excel Scrapy数据保存到MySQL
  • Scrapy怎么将数据保存到Excel和MySQL中
    这篇文章主要讲解了“Scrapy怎么将数据保存到Excel和MySQL中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scrapy怎么将数据保存到Excel和MySQL中”吧!Scrapy是...
    99+
    2023-07-05
  • C#将DataGridView中的数据保存到CSV和Excel中
    一、保存到CSV public static bool dataGridViewToCSV(DataGridView dataGridView) { ...
    99+
    2024-04-02
  • C#怎么将DataGridView中的数据保存到CSV和Excel中
    这篇文章主要介绍“C#怎么将DataGridView中的数据保存到CSV和Excel中”,在日常操作中,相信很多人在C#怎么将DataGridView中的数据保存到CSV和Excel中问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-30
  • 将爬取的数据保存到mysql中
    为了把数据保存到mysql费了很多周折,早上再来折腾,终于折腾好了 安装数据库 1、pip install pymysql(根据版本来装) 2、创建数据       打开终端 键入mysql -u root -p  回车输入密码     ...
    99+
    2023-01-30
    数据 将爬取 mysql
  • Java中用POI实现将数据导出到Excel的方法
    这篇文章将为大家详细讲解有关Java中用POI实现将数据导出到Excel的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一...
    99+
    2023-06-14
  • JS实现将数据导出到Excel的方法详解
    修改之前项目代码的时候,发现前人导出excel是用纯javascript实现的。并没有调用后台接口。 之前从来没这么用过,记录一下。以备不时之需。 方法一: 将table标签,包括t...
    99+
    2024-04-02
  • Java将Excel数据导入到数据库的方法
    小编给大家分享一下Java将Excel数据导入到数据库的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!所用Jar包 sqljdbc4.jar连接数据库的Jar...
    99+
    2023-05-30
    java excel 数据库
  • PHP实现将Word文件保存到SQLServer数据库
    算起来,折腾了整整一天,就是完成将上传的Word文件保存到MS SQL Server 2014数据库中。 第一次使用PHP来开发一个小程序,压力也挺大,主要是用户觉得我很快就能完成,...
    99+
    2024-04-02
  • 使用Scrapy框架爬取网页并保存到Mysql的实现
    大家好,这一期阿彬给大家分享Scrapy爬虫框架与本地Mysql的使用。今天阿彬爬取的网页是虎扑体育网。 (1)打开虎扑体育网,分析一下网页的数据,使用xpath定位元素。 &nb...
    99+
    2024-04-02
  • Android开发实现读取excel数据并保存为xml的方法
    本文实例讲述了Android开发实现读取excel数据并保存为xml的方法。分享给大家供大家参考,具体如下:前阵子,公司请外面人翻译了一些android中values中的一些strings,然而保存的都是excel格式,如果单纯的将exce...
    99+
    2023-05-30
    android excel xml
  • Java中用POI实现将数据导出到Excel
    一、前言 数据导出为Excel在我们写项目的过程中经常用到 需要用到的jar包 poi-3.17.jar 二、具体实现步骤 //第一步创建一个webbook,对应一个Excel...
    99+
    2024-04-02
  • Springboot实现Excel批量导入数据并保存到本地
    目录前言成果展示了解Excel表格基本属性表设计引入依赖 工具类ControllerentityMapperUserService测试总结前言 当我们给数据库中的表中添加数...
    99+
    2024-04-02
  • mysql数据库表导出到excel的方法
    mysql数据库表导出到excel的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql数据库表导出到excel的...
    99+
    2024-04-02
  • django将图片保存到mysql数据库并展示在前端页面的实现
    小编使用python中的django框架来完成! 1,首先用pycharm创建django项目并配置相关环境 这里小编默认项目都会创建 settings.py中要修改的两处配置 ...
    99+
    2024-04-02
  • 如何将python中的数据存储到mysql中
    目录 一、最基本的准备 1.1 本地安装mysql,推荐安装以下其中之一  1.2 安装python软件 二、建立连接 1.1打开PyCharm编程软件  1.2 打开mysql软件,否则连接不上  1.3 在python环...
    99+
    2023-09-07
    mysql 数据库
  • Python实现将MongoDB中的数据导入到MySQL
    本文主要介绍了一个将 MongoDB 中的数据导入到 mysql 中的 python 工具类 MongoToMysql。该工具类实现了获取 MongoDB 数据类型、创建 MySQL 表结构以及将数据从 MongoDB ...
    99+
    2023-05-05
    Python实现MongoDB数据导入MySQL Python MongoDB数据导入MySQL Python MongoDB MySQL
  • PHP怎么实现将Word文件保存到SQL Server数据库
    这篇文章将为大家详细讲解有关PHP怎么实现将Word文件保存到SQL Server数据库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。完成界面:前端的页面文件:<!DOCTYPE ...
    99+
    2023-06-29
  • 将图片保存到mysql数据库并展示在前端页面的实现代码
    目录1,首先用pycharm创建django项目并配置相关环境2,创建表3,上传图片功能4,展示图片功能5,删除图片功能小编使用python中的django框架来完成! 1,首先用p...
    99+
    2024-04-02
  • mysql更改数据保存路径的方法
    mysql更改数据保存路径的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql更改数据保存的路径的方法:1、停止...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作