爬虫框架Scrapy(9)使用 Exporter 导出数据

news/2024/7/19 12:12:24 标签: python, 爬虫

文章目录

    • 使用 Exporter 导出数据
        • 1. 指定数据导出方法
          • (1)命令行参数指定数据导出方式
          • (2)配置文件指定数据导出方式
        • 2. 添加数据导出格式

使用 Exporter 导出数据

在 Scrapy 中,负责导出数据的组件被称为 Exporter(导出器),Scrapy 内部实现了多个 Exporter,每个 Exporter 实现一种数据格式的导出,支持的数据格式如下(括号中为相应的 Exporter):

  • JSON (JsonItemExporter)
  • JSON lines (JsonLinesItemExporter)
  • CSV (CsvItemExporter)
  • XML (XmlItemExporter)
  • Pickle (PickleItemExporter)
  • Marshal (MarshalItemExporter)

其中,前 4 种是极为常用的文本数据格式,而后两种是 Python 特有的。在大多数情况下,使用 Scrapy 内部提供的 Exporter 就足够 了,需要以其他数据格式(上述6种以外)导出数据时,可以自行实现 Exporter。

1. 指定数据导出方法

在导出数据时,需向Scrapy爬虫提供以下信息:导出文件路径和导出数据格式(即选用哪个Exporter)。

可以通过以下两种方式指定爬虫如何导出数据:① 通过命令行参数指定;② 通过配置文件指定。

(1)命令行参数指定数据导出方式

在运行 scrapy crawl 命令时,可以分别使用 -o-t 参数指定导出文件路径以及导出数据格式。 -o 参数我们并不陌生,前面我们已经在多个实例中运用过。使用方式如下:

$ scrapy crawl books -o books.csv

其中,-o books.csv 指定了导出文件的路径,在这里虽然没有使用 -t 参数指定导出数据格式,但 Scrapy 爬虫通过文件后缀名推断出我们想以 CSV 作为导出数据格式。同样的道理,如果将参数改为 -o books.json ,Scrapy 爬虫就会以 json 作为导出数据格式。

需要明确地指定导出数据格式时,使用 -t 参数,例如:

$ scrapy crawl books -t csv -o books1.data
...
$ scrapy crawl books -t json -o books2.data
...
$ scrapy crawl books -t xml -o books3.data
...

运行以上命令后,Scrapy 爬虫会以 -t 参数中的数据格式字符串(如csv、json、xml)为键,在配置字典FEED_EXPORTERS 中搜索 Exporter,FEED_EXPORTERS 的内容由以下两个字典的内容合并而成:

  • 默认配置文件中的 FEED_EXPORTERS_BASE
  • 用户配置文件中的 FEED_EXPORTERS

前者包含内部支持的导出数据格式,后者包含用户自定义的导出数据格式。以下是 Scrapy 源码中定义的 FEED_EXPORTERS_BASE ,它位于 scrapy.settings.default_settings 模块:

python">FEED_EXPORTERS_BASE = {
    'json': 'scrapy.exporters.JsonItemExporter',
    'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
    'jl': 'scrapy.exporters.JsonLinesItemExporter',
    'csv': 'scrapy.exporters.CsvItemExporter',
    'xml': 'scrapy.exporters.XmlItemExporter',
    'marshal': 'scrapy.exporters.MarshalItemExporter',
    'pickle': 'scrapy.exporters.PickleItemExporter', 
}

如果用户添加了新的导出数据格式(即实现了新的 Exporter),可在配置文件 settings.py 中定义 FEED_EXPORTERS,例如:

python">FEED_EXPORTERS = {'excel': 'my_project.my_exporters.ExcelItemExporter'}

另外,指定导出文件路径时,还可以使用 %(name)s%(time)s 两个特殊变量:

  • %(name)s:会被替换为 Spider 的名字
  • %(time)s:会被替换为文件创建时间
$ scrapy crawl books -o 'export_data/%(name)s/%(time)s.csv'

使用命令行参数指定如何导出数据很方便,但命令行参数只能指定导出文件路径以及导出数据格式,并且每次都在命令行里输入很长的参数让人很烦躁,使用配置文件可以弥补这些不足。

(2)配置文件指定数据导出方式

接下来,我们在配置文件中指定如何导出数据。下面依次说明几个常用选项:

  • FEED_URI:导出文件路径。

    python">FEED_URI = 'export_data/%(name)s.data'
    
  • FEED_FORMAT:导出数据格式。

    python">FEED_FORMAT = 'csv'
    
  • FEED_EXPORT_ENCODING:导出文件编码(默认情况下 json 文件使用数字编码,其他使用 utf-8 编码)。

    python">FEED_EXPORT_ENCODING = 'gbk'
    
  • FEED_EXPORT_FIELDS:导出数据包含的字段(默认情况下导出所有字段),并指定次序。

    python">FEED_EXPORT_FIELDS = ['name', 'author', 'price']
    
  • FEED_EXPORTERS:用户自定义 Exporter 字典,添加新的导出数据格式时使用。

    python">FEED_EXPORTERS = {'excel': 'my_project.my_exporters.ExcelItemExporter'}
    

