长期专注于写爬虫,受够了urllib、urllib2甚至是urllib3。最后选择了更人性化的requests。可是requsests对中文的支持并不太好,时常会出现乱码问题。研究源码之后现给出解决方案。
乱码的由来:requests的字符检测借用了一个名为chardet的第三方库,如果运行环境缺少这个库的话系统会从别的地方想办法猜测字符集,比如header中的是声明。其实这个第三库和补救的办法往往都不靠谱,而在转换unicode的过程又是通过str方法强制执行的。于是可恶的乱码就这么出现了。
解决方案1:直接使用requests中response对象的content属性,content是未被转换成unicode的返回值。这样一来怎么解码就是调用方可以自己灵活处理的问题了
解决方案2:对requests库进行hack自己写一套合适的字符集检测方法。我自己就是在ultis.py中添加了一个自己的get_encoding方法,然后在models.py中调用了它。
get_encoding 方法实现如下,这个实现未必很完美但至少解决了问题
def get_encoding(s): if isinstance(s,unicode): return "unicode" try: r = unicode(s) return "ASCII" except: try: r = s.decode("utf8") return "utf8" except: try: r = s.decode("gbk") return "gbk" except: try: r = s.decode("latin-1") return "latin-1" except: pass