scrapy 序列化写入器

Scrapy支持多种序列化格式(serialization format)及存储方式(storage backends)。

如果你是想单纯的将数据输出或存入文件,那直接可以用Scrapy提供的现成类。
Item Exporters

为了使用 Item Exporter,你必须对 Item Exporter 及其参数 (args) 实例化。每个 Item Exporter 需要不同的参数 。在实例化了 exporter 之后,你必须:

  • 调用方法start_exporting()以标识过程的开始。
  • 对要导出的每个item调用export_item()方法。
  • 最后调用finish_exporting()表示过程的结束

例如:

from scrapy.exporters import JsonItemExporterclass TestPipeline(object):def open_spider(self, spider):self.fp = open("data.json", 'wb')  # 打开文件 ,要以wb的形式打开self.exporter = JsonItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')   # 实例化写入器self.exporter.start_exporting() # 开启写入器def process_item(self, item, spider):self.exporter.export_item(item) # 写入一条数据return itemdef close_spider(self, spider):self.exporter.finish_exporting() # 关闭写入器self.fp.close()  # 关闭文件

序列化方式(Serialization formats)

导入方式:from scrapy.exporters import XXXX

  • JSON(常用)

    • JsonItemExporter
      
  • JSON lines(常用)

    • JsonLinesItemExporter
      
  • CSV

    • CsvItemExporter
      
  • XML

    • XmlItemExporter
      

关于JsonItemExporter和JsonLinesItemExporter

源码如下:

class JsonLinesItemExporter(BaseItemExporter):#指定了输出文件,以及BaseItemExporter所需要的属性。#ScrapyJSONEncoder提供了将字典类型的数据转换为Json格式数据的方法def __init__(self, file, **kwargs):self._configure(kwargs, dont_fail=True)self.file = filekwargs.setdefault('ensure_ascii', not self.encoding)self.encoder = ScrapyJSONEncoder(**kwargs)#将转化为字典类型的item写入指定的文件中,每条数据就是一个字典def export_item(self, item):itemdict = dict(self._get_serialized_fields(item))data = self.encoder.encode(itemdict) + '\n'self.file.write(to_bytes(data, self.encoding))class JsonItemExporter(BaseItemExporter):#创建Json格式的Exporter
#与JsonLinesItemExporter不同的是该类会把所有的item封装成数组写入文件,
#整个json文件就是一个列表。def __init__(self, file, **kwargs):self._configure(kwargs, dont_fail=True)self.file = file# there is a small difference between the behaviour or JsonItemExporter.indent# and ScrapyJSONEncoder.indent. ScrapyJSONEncoder.indent=None is needed to prevent# the addition of newlines everywherejson_indent = self.indent if self.indent is not None and self.indent > 0 else Nonekwargs.setdefault('indent', json_indent)kwargs.setdefault('ensure_ascii', not self.encoding)self.encoder = ScrapyJSONEncoder(**kwargs)self.first_item = Truedef _beautify_newline(self):if self.indent is not None:self.file.write(b'\n')def start_exporting(self):self.file.write(b"[")self._beautify_newline()def finish_exporting(self):self._beautify_newline()self.file.write(b"]")def export_item(self, item):if self.first_item:self.first_item = Falseelse:self.file.write(b',') # 添加逗号self._beautify_newline()  # 添加\n换行itemdict = dict(self._get_serialized_fields(item))data = self.encoder.encode(itemdict)self.file.write(to_bytes(data, self.encoding))

大致概括下:

(要用二进制的方式来写)

首先我们从名字里大致可以看出来了,两者区别 Lines 也就是行的意思.

JsonLinesItemExporter每一条数据就是一个字典,一个字典一行,没有逗号隔开,这个文件不是一个特别规范的json文件

JsonItemExporter在打开写入器和关闭写入器的时候分别写入看[]并且每一条数据都有逗号和换行分隔,整个文件是一个字典列表

