使用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文件。