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中,當然,這是錯誤的。