Scrapy在CentOS上報(bào) 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

錯(cuò)誤結(jié)果如下:


定位原因.png

最近開發(fā)爬蟲系統(tǒng),在windows操作系統(tǒng)的開發(fā)環(huán)境中自己所寫代碼運(yùn)行正常,但是將爬蟲通過scrapyd-client發(fā)布到scrapyd服務(wù)器上的時(shí)候基于Chromedriver開發(fā)的無視圖爬蟲卻意外報(bào)錯(cuò)。

在網(wǎng)上搜索了下UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)這樣的問題,可是解決方案大都是“設(shè)置系統(tǒng)的默認(rèn)編碼為utf-8”,在python3.6+的環(huán)境中程序表頭默認(rèn)添加了# -- coding: utf-8 --,這與我的實(shí)際情況并不相符,實(shí)際上我即使配置了默認(rèn)編碼也不能解決以上問題。
無可奈何,只能開始自我探索的過程,大概通過以下幾步測(cè)試了程序:

  1. 修改CentOS服務(wù)器的默認(rèn)語言改為zh_CN.UTF-8
  2. 將windows上的字體拷貝到CentOS服務(wù)器系統(tǒng)中
  3. 切換PhantomJS驅(qū)動(dòng),測(cè)試無視圖瀏覽器的爬取效果
  4. 將start_urls修改為start_requests,并指定url編碼
  5. 使用虛擬機(jī)測(cè)試Ubuntu Server的運(yùn)行效果

經(jīng)過上述步驟的多次測(cè)試,發(fā)現(xiàn)以上方法都不能解決問題。最后在打印了多處print()方法判斷出錯(cuò)位置的時(shí)候,仔細(xì)看了下日志的反饋結(jié)果,如下標(biāo)注:


出錯(cuò)位置.png

發(fā)現(xiàn)是middlewares報(bào)錯(cuò),看了看中間件的代碼,發(fā)現(xiàn)報(bào)錯(cuò)的地方是有print()方法,如下圖所示:


報(bào)錯(cuò)原因.png

刪除程序中所有print()方法scrapyd即可正常運(yùn)行,理論上將print方法中的漢字換為英文也能解決問題。因?yàn)樵诜?wù)器上print方法顯得多余,所以沒有測(cè)試這個(gè)方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容