scrapy 序列化写入器 ——ItemExporter相关推荐

  1. 2013-6-28-StreamWriter写入器

    1.web StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "/xmuser_add.t ...

  2. python在读写文件之前需要创建文件对象-Python对象序列化写入文件对象

    1.创建Python文件对象的读写模式(r,w模式)与创建Java输入输出流: FileInputStream inputStream=new FileInputStream(new File(&qu ...

  3. C#温故而知新学习系列之XML编程—Xml写入器XmlWriter类(三)

    前言 与XmlReader类相对应,.NETFramework也提供了一个以快速的,非缓存的,只向前的,动态写入XML数据的类即XmlWriter类,可以将XmlWriter类理解为与XmlReade ...

  4. java 序列化 写入mysql_java 序列化到mysql数据库中

    使用hibernate跟数据库打交道 hibernate配置文件如下 /p> "-//Hibernate/Hibernate Configuration DTD 3.0//EN&quo ...

  5. scrapy异步写入mysql_scrapy之异步写入数据库

    1 setting.py文件,写入数据库连接属性# mysql连接属性 MYHOST = '127.0.0.1' MYUSER = 'root' MYPASSWORD = '123' MYDB = ' ...

  6. 网络爬虫--26.Scrapy中下载器中间件Downloader Middlewares的使用

    文章目录 一. Downloader Middlewares 二. 设置随机请求头 三. ip代理池中间件 一. Downloader Middlewares 二. 设置随机请求头 三. ip代理池中 ...

  7. Scrapy是什么?Scrapy怎么用?Scrapy进阶使用[链接提取器、自动登录、图片(文件)下载器](基于scrapy2.0+编写) ๑乛◡乛๑ Scrapy框架使用方法

    文章目录 Scrapy框架 链接提取器(LinkExtractors) Rule与LinkExtractor 实战演示 自动登录 旧方法-携带cookie登录和模拟提交登录表单 新方法-自动登录 图片 ...

  8. Python scrapy爬虫爬取伯乐在线全部文章,并写入数据库

    伯乐在线爬虫项目目的及项目准备: 1.使用scrapy创建项目 2.创建爬虫,bole 域名 jobbole.com 3.Start_urls = ['http://blog.jobbole.com/ ...

  9. html5lib解析丢失span标签,xpath - 可以用Beautiful Soup的html5lib解析器替换Scrapy的默认lxml解析器吗? - 堆栈内存溢出...

    问题:有没有办法将BeautifulSoup的html5lib解析器集成到scrapy项目中,而不是scrapy的默认lxml解析器中? Scrapy的解析器在某些抓取页面上失败(对于某些元素). 每 ...

最新文章

  1. sitemesh的使用
  2. 另类vs2015+xamarin 的android界面乱码 解决
  3. 中采购订单批导的bapi_跟着团子学SAP PS—项目中的物料组件
  4. [图示]做人36字诀:二)形象塑造 ——教你品格高雅
  5. 宏与内联(inline)的区别(转载)
  6. 数通手稿留档——Frame Relay
  7. @ConfigurationProperties 在IDEA中出现红色波浪线问题
  8. 华为将发布鲲鹏 920 芯片数据;三星 S10 自燃;Mageia 7 正式发布 | 极客头条
  9. 家居建材行业信息化管理需内外兼修
  10. 使用全局变量有什么好处?有什么坏处?_发酵床养殖有什么好处?又有什么坏处?该不该采用...
  11. java web sqlmapapi,Sqlmap的sqlmapapi.py简单使用
  12. 【vba-1】vba操作word所有图片居中
  13. Arduino和SX1278的那些事
  14. 高德地图marker事件监听-高德地图marker绑定事件就执行了[解决立即执行]
  15. 【SPSS】【Python】“发生严重错误客户端无法再与服务器通信”无法导入表格
  16. RemoteView流程
  17. 【Spring】入门
  18. 新型病毒来了【PcaPatchDbTask】
  19. 欧拉操作系统(openEuler)简介
  20. redis并发处理慢

热门文章

  1. 单元测试框架之Robolectric踩坑
  2. 通过fiddler和逍遥模拟器模拟抓包android手机
  3. 常用模块(json/pickle/shelve/XML)
  4. 监控SRE的黄金信号
  5. 金额数字转中文大写(转)
  6. H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式
  7. 两个int()方法的区别
  8. WinAPI: PolylineTo - 绘制一组连续线段(更新当前位置)
  9. 你们公司还没使用HTTP3?赶紧来补一补,学习一下如何在Nginx上配置HTTP3。
  10. JSON与Protocol Buffers的一些比较