scrapy框架-文件写入

1. lowb写法

~pipelines.py
前提回顾,spider.py中 data={'xx':xx, 'xxx':xxx} yield data
import json
class QsbkPipeline(object):
def __init__(self):
self.fp = open('qsbk.json', 'w', encoding='utf-8') # 初始化文件指针 def open_spider(self, spider):
print("spider start") # 方便观察 def process_item(self, item, spider):
data = json.dumps(item, ensure_ascii=False)#将字典转换一下,同时关闭默认的ascii码很坑
self.fp.write(data+'\n') # 每次写入后加入换行 def close_spider(self, spider):
self.fp.close()
print("spider end")

当整个项目开始时,会执行_init_ 和open_spider函数,所以先将文件打开,方便写入。项目结束时运行close_spider函数,在这个地方关闭文件。

每次spider将数据抛出,由process_spider函数进行处理

2. 高端一点的写法

在items.py的类中创建两个实例,作为数据的传输对象
~items.py
import scrapy
class QsbkItem(scrapy.Item):
author = scrapy.Filed()
joke = scrapy.Filed() # 没有为什么,就是用这个类 ~qsbk_spider.py
from qsbk.items import QsbkItem
def parse(self, response):
。。。。
item = QsbkItem(author=author,joke=joke) # 这里author和content是提前处理好的数据,前面的部分省略了。
yield item ~pipelines.py
import json
class QsbkPipeline(object):
....
def process_item(self, itme, spider):
item_json = json.dumps(dict(item), ensure_ascii=False) # 将接收到的item对象转换成字典,再用dumps函数转为json,再调用文件指针写入。
self.fp.write(item_json+'\n')

3. 优化版本

另外对于pipelines.py的文件写入  scrapy由已经定义好的函数
from scrapy.exporters import JsonLinesItemExporter
# JsonItemExporter类在结束时使用self.fp.close,然后将所有json加载到一个列表中,在结束时才统一写入,容易浪费内存,并且需要在open_spider中使用exporting.start函数
# 所以选择这个JsonLinesItemExporter 每次写入一个json,不方便之后的读取。所以数据量小的时候可以选择使用JsonItemExporter。数据也比较安全,当然也有定义好的csv文件写入方法。 ~pipelines.py
from scrapy.exporters import JsonLinesItemExporter
class WxappPipeline(object):
def __init__(self):
self.fp = open('WXAPP.json', 'wb')
self.export = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
self.fp.write(b'[') def process_item(self, item, spider):
self.export.export_item(item) # item是在items.py中定义好的类
self.fp.write(b',')
# 这里每次写入一点json数据后直接放个逗号进入
# 并在开头和结尾加入了 [ ] 这样的话当爬虫结束时,一个完整的json文件就写好了。
return item # 返回item 不然之后的pipeline都没办法用了 def close_spider(self, spider):
self.fp.write(b']')
self.fp.close()

爬虫2.2-scrapy框架-文件写入的更多相关文章

  1. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  2. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  3. 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

    第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...

  4. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  5. Python爬虫进阶之Scrapy框架安装配置

    Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...

  6. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  7. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  8. 爬虫(二)之scrapy框架

    01-scrapy介绍 02-项目的目录结构: scrapy.cfg 项目的主配置信息.(真正爬虫相关的配置信息在settings.py 文件中) items.py 设置数据存储模板,用于结构化数据, ...

  9. 5、爬虫系列之scrapy框架

    一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能 ...

随机推荐

  1. Vue教程:指令与事件(二)

    一.插值 v-once 通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新.但请留心这会影响到该节点上所有的数据绑定: span v-once>这个将不会改 ...

  2. Mybatis 原始dao CRUD方法

    用到的相关jar包及所用版本如下: 其中的Mybatis可以到github.com的网站下载 <project xmlns="http://maven.apache.org/POM/4 ...

  3. 1.Redis介绍以及安装

    Redis介绍 Redis是一个开源的(BSD开源协议),内存数据结构存储,被用于作为数据库,缓存和消息代理. Redis支持如下数据结构: string(字符串) hashes(哈希) lists ...

  4. chromium之observer_list

    典型用法如下 /////////////////////////////////////////////////////////////////////////////// // // OVERVIE ...

  5. window.moveTo(),window.moveBy()不生效

    window.moveTo()和window.moveBy的菜鸟教程介绍: moveTo() 方法可把窗口的左上角移动到一个指定的坐标. window.moveTo(x,y) moveBy() 方法可 ...

  6. JS实现继承 JavaScript

    JS实现继承 JavaScript 定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // ...

  7. python教程(二)·数据类型

    数据类型,顾名思义就是数据的类型,数据到底有哪些类型呢?在python中,最基本的数据类型有好几种,让我来逐个介绍. 整数类型(int) python中只有一种整数类型,就是int类型,在程序中的写法 ...

  8. ACM1003:Max Sum

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  9. 谁能笑到最后,约瑟夫环-Josephus问题求解

     一. 简述Josephus问题 N个人站成一环,从1号开始,用刀将环中后面一个人“消灭“”掉,之后再将刀递给下一个人,这样依次处理,最后留下一个幸存者. 二. 求解方法  1.  约瑟夫问题如果使用 ...

  10. 20145234黄斐《Java程序设计》第八周学习总结

    教材学习内容总结 第十五章部分 - 通用API 通用API 日志: 日志对信息安全意义重大,审计.取证.入侵检测等都会用到日志信息 日志API Logger: 注意无法使用构造方法生成Logger对象 ...