在我們用python3爬取一些網(wǎng)站時,獲取網(wǎng)頁url后進(jìn)行解析庵芭,在采用decode('utf-8')解碼時有時候會出現(xiàn)utf-8無法解碼的問題妹懒,比如結(jié)果會提示:
Unicode Decode Error: 'utf8' codec can't decode byte 0xb2 in position 0: invalid start byte
這是因為有些網(wǎng)站進(jìn)行了gzip壓縮,最典型的就是sina双吆,進(jìn)行網(wǎng)頁爬蟲經(jīng)常出現(xiàn)這個問題眨唬,那么為什么要壓縮呢?搜狗百科解釋為:
HTTP協(xié)議上的GZIP編碼是一種用來改進(jìn)WEB應(yīng)用程序性能的技術(shù)好乐。大流量的WEB站點(diǎn)常常使用GZIP壓縮技術(shù)來讓用戶感受更快的速度匾竿。這一般是指WWW服務(wù)器中安裝的一個功能,當(dāng)有人來訪問這個服務(wù)器中的網(wǎng)站時蔚万,服務(wù)器中的這個功能就將網(wǎng)頁內(nèi)容壓縮后傳輸?shù)絹碓L的電腦瀏覽器中顯示出來.一般對純文本內(nèi)容可壓縮到原大小的40%.這樣傳輸就快了搂橙,效果就是你點(diǎn)擊網(wǎng)址后會很快的顯示出來.當(dāng)然這也會增加服務(wù)器的負(fù)載*. *一般服務(wù)器中都安裝有這個功能模塊的。
我們在打開某個新浪網(wǎng)頁,點(diǎn)擊右鍵選擇“檢查”区转,然后Network》All》Headers下的“Request Headers”中就會發(fā)現(xiàn)這個字樣:
Accept-Encoding:gzip, deflate, sdch
這個問題有的建議:“看一下設(shè)置的header是否存在 'Accept-Encoding':' gzip, deflate',這一句話苔巨,如果存在,刪除即可解決废离≈对螅”,但是有時候header不存在這個代碼蜻韭,怎么刪除悼尾?如下,我們以打開某個新浪新聞網(wǎng)頁為例:
import BeautifulSoup
url=’http://news.sina.com.cn/c/nd/2017-02-05/doc-ifyafcyw0237672.shtml’req = urllib.request.Request(url)req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
page = urllib.request.urlopen(req) # 模仿瀏覽器登錄
txt = page.read().decode('utf-8')
soup = BeautifulSoup(txt, 'lxml')
title =soup.select('#artibodyTitle')[0].text
print(title)```
在run之后仍會出現(xiàn)問題肖方,當(dāng)把*decode('utf-8')*去掉后得到的頁面是亂碼的闺魏。因此,解決的辦法不是如此俯画。
在這里有兩種解決辦法:(1)采用gzip庫解壓網(wǎng)頁再解碼析桥;(2)使用requests庫解析網(wǎng)頁而不是urllib。
(1)的解決辦法為:在“txt = page.read()”頁面讀取之后艰垂,再加入下面這個命令:
txt=gzip.decompress(txt).decode('utf-8')
(2)的解決辦法為:
```import requests
import gzip
url="http://news.sina.com.cn/c/nd/2017-02-05/doc-ifyafcyw0237672.shtml"
req = requests.get(url)req.encoding= 'utf-8'```
這是對網(wǎng)頁用設(shè)置為‘utf-8’的格式泡仗,但是這里模擬瀏覽器登錄需采用這種方式:
headers = { 'Host': 'blog.csdn.net', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', ….}
綜合以上,我們看一下結(jié)果:
***錯誤的方式***
![](https://pic3.zhimg.com/v2-320f90bd0148565e87793b761fe16f5a_b.jpg)***Gzip******解壓方式***
![](https://pic4.zhimg.com/v2-9ada2e1b953f0e7e62ecaaad5e3f5fb3_b.jpg)***Requests******的讀取網(wǎng)頁方式***
![](https://pic2.zhimg.com/v2-1526a346350861679be12011acaafbdd_b.jpg)