Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0,

使用scrapy命令行工具建立了爬虫项目(startproject),并使用scrapy genspider建立了爬虫,用于抓取某中文门户网站首页的 新闻标题及其链接,全程都在虚拟环境(virtualenv)中执行。

使用scrapy crawl执行爬虫程序并导入一个json文件,此时可以看到,命令行窗口显示的 新闻标题是中文,但在打开导出的json文件时,其新闻标题显示为以\u开头的Unicode编码:

V.S.

文件中的内容并非孤想要的,需要的是 显示为中文。

在胡乱地使用encode('utf-8')、encode('gbk').decode('utf-8')等代码处理后,结果问题未能解决,而且还导致爬虫程序执行发生异常。

直到发现博主“西瓜的瓜”的文章,问题才得以解决:执行scrapy crawl时添加配置 -s FEED_EXPORT_ENCODING=UTF-8。

配置项FEED_EXPORT_ENCODING的官网介绍:

查看scrapy crawl命令的帮助信息:可以看到-o FILE选项是用的“dump”,dump这个词在json模块使用时见到过,而在json中,dump到文件中的非ASCII都被转换为以\u开头的形式。不过,这个帮助信息里面没有说怎么更改或设置。

直到今天(30日)看了Scrapy的Settings文档才对此问题有了更透彻的了解:

给爬虫或爬虫项目添加FEED_EXPORT_ENCODING配置项即可解决问题,这个配置项可以是 命令行级别的(最高)、项目级别的、爬虫级别的;默认情况下,在任何一个地方做了配置,使用-o时输出的文件都会按照这个配置来进行编码。

在西瓜的瓜的博文中,是在命令行中进行设置,最高的优先级(方法一)。

今天尝试了在 爬虫项目 的配置文件settings.py中进行设置,也是可以得到想要的结果的(方法二):此时不需要在命令行中添加FEED_EXPORT_ENCODING选项了。

当然,还有方法三、四、五,就不多说了,大家可以仔细看Scrapy的Settings文档

后记

怎么设置这个到处的编码是best practices呢?设置到哪一级别?是否需要设置?

在本文的示例中,如果不设置的话,Python读取导出的文件时,使用json的loads也是可以获得正确的内容的。

怎么用代码解决这个问题呢?如果使用命令行的-o的话,无法解决,只有通过自己打开、存储内容的方式解决。

在测试过程中,孤还尝试将配置写到项目的scrapy.cfg中,当然,这是错误的。

使用Scrapy命令行工具【导出JSON文件】时编码设置的更多相关文章

  1. Python -- Scrapy 命令行工具(command line tools)

    结合scrapy 官方文档,进行学习,并整理了部分自己学习实践的内容 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们称之为 “Scrapy tool” 以用来和子命令进行区分. 对 ...

  2. 命令行工具解析Crash文件,dSYM文件进行符号化

    备份   文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...

  3. Scrapy命令行工具简介

    Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 在最初使用Scrapy时,使用编辑器或IDE手动编写模块来创建爬虫(Spide ...

  4. 二、Scrapy命令行工具

    本文转载自以下链接:https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/commands.html Scrapy是通过 scrapy 命令行工具 ...

  5. MYSQL 命令行导入导出数据库文件

    MYSQL命令行导入数据库 1.首先通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令为: cd E:\MySQL\MySQL Server 5.5\bin,输入如下命令: mysql ...

  6. 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options

    命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...

  7. 菜鸟入门【ASP.NET Core】5:命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options

      命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来 ...

  8. MySql:mysql命令行导入导出sql文件

    命令行导入 方法一:未连接数据库时方法 #导入命令示例 mysql -h ip -u userName -p dbName < sqlFilePath (结尾没有分号) -h : 数据库所在的主 ...

  9. MySQL命令行导入导出sql文件

    linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构(常用):mysqldump -u用户名 -p密码 数据库名 > 数据库名. ...

随机推荐

  1. 【BZOJ4035】数组游戏(博弈论)

    [BZOJ4035]数组游戏(博弈论) 题面 BZOJ 洛谷 题解 很明显是一个翻硬币游戏的变形,因此当前局面的\(SG\)函数值就是所有白格子单独存在的\(SG\)函数的异或和. 那么,对于每一个位 ...

  2. MyBatis.4关联

    关联.多对一关联查询 package org.mybatis.example.dao; import java.util.Date; //雇员类 public class Emp { private ...

  3. Could not update Activiti database schema: unknown version from database: '5.20.0.1'

    转: Could not update Activiti database schema: unknown version from database: '5.20.0.1' 2017年11月22日 ...

  4. supervisor 添加新配置不生效的问题

    supervisorctl reread supervisorctl reload (不运行这一步会导致启动不了) supervisorctl start xxx:* 提示:No config upd ...

  5. bzoj 1193 贪心+bfs

    1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2015  Solved: 914[Submit][Statu ...

  6. django中的认证与登录

    认证登录 django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1  authenticate(**credentials)    提供了用户认证,即验证用户名以及密码是否 ...

  7. python【数据类型:字典】

    字典的定义 infos = {'name':'张晓红','sex':'女','address':'上海','age':18} stus = {"name":"张三&quo ...

  8. 用Anaconda安装本地python包

    Anaconda确实带来了很多方便,但是之前也过多的依赖了conda自带的一键下载python包的功能.这不,这几天突然要用FastFM这个包,无奈conda里没有,于是只能从github下载下来,实 ...

  9. ElasticStack系列之七 & IK自动热更新原理与实现

    一.热更新原理 elasticsearch开启加载外部词典功功能后,会每60s间隔进行刷新字典.具体原理代码如下所示: public void loadDic(HttpServletRequest r ...

  10. EChart介绍和使用

    一.简单介绍 Echart是百度研发团队开发的一款报表视图JS插件,功能十分强大,使用内容做简单记录:(EChart下载地址 http://echarts.baidu.com/download.htm ...