python爬虫文字全是乱码_Python爬虫乱码的解决方案!
互聯網時代里,學習爬蟲程序的人越來越多,學習中難免會遇到一些問題,比如爬蟲時出現了亂碼,不知道如何解決,下面給大家分享一下爬蟲亂碼的解決方法。
網絡爬蟲有兩種選擇,一種是nutch、 hetriex,另一種是自編的爬蟲。當處理亂碼時,原理是一樣的,但是當處理亂碼時,前者只能在理解源代碼后修改它,所以有必要浪費一些精力;后者更加自由和方便,并且可以在編碼過程中進行處理。這也是為什么許多人在編寫帶有框架的爬蟲程序時無法啟動的原因。例如,相對成熟的nutch在處理亂碼字符方面比較簡單,所以亂碼字符還是會出現,所以需要二次開發才能真正解決亂碼問題。
1、網絡爬蟲出現亂碼的原因
源網頁的編碼與抓取后的編碼轉換不一致。如果源網頁是由gbk編碼的字節流,程序在抓取后直接用utf-8編碼并輸出到存儲文件中,這就不可避免地會造成代碼的亂碼,即當源網頁編碼與程序抓取后直接處理編碼一致時,就不會有亂碼,統一字符編碼后也就不會有亂碼。注意區分源網絡代碼A、程序直接使用的代碼B、和統一轉換字符的代碼c。
A、就是web page的服務器端編碼
B、捕獲的數據最初是字節數組,由A編碼。只有當B=A時,才能保證沒有亂碼字符,否則,當字符集不兼容時,亂碼字符總是會出現。這一步通常用于測試。
C、統一轉碼是指得到網頁的原始編碼A后,再進行的統一編碼,主要是為了將各個網頁的數據統一成一類編碼,往往選擇字符集較大的utf-8為宜。
每個網頁都有自己的編碼,像gbk、utf-8、iso8859-1,以及日文的jp系統編碼、西歐、俄文等編碼各不相同,當進行漫爬時總是會擴展出各種編碼,有的爬蟲是對web網頁進行簡單的編碼識別再進行統一編碼,有的是不做源網頁的判斷直接統一按utf-8來處理,這顯然是會造成亂碼情況。
2、亂碼的解決方法
(1) 程序通過編碼B對源網頁數據還原
顯然,這里的B是要和A相等的,在java中,如得到的源網頁的字節數組為source_byte_array,那么經過轉換為String str=new String(source_byte_array,B);即在內存上這些字節數組對應的字符是正確編碼和可顯示的,此時的打印輸出結果是正常的,此步驟往往用于debug或是控制臺輸出做測試。
(2)確定源網頁的編碼A
編碼A往往在網頁中的三個位置,http header的content、網頁的meta charset中、網頁頭中Document定義中。在獲取源網頁編碼時,依次判斷下這三部分數據即可,從前往后,優先級亦是如此。
理論上這樣做是對的,但國內一些網站確是很不符合規范,比如寫的gbk,實際是utf-8,有的是寫的utf-8,但實際是gbk,當然這是很少的一批網站,但確實存在。所以在確定網頁編碼時,應該對該特殊情況做特別處理,如中文檢查、默認編碼等策略。
還有一種情況,是以上三者中均沒有編碼信息,則一般采用cpdetector等第三方網頁編碼智能識別工具來做,其原理即為統計字節數組的特征來概率計算得出實際編碼,有一定的準確率,但我實際的時候發現,其準確率還是很有限的。
但綜合上述的三種編碼確認方式后,幾乎可以完全解決中文亂碼問題,在我基于nutch1.6二次開發的網絡爬蟲系統中,編碼正確經統計可以達到99.99%,也證明了上述方法策略的可行性。
(3) 統一轉碼
網絡爬蟲系統數據來源很多,不可能使用數據時,再轉化為其原始的數據,假使這樣做是很費事的。所以一般的爬蟲系統都要對抓取下來的結果進行統一編碼,從而在使用時做到一致對外,方便使用。此時即是在(2)的基礎上,做一個統一的編碼轉換即可,在java中的實現如下
源網頁的字節數組為source_byte_array
轉換為正常的字符串:String normal_source_str=new String(source_byte_array,C),此時可以用java api直接存儲,但往往不直接寫入字符串,因為一般的爬蟲存儲都是多個源網頁存儲到一個文件中,所以要記錄字節偏移量,故下一步。
再將得到的str轉換為統一的編碼C格式的字節數組,則byte[] new_byte_array=normal_source_str.getBytes(C)即可,此時即可用java io api將數組寫入文件,并記錄相應的字節數組偏移量等,待真正使用時,直接io讀取即可。
爬蟲抓取信息不僅會存在亂碼的問題,還會存在網站爬取涉及法律、IP被封、IP受限制等等的問題,如何避免IP被封?我們需要借助代理ip防止ip被限制,就拿萬變ip代理來說,覆蓋全國各地城市ip,安全可靠、速度快、全高匿ip。
總結
以上是生活随笔為你收集整理的python爬虫文字全是乱码_Python爬虫乱码的解决方案!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring指导的index.html在
- 下一篇: python根据文件路径获取上级目录路径