日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫文字全是乱码_Python爬虫乱码的解决方案!

發布時間:2023/12/10 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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爬虫乱码的解决方案!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。