问题情景
最近我部署一个爬虫服务,要往数据库里写入所爬取的数据。数据能够爬取,但是存入时报异常:UnicodeEncodeError: ‘latin-1’ codec can’t encode character,异常使得服务停止了。出现这个问题,肯定是编码的问题,那就沿着这个思路去解决呗。
解决过程
首先我看了下 sqlalchemy 连接数据库引擎的配置,它这个默认就是 “utf-8” 的编码方式呀。但是为啥提示编码还是 ‘latin-1’ 呢?然后我在 MYSQL_URI 的配置后面加上了 “utf-8”
MYSQL_URI = 'mysql://username:password@host:port/database_name?charset=utf8'
再次启动爬虫服务,还是报上面相同的错误。然后呢, 我就通过 mysql 控制台 去看了一下我所连接的mysql的数据库,发现 所连接的 数据库的编码格式 是 : “latin-1”
mysql> show variables like 'character_set_database';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.01 sec)
这个数据库之前就有的,我肯定不能动它这个编码呀,所以我就手动指定我所使用到的 table 的编码
mysql>alter table <表名> character set utf8;
然后再次启动爬虫服务,还是报错了,不过报错信息跟上面不一样,类似于这样的:OperationalError: (1366, “Incorrect string value”),然后我又各种百度谷歌呀,博客上面有人说,可能是因为 table 中的字段的编码的原因。然后,我又查看了一下表的结构及相关的信息
show full columns from <表名>;
果然,字段的编码还是 “latin-1”, 然后我又修改字段的编码
alter table <table_name> change username username varchar(20) character set utf8 not null;
再此,启动爬虫,发现可以往mysql中插入数据了。
参考一:https://www.cnblogs.com/88phper/p/7452043.html
参考二:https://www.jianshu.com/p/0508eb37d03f