2. 添加数据导出格式

在某些需求下,我们想要添加新的导出数据格式,此时需要实现新的 Exporter 类。

接下来,我们参照 JsonItemExporter 的源码,在 toscrapy 项目中实现一个能将数据以 Excel 格式导出的 Exporter。在项目中创建一个 excel_exporter.py(与 settings.py 同级目录),在其中实现 ExcelItemExporter,代码如下:

python">from scrapy.exporters import BaseItemExporter
import xlwt

class ExcelItemExporter(BaseItemExporter):
    def __init__(self, file, **kwargs):
        self._configure(kwargs)
        self.file = file
        self.wbook = xlwt.Workbook()
        self.wsheet = self.wbook.add_sheet('scrapy')
        self.row = 0
        
    def finish_exporting(self):
        self.wbook.save(self.file)
        
    def export_item(self, item):
        fields = self._get_serialized_fields(item)
        for col, v in enumerate(x for _, x in fields):
            self.wsheet.write(self.row, col, v)
        self.row += 1

上述代码解析如下:

  • Step 1:在构造器方法中创建 Workbook 对象和 Worksheet 对象,并初始化用来记录写入行坐标的 self.row 。
  • Step 2:在 export_item 方法中调用基类的 _get_serialized_fields 方法,获得 item 所有字段的迭代器,然后调用 self.wsheet.write 方法将各字段写入 Excel 表格。
  • Step 3:finish_exporting 方法在所有数据都被写入 Excel 表格后被调用,在该方法中调用 self.wbook.save 方法将 Excel 表格写 入 Excel 文件。

完成 ExcelItemExporter 后,在配置文件 settings.py 中添加如下代码:

python">FEED_EXPORTERS = {'excel': 'example.excel_exporter.ExcelItemExporter'}

现在,可以使用 ExcelItemExporter 导出数据了,以 -t excel 为参数重新运行爬虫

$ scrapy crawl books -t excel -o books.xls

如下图所示,我们成功地使用 ExcelItemExporter 将爬取到的数据存入了 Excel 文件中。

在这里插入图片描述


http://www.niftyadmin.cn/n/1190192.html

相关文章

python的可变类型与不可变类型

首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。 用一句话来概括上述过程就是&#xff1…

爬虫框架Scrapy(10)下载文件与图片

文章目录下载文件与图片(一)FilesPipeline 和 ImagesPipeline1. FilesPipeline 使用说明2. ImagesPipeline 使用说明(二)项目实例:下载 matplotlib 例子源码文件1. 页面分析2. 编码实现(1)创建项…

爬虫框架Scrapy(11)模拟登录

文章目录模拟登录(一)网站登录实质(二)发送 Post 请求模拟登录1. 使用 FormRequest2. 实现登录 Spider(三)携带 Cookies 模拟登录1. 人工获取 Cookie 模拟登录(1)人工获取 Cookie&am…

pip install 报错

问题描述,在使用pip安装django相关软件包时,提示错误如下: [roottest4 install]# pip install django1.6 Downloading/unpacking django1.6 Cannot fetch index base URL https://pypi.python.org/simple/ Could not find any downloads that…

爬虫框架Scrapy(12)爬取动态页面

文章目录爬取动态页面(一)Splash 渲染引擎1. render.html 端点2. execute 端点3. 常用属性与方法(1)Splash 对象的属性(2)Splash 对象的方法(二)安装 Scrapy-Scrapy1. 安装 splash 服…

爬虫框架Scrapy(13)保存数据到数据库

文章目录保存数据到数据库(一)数据保存至 MySQL 数据库1. 安装 pymysql2. 创建数据库与表3. 实现 MySQLPipeline(二)数据保存至 MongoDB 数据库1. 安装 pymongo2. 实现 MongoDBPipeline(三)数据保存至 Redi…

Sublime 个人常用快捷键

Sublime 个人常用快捷键 Hot Key Alt F3 选中文本所以有相同项;同多次Ctrl D Ctrl L 选中整行,继续按可继续选 Ctrl Shift M 选择括号内的内容;继续则选择父括号 Ctrl Shift Space 选择区域块内的内容;和Ctrl Shift M类似 Ctrl J 合并选中的多行代码为一行 Ctrl Ent…

利用java mail发送邮件(转)

JavaMail是SUN提供给开发者在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持经常使用的邮件协议,如SMTP、POP3、IMAP。开发者使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket)。JavaMail也提供了可以创建出各种复…