无力吐槽的python2,对中文太不友好了,不过在早期项目中还是需要用到

没办法,还是需要解决

我编写scrapy爬虫的一般思路:

  1. 创建spider文件和类
  2. 编写parse解析函数,抓取测试,将有用信息输出到控制台
  3. 在数据库中创建数据表
  4. 编写item
  5. 编写model(配合pipline将item写入数据库)
  6. 编写pipline
  7. 运行爬虫项目,测试保存的数据正确性

在第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乱码相关推荐

  1. Python 爬虫数据写入csv文件中文乱码解决以及天眼查爬虫数据写入csv

    python爬虫数据写入csv文件中文乱码,用'utf-8'在pycharm中打开文件没有问题,但是用excel打开却出现了问题,以下为解决方法. (最近在练习爬虫,这个博文是对自己学习的记录和分享, ...

  2. Python爬虫5.3 — scrapy框架spider[Request和Response]模块的使用

    Python爬虫5.3 - scrapy框架spider[Request和Response]模块的使用 综述 Request对象 scrapy.Request()函数讲解: Response对象 发送 ...

  3. pythonscrapy爬虫_零基础写python爬虫之使用Scrapy框架编写爬虫

    网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...

  4. python爬虫之使用Scrapy框架编写爬虫

    转自:http://www.jb51.net/article/57183.htm 前面的文章我们介绍了Python爬虫框架Scrapy的安装与配置等基本资料,本文我们就来看看如何使用Scrapy框架方 ...

  5. python爬虫入门(六) Scrapy框架之原理介绍

    Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...

  6. python2.x环境下unicode乱码转中文显示的2种解决方案总结

    方法见代码注释,python2.x环境下,注意,仅仅适用于unicode乱码情况,不适用于 类似于这种/xae的乱码情况 # -*- coding: utf-8 -*-# # from gensim ...

  7. PYTHON 爬虫笔记十一:Scrapy框架的基本使用

    Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为 ...

  8. python爬虫之路scrapy

    python里面的yield怎么用? yield from是什么意思? scrpay The best way to learn is with examples, and Scrapy is no ...

  9. Python爬虫扩展库scrapy选择器用法入门(一)

    关于BeutifulSoup4的用法入门请参考Python爬虫扩展库BeautifulSoup4用法精要,scrapy爬虫案例请参考Python使用Scrapy爬虫框架爬取天涯社区小说"大宗 ...

最新文章

  1. 我眼中未来的计算机作文600字,我的电脑作文600字
  2. 更改日期为英文_如何在 Linux 上检查所有用户密码到期日期 | Linux 中国
  3. C语言插入排序(解析)
  4. 云服务器 怎样修改地域,云服务器 怎样修改地域
  5. 使用MAC 编译合约的时候报错:
  6. leetcode —— 216. 组合总和 III
  7. python灰产_Python进行目录的对比
  8. 你愿意一辈子当一个打工的吗
  9. 如何对一个普通的Java项目进行打包,打成jar包,idea操作
  10. java集合框架图(详细版)
  11. oracle 整理表 碎片,Oracle数据库表空间碎片的查询和整理方法
  12. 头条小程序登录40014 bad params
  13. android设置透明主题后背景为黑色,android – 活动应该是透明的,但有黑色背景
  14. 第九届全国大学生GIS应用技能大赛下午(试题及参考答案含数据)
  15. 2020 第一周工作总结:TAGE分支预测器算法
  16. Apache的域名配置
  17. supervisor前端-cesi的安装
  18. Spring事务管理中异常回滚知识点总结
  19. 微型计算机技术中 通过系统把CPU,【单选题】在微型计算机技术中,通过系统   把CPU、存储器、输入设备和输出设备连接起来,实现信息交换。...
  20. STM32外部中断及串口

热门文章

  1. 高效轻量级深度模型的研究与实践
  2. 20189311《网络攻防》第八周作业
  3. 相对介电参数以及损耗因子的计算
  4. 小旋风百度SEO批量PING推送工具
  5. 新手如何快速学习贴吧顶贴,一位来自老司机的自述
  6. Cortex-M0处理器简介
  7. upload-labs-04
  8. qdialog隐藏关闭按钮_宝马隐藏功能大分享!别说没告诉你...
  9. VIRES的开放平台及资源
  10. 联想笔记本电脑连接不到无线网络的解决办法