Python爬虫:python2使用scrapy输出unicode乱码
无力吐槽的python2,对中文太不友好了,不过在早期项目中还是需要用到
没办法,还是需要解决
我编写scrapy爬虫的一般思路:
- 创建spider文件和类
- 编写parse解析函数,抓取测试,将有用信息输出到控制台
- 在数据库中创建数据表
- 编写item
- 编写model(配合pipline将item写入数据库)
- 编写pipline
- 运行爬虫项目,测试保存的数据正确性
在第2步抓取测试的时候,我并没有创建数据库(因为我感觉在数据库中创建数据表比较麻烦,考虑的因素比较多),并不能保存数据到数据库,直接输出到控制台又不能很好地看到数据的整体效果
一个解决办法就是利用scrapy提供的数据导出中间件,将抓取的数据导出到json或者scv文件中
$ scrapy crawl spider_name -o person.json
额,python2。。。我的天,抓取的数据大概是这样的
[
{"name": "\u5f20\u4e39"},
{"name": "\u77bf\u6653\u94e7"},
{"name": "\u95eb\u5927\u9e4f"},
{"name": "\u9c8d\u6d77\u660e"},
{"name": "\u9648\u53cb\u658c"},
{"name": "\u9648\u5efa\u5cf0"}
]
好吧,英文能看懂,中文反而看不懂了,简直不能忍
接下来对它做点什么
1、找到scrapy默认配置文件
# scrapy.settings.default_settingsFEED_EXPORTERS_BASE = {'json': 'scrapy.exporters.JsonItemExporter','jsonlines': 'scrapy.exporters.JsonLinesItemExporter','jl': 'scrapy.exporters.JsonLinesItemExporter','csv': 'scrapy.exporters.CsvItemExporter','xml': 'scrapy.exporters.XmlItemExporter','marshal': 'scrapy.exporters.MarshalItemExporter','pickle': 'scrapy.exporters.PickleItemExporter',
}
2、看到json的导出类,按照路径找到这个类
# scrapy.exporters.JsonItemExporterclass JsonItemExporter(BaseItemExporter):def __init__(self, file, **kwargs):self._configure(kwargs, dont_fail=True)self.file = fileself.encoder = ScrapyJSONEncoder(**kwargs)self.first_item = Truedef start_exporting(self):self.file.write(b"[\n")def finish_exporting(self):self.file.write(b"\n]")def export_item(self, item):if self.first_item:self.first_item = Falseelse:self.file.write(b',\n')itemdict = dict(self._get_serialized_fields(item))self.file.write(to_bytes(self.encoder.encode(itemdict)))
看到最下面一句,写入文件,后面还对其进行了编码,我们就在这里做工作
3、改写JsonItemExporter
方法1:
import jsonclass MyJsonItemExporter(JsonItemExporter):def export_item(self, item):if self.first_item:self.first_item = Falseelse:self.file.write(b',\n')itemdict = dict(self._get_serialized_fields(item))self.file.write(json.dumps(itemdict, ensure_ascii=False))
继承原有的JsonItemExporter类,将最下面的写入文件代码修改即可,这种方式比较直观,也比较简单
方式2:
我们注意到JsonItemExporter中的初始化函数有一个属性
self.encoder = ScrapyJSONEncoder(**kwargs)
下面写入的时候也用到了,顺藤摸瓜,依次找到下面两个类,部分代码省略
class ScrapyJSONEncoder(json.JSONEncoder):passclass JSONEncoder(object):def __init__(self, skipkeys=False, ensure_ascii=True,check_circular=True, allow_nan=True, sort_keys=False,indent=None, separators=None, encoding='utf-8', default=None):
这样看来,我们也可以这么改写
class MyJsonItemExporter(JsonItemExporter):def __init__(self, file, **kwargs):super(MyJsonItemExporter, self).__init__(file, ensure_ascii=False, **kwargs)
仅仅只是添加了ensure_ascii=False
, 这样看起来,逼格就高了许多
4、使用MyJsonItemExporter
可以在爬虫中单独设置,也可以设置在全局settings里边
custom_settings = {"FEED_EXPORTERS_BASE":{"json": "MyJsonItemExporter"}
}
再次运行爬虫,这次我能看懂中文了
[
{"name": "张丹"},
{"name": "闫大鹏"},
{"name": "瞿晓铧"},
{"name": "鲍海明"},
{"name": "陈友斌"},
{"name": "陈建峰"}
]
参考
scrapy避免直接输出unicode
Python爬虫:python2使用scrapy输出unicode乱码相关推荐
- Python 爬虫数据写入csv文件中文乱码解决以及天眼查爬虫数据写入csv
python爬虫数据写入csv文件中文乱码,用'utf-8'在pycharm中打开文件没有问题,但是用excel打开却出现了问题,以下为解决方法. (最近在练习爬虫,这个博文是对自己学习的记录和分享, ...
- Python爬虫5.3 — scrapy框架spider[Request和Response]模块的使用
Python爬虫5.3 - scrapy框架spider[Request和Response]模块的使用 综述 Request对象 scrapy.Request()函数讲解: Response对象 发送 ...
- pythonscrapy爬虫_零基础写python爬虫之使用Scrapy框架编写爬虫
网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...
- python爬虫之使用Scrapy框架编写爬虫
转自:http://www.jb51.net/article/57183.htm 前面的文章我们介绍了Python爬虫框架Scrapy的安装与配置等基本资料,本文我们就来看看如何使用Scrapy框架方 ...
- python爬虫入门(六) Scrapy框架之原理介绍
Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...
- python2.x环境下unicode乱码转中文显示的2种解决方案总结
方法见代码注释,python2.x环境下,注意,仅仅适用于unicode乱码情况,不适用于 类似于这种/xae的乱码情况 # -*- coding: utf-8 -*-# # from gensim ...
- PYTHON 爬虫笔记十一:Scrapy框架的基本使用
Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为 ...
- python爬虫之路scrapy
python里面的yield怎么用? yield from是什么意思? scrpay The best way to learn is with examples, and Scrapy is no ...
- Python爬虫扩展库scrapy选择器用法入门(一)
关于BeutifulSoup4的用法入门请参考Python爬虫扩展库BeautifulSoup4用法精要,scrapy爬虫案例请参考Python使用Scrapy爬虫框架爬取天涯社区小说"大宗 ...
最新文章
- 我眼中未来的计算机作文600字,我的电脑作文600字
- 更改日期为英文_如何在 Linux 上检查所有用户密码到期日期 | Linux 中国
- C语言插入排序(解析)
- 云服务器 怎样修改地域,云服务器 怎样修改地域
- 使用MAC 编译合约的时候报错:
- leetcode —— 216. 组合总和 III
- python灰产_Python进行目录的对比
- 你愿意一辈子当一个打工的吗
- 如何对一个普通的Java项目进行打包,打成jar包,idea操作
- java集合框架图(详细版)
- oracle 整理表 碎片,Oracle数据库表空间碎片的查询和整理方法
- 头条小程序登录40014 bad params
- android设置透明主题后背景为黑色,android – 活动应该是透明的,但有黑色背景
- 第九届全国大学生GIS应用技能大赛下午(试题及参考答案含数据)
- 2020 第一周工作总结:TAGE分支预测器算法
- Apache的域名配置
- supervisor前端-cesi的安装
- Spring事务管理中异常回滚知识点总结
- 微型计算机技术中 通过系统把CPU,【单选题】在微型计算机技术中,通过系统 把CPU、存储器、输入设备和输出设备连接起来,实现信息交换。...
- STM32外部中断及串口