爬虫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是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能 ...
随机推荐
- java eclipse 访问 Oracle数据库的代码
package com.hanqi.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...
- ORACLE中查询语句的执行顺及where部分条件执行顺序测试
Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...
- JSON.stringify()和JSON.parse()的区别
JSON.stringify()此方法用于将一个对象解析成字符串并返回. JSON.parse()此方法刚好相反是将一个字符串对象解析成一个JSON对象.
- iOS 清理Xcode项目中没有使用到的图片资源和类文件
接手到一个旧的项目,但是发现里面有太多的无用资源,包括升级app后,一些无用的图片资源并没有被删掉,导致app在打包成ipa包以后,文件变大.手边这个项目IM要更换成环信的IM,之前的一些旧的SDK, ...
- redis的docker化安装
只需要关注几点: 端口映射 配置文件映射 持久化映射 要做的就是拉取官方镜像并把关注的几个点处理一下就好了: docker pull redis docker run -d -p : -v /data ...
- WIN10下WNMP开发环境部署
刚刚开始学习PHP时,一直使用phpstudy,后面发现很多东西自己单独配置安装会理解更深刻,所以自己总结了一下windows下开发环境的部署教程. 以前经常在CSDN和博客园看别人的教程,今天才注册 ...
- Set的源码分析
Set的内部实现其实是一个Map.即HashSet的内部实现是一个HashMap,TreeSet的内部实现是一个TreeMap,LinkedHashSet的内部实现是一个LinkedHashMap. ...
- Java线程状态图
嘤,先盗图一张,后面再补充描述!
- linux 下安装 Cisco Packet Tracer 7.11以及一些注意
https://blog.csdn.net/qq_35882901/article/details/77652571 https://linux.cn/article-5576-1.html 开启登录 ...
- Developing iOS 8 Apps with Swift (stanford)
https://www.youtube.com/watch?v=JkiB8Zwk-9Q&index=2&list=PLcX0opNQliFl0RTGbY9HHWCFg0Q8_fIF4