Python爬取網(wǎng)頁(yè)Utf-8解碼錯(cuò)誤及gzip壓縮問(wèn)題的解決辦法

在我們用python3爬取一些網(wǎng)站時(shí),獲取網(wǎng)頁(yè)url后進(jìn)行解析,在采用decode('utf-8')解碼時(shí)有時(shí)候會(huì)出現(xiàn)utf-8無(wú)法解碼的問(wèn)題,比如結(jié)果會(huì)提示:
Unicode Decode Error: 'utf8' codec can't decode byte 0xb2 in position 0: invalid start byte

這是因?yàn)橛行┚W(wǎng)站進(jìn)行了gzip壓縮,最典型的就是sina,進(jìn)行網(wǎng)頁(yè)爬蟲經(jīng)常出現(xiàn)這個(gè)問(wèn)題,那么為什么要壓縮呢?搜狗百科解釋為:
HTTP協(xié)議上的GZIP編碼是一種用來(lái)改進(jìn)WEB應(yīng)用程序性能的技術(shù)。大流量的WEB站點(diǎn)常常使用GZIP壓縮技術(shù)來(lái)讓用戶感受更快的速度。這一般是指WWW服務(wù)器中安裝的一個(gè)功能,當(dāng)有人來(lái)訪問(wèn)這個(gè)服務(wù)器中的網(wǎng)站時(shí),服務(wù)器中的這個(gè)功能就將網(wǎng)頁(yè)內(nèi)容壓縮后傳輸?shù)絹?lái)訪的電腦瀏覽器中顯示出來(lái).一般對(duì)純文本內(nèi)容可壓縮到原大小的40%.這樣傳輸就快了,效果就是你點(diǎn)擊網(wǎng)址后會(huì)很快的顯示出來(lái).當(dāng)然這也會(huì)增加服務(wù)器的負(fù)載*. *一般服務(wù)器中都安裝有這個(gè)功能模塊的。
我們?cè)诖蜷_(kāi)某個(gè)新浪網(wǎng)頁(yè),點(diǎn)擊右鍵選擇“檢查”,然后Network》All》Headers下的“Request Headers”中就會(huì)發(fā)現(xiàn)這個(gè)字樣:
Accept-Encoding:gzip, deflate, sdch

這個(gè)問(wèn)題有的建議:“看一下設(shè)置的header是否存在 'Accept-Encoding':' gzip, deflate',這一句話,如果存在,刪除即可解決?!?,但是有時(shí)候header不存在這個(gè)代碼,怎么刪除?如下,我們以打開(kāi)某個(gè)新浪新聞網(wǎng)頁(yè)為例:

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之后仍會(huì)出現(xiàn)問(wèn)題,當(dāng)把*decode('utf-8')*去掉后得到的頁(yè)面是亂碼的。因此,解決的辦法不是如此。
在這里有兩種解決辦法:(1)采用gzip庫(kù)解壓網(wǎng)頁(yè)再解碼;(2)使用requests庫(kù)解析網(wǎng)頁(yè)而不是urllib。
(1)的解決辦法為:在“txt = page.read()”頁(yè)面讀取之后,再加入下面這個(gè)命令:
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'```

這是對(duì)網(wǎng)頁(yè)用設(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é)果:
***錯(cuò)誤的方式***
![](https://pic3.zhimg.com/v2-320f90bd0148565e87793b761fe16f5a_b.jpg)***Gzip******解壓方式***
![](https://pic4.zhimg.com/v2-9ada2e1b953f0e7e62ecaaad5e3f5fb3_b.jpg)***Requests******的讀取網(wǎng)頁(yè)方式***
![](https://pic2.zhimg.com/v2-1526a346350861679be12011acaafbdd_b.jpg)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)提取、數(shù)據(jù)分析、數(shù)據(jù)挖掘、...
    whenif閱讀 18,304評(píng)論 45 523
  • 聲明:本文講解的實(shí)戰(zhàn)內(nèi)容,均僅用于學(xué)習(xí)交流,請(qǐng)勿用于任何商業(yè)用途! 一、前言 強(qiáng)烈建議:請(qǐng)?jiān)陔娔X的陪同下,閱讀本文...
    Bruce_Szh閱讀 13,003評(píng)論 6 28
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號(hào) 簡(jiǎn)介有稍微接觸python的人就會(huì)知道,python中...
    ayuLiao閱讀 3,389評(píng)論 1 5
  • 目錄: Python網(wǎng)絡(luò)爬蟲(一)- 入門基礎(chǔ)Python網(wǎng)絡(luò)爬蟲(二)- urllib爬蟲案例Python網(wǎng)絡(luò)爬...
    一只寫程序的猿閱讀 37,637評(píng)論 3 49
  • 縱然《三體》這幾年火的一塌糊涂,國(guó)內(nèi)掀起了一陣閱讀科幻小說(shuō)的浪潮。然至今,我也沒(méi)有讀過(guò)《三體》,僅僅是對(duì)它大概故事...
    novice歡閱讀 358評(píng)論 0 0

友情鏈接更多精彩內(nèi)容