爬虫2.2-scrapy框架-文件写入
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框架-文件写入的更多相关文章
- 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...
- 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...
- 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...
- 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...
- Python爬虫进阶之Scrapy框架安装配置
Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
- 爬虫基础(五)-----scrapy框架简介
---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...
- 爬虫(二)之scrapy框架
01-scrapy介绍 02-项目的目录结构: scrapy.cfg 项目的主配置信息.(真正爬虫相关的配置信息在settings.py 文件中) items.py 设置数据存储模板,用于结构化数据, ...
- 5、爬虫系列之scrapy框架
一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能 ...
随机推荐
- android 下使用Direct Texture
要使用Direct Texture,需要有一份android系统的源码 部分C++代码如下: #include <stdio.h> #include <stdlib.h> #i ...
- 确认框,confirm工具封装
用bootstrap封装了个确认框工具 效果如下 代码如下: /** * 以模态窗做确认框的函数,title为标题栏内容,body为消息体,yesFun为点击确认按钮后执行的函数,执行后会执行关闭并删 ...
- JavaScript小练习3-用循环使三个DIV变色
题目 初始为黑色,点击后为红色,再次点击为黑色,以后每次点击一次变色. 分析 简单的onclick使用. button的居中可以在外套一个p元素,body中让p居中即可. 三个DIV块的居中,使用ma ...
- MySQL/MariaDB学习笔记——mysql.user表中存在多个root用户问题理解
mysql.user表中存在多个root用户问题 问题描述:使用 SELECT host,user FROM mysql.user 发现mysql.user表中存在三个root用户,如下 持着对中几个 ...
- linux命令sed与awk是干什么用的,怎么用?
非常强大的文本操纵工具,sed,awk,grep 这个三个命令 都是操作文本文件的unix系统有几个非常命令的特点:1. 对于内核而言,unix文件都是字节序列.io设备也是文件.2. 至于文件的含义 ...
- npm安装包时 --save 和 --save-dev 的区别
以npm 安装 vue为例 1.npm install vue: 会把vue包安装到node_modules目录中: 不会修改package.json文件: 之后运行npm install命令时,不会 ...
- Mac下PHP的环境搭建
* 前段时间手欠 ... 入手了一个二手的Macbook pro ! 配置挺高的 16款13寸的基本顶配了 ... 只差 硬盘不是1T的 ... 可以脑补一下配置了* 话说 不是所有程序猿都说 每个程 ...
- 利用haohedi ETL将数据库中的数据抽取到hadoop Hive中
采用HIVE自带的apache 的JDBC驱动导入数据基本上只能采用Load data命令将文本文件导入,采用INSERT ... VALUES的方式插入速度极其慢,插入一条需要几十秒钟,基本上不可用 ...
- 2.2 vivi虚拟视频驱动测试
学习目标:在linux终端安装xawtv,并测试vivi.ko驱动程序. 一.安装xawtv 1)ubuntu能上网情况下,使用命令:# sudo apt-get install xawtv 2)如果 ...
- STM32(9)——通用定时器作为输入捕捉
通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获 ...