爬蟲學習_03亂碼處理

1. 編碼方式屬性

GB2312 UTF-8 Unicode
GB2312編碼專門用來解決中文編碼的,是雙字節的,並且不論中英文都是雙字節的;包含全部中文字符;總的來說GB2312編碼方式的編碼是以中國國情而創造的,在國際上的兼容性不好。 UTF-8 編碼是Unicode的一種實現方式,因爲對於大多數語言,只需要一個字節就能夠編碼,如果都採用Unicode會極大浪費,於是出現了可變長編碼UTF-8。它對英文使用8位(即一個字節),中文使用24位(三個字節)來編碼。另外,如果是外國人訪問你的GB2312網頁,需要下載中文語言包支持。訪問UTF-8編碼的網頁則不出現這問題。可以直接訪問。這也是爲什麼大多數的網頁是使用UTF-8編碼而不是GB2312。 目前幾乎收納了全世界大部分的字符。所有的字符都有唯一的編號,這就解決了解碼的衝突!但是,unicode把大家都歸納進來,卻沒有爲編碼的二進制傳輸和二進制解碼做出規定。
#Python 2.7 默認UTF8
'你好' ->'\xe4\xbd\xa0\xe5\xa5\xbd'
'你好'.decode('utf8') -> 轉換爲Unicode u'\u4f60\u597d'
#Python 3.6 默認Unicode
'你好'.encode('utf8') -> 轉換爲UTF8 編碼

2. 轉碼函數

decode encode
decode的作用是將其他編碼的字符串轉換成unicode編碼,如str1.decode(‘gb2312’),表示將gbk編碼的字符串str1轉換成unicode編碼。 encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode(‘gb2312’),表示將unicode編碼的字符串str2轉換成gbk編碼。

3. 亂碼原因

源網頁編碼和爬取下來後的編碼轉換不一致。如源網頁爲gbk編碼的字節流,而我們抓取下後程序直接使用utf-8進行編碼並輸出到存儲文件中,這必然會引起亂碼,即當源網頁編碼和抓取下來後程序直接使用處理編碼一致時,則不會出現亂碼,此時再進行統一的字符編碼也就不會出現亂碼了。

4. test.content 和 test.text的區別

對requests獲取的原始數據,有兩種獲取形式,一個是test.content一個是test.text。
二者的區別在於content返回的是byte型數據,而text返回的是Unicode數據,
也就是說text對原始數據進行的特殊的編碼,而這個編碼方式是基於對原始數據的猜測(響應頭)。
text返回的是unicode 型的數據,一般是在網頁的header中定義的編碼形式。
content返回的是bytes,二級制型的數據。
但是對於某些網站的中文用text可能會導致返回亂碼,所以最好是使用content然後自己進行重新編碼,而且如果你想要提取圖片、文件,也要用到content。

#.content打印的是原始編碼
import requests
url = 'http://www.pocketuni.net/'
response = requests.get(url)
response.encoding = 'utf-8'
print (response.content)

在這裏插入圖片描述

#使用.test打印數據
import requests
url = 'http://www.pocketuni.net/'
response = requests.get(url)
response.encoding = 'utf-8'
print(response.content.decode('utf-8'))
#實際上response.text和response.content.decode('utf-8')效果相同

在這裏插入圖片描述

5. 尋找到目標網頁的編碼格式

  1. 查看網頁源代碼
  2. 檢查元素,查看Response Headers
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章