使用Exporter导出数据

 

在scrapy中,负责导出数据的组件被称为Exporter,scrapy内部实现了多个exporter,每个实现了一种数据格式,支持的数据格式:

  JSON

  JSON lines

  CSV

  XML

  Pickle

  Marshal

如果需要其他形式,可以自行实现Exporter

 

我们可以通过两种方式来指定爬虫的导出数据:

  通过命令行的方式

  通过配置文件指定

#命令行方式这里不再介绍
#直接说一下配置文件方式,小编认为更加方便

 

 

FEED_URL:导出文件的路径
    FEED_URL = 'export_data/%(name)s.data'
        %(name)s:spider的名字
        %(time)s:文件的创建时间
FEED_FORMAT:导出文件的格式
FEED_EXPORT_ENCODING:导出文件编码格式(默认json使用数字编码,其他使用utf-8编码)
FEED_EXPORT_FIELDS:导出数据包含的字段
FEED_EXPORTRS:导出数据的新格式,自己实现了Exportes

 

其中的每一个Exporter都是BaseItemExporter的一个子类, BaseItemExporter定义了一些抽象接口待子类实现:

export_item(self, item)
负责导出爬取到的每一项数据,参数item为一项爬取到的数据,每个子类必须实现该方法。

start_exporting(self)
在导出开始时被调用,可在该方法中执行某些初始化工作。

finish_exporting(self)
在导出完成时被调用,可在该方法中执行某些清理工作。

为了使最终导出结果是一个json中的列表,在 start_exporting和finish_exporting方法中分别向文件写 入b"[\n, b"\n]"

在export_item方法中,调用self.encoder.encode方法将一 项数据转换成json串(具体细节不再赘述),然后写入文 件。

 

 

实现一个使用Excel格式导出的Exporter

from scrapy.exporters import BaseItemExporter     
import xlw

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
使用xlwt的第三方库将数据写入Excel

在构造器方法中创建Workbook对象和Worksheet对象,并初 始化用来记录写入行坐标的self.row。

在export_item方法中调用基类的_get_serialized_fields 方法,获得item所有字段的迭代器,然后调用 self.wsheet.write方法将各字段写入Excel表格。

finish_exporting方法在所有数据都被写入Excel表格后被 调用,在该方法中调用self.wbook.save方法将Excel表格写 入Excel文件。 

 

posted @ 2020-05-07 13:34  风之老凌  阅读(312)  评论(0)    收藏  举报