剛才翻了翻2年以前用python2.7寫的一個爬蟲程序,主要功能就是把各地市知識產權局/專利局網站的專利相關項目、課題通知,定期爬取和分析,輔助企業進行項目申請。
這里要談的不是爬蟲功能的實現,而是今天重跑程序的時候發現,日志文件正常展現中文,但是終端展現的確實亂碼。影響體驗,着實比較郁悶。
相關代碼如下:
1、python文件是utf-8編碼
2、使用logging模塊記錄日志,同步輸出到app.log文件,和終端標准輸出。
3、使用了sys.setdefaultencoding的方式來解決亂碼問題。
# coding=UTF-8
import sys import logging reload(sys) sys.setdefaultencoding('utf8') # @UndefinedVariable cur_path = os.path.dirname(os.path.abspath(sys.argv[0])) logging.basicConfig(level=logging.INFO, #format='[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s', format='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S, %a', filename=cur_path+'/../log/app.log', filemode='w') ################################################################################################# # 定義一個StreamHandler,將INFO級別或更高的日志信息打印到標准錯誤,並將其添加到當前的日志處理對象# console = logging.StreamHandler() console.setLevel(logging.DEBUG) formatter = logging.Formatter('[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s') console.setFormatter(formatter) logging.getLogger('').addHandler(console) #################################################################################################
標准輸入是亂碼:
[2018-02-19 22:07:37,211] [app_main.py:100] INFO ++++++++++ 寮€濮嬪惎鍔ㄦ姄鍙栫▼搴?.. ++++++++++
[2018-02-19 22:07:37,217] [app_conf.pyo:70] WARNING 娌℃湁鎸囧畾瑕佺瓫閫夋柊闂葷殑璧峰鏃墮棿錛岄粯璁ら€夋嫨褰撴棩銆?
[2018-02-19 22:07:37,224] [app_conf.pyo:73] WARNING 娌℃湁鎸囧畾瑕佺瓫閫夋柊闂葷殑緇撴潫鏃墮棿錛岄粯璁ら€夋嫨褰撴棩銆?
[2018-02-19 22:07:37,227] [base_module.pyo:64] INFO ---------- 寮€濮嬫姄鍙栫綉欏靛唴瀹癸紝騫剁瓫閫夋柊闂葷粨鏋溿€?---------
但是日志文件顯示正常:
[2018-02-19 22:07:37, Mon] ++++++++++ 開始啟動抓取程序... ++++++++++
[2018-02-19 22:07:37, Mon] 沒有指定要篩選新聞的起始時間,默認選擇當日。
[2018-02-19 22:07:37, Mon] 沒有指定要篩選新聞的結束時間,默認選擇當日。
[2018-02-19 22:07:37, Mon] ---------- 開始抓取網頁內容,並篩選新聞結果。----------
查了半天,終於發現棋差一招,使用logging記日志的時候,需要帶中文的字符串前面再加上 u
比如:
這樣就完美解決標准輸出亂碼問題啦。