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

最近開發(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è)試了程序:
- 修改CentOS服務(wù)器的默認(rèn)語言改為zh_CN.UTF-8
- 將windows上的字體拷貝到CentOS服務(wù)器系統(tǒng)中
- 切換PhantomJS驅(qū)動(dòng),測(cè)試無視圖瀏覽器的爬取效果
- 將start_urls修改為start_requests,并指定url編碼
- 使用虛擬機(jī)測(cè)試Ubuntu Server的運(yùn)行效果
經(jīng)過上述步驟的多次測(cè)試,發(fā)現(xiàn)以上方法都不能解決問題。最后在打印了多處print()方法判斷出錯(cuò)位置的時(shí)候,仔細(xì)看了下日志的反饋結(jié)果,如下標(biāo)注:

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

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