python爬蟲程序中:'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte問題的原因及解決辦法


import urllib.request
import urllib.parse

url="http://www.shuquge.com/txt/152/index.html"
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko',
}
with open('perfect_world.html','w',encoding='utf-8') as fp:
    fp.write(res.read().decode())

在執行上面的代碼過程中,遇到問題:'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte.

分析原因:

分析過程如下:

①:在上面代碼中,headers請求頭中,並不包括:Accept-encoding請求頭,請求的響應內容理應是未經壓縮的原生數據。通過fiddler抓包查看request頭部信息。

抓包信息如下
GET http://www.shuquge.com/txt/152/index.html HTTP/1.1
Accept-Encoding: identity
Host: www.shuquge.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko
Connection: close

從上面的請求頭中我們看出Accept-Encoding:identify。在http協議中,Accept-Encoding:identify表示請求的響應數據是未壓縮的。【如果請求頭中沒有"Accept-encoding"的頭部信息,那么默認值為:Accept-Encoding:identify】排除request請求有誤的原因。

②:分析response的響應內容。在fiddler抓包工具中,獲取到了該request的響應。

由此找到了原因:響應數據是經過壓縮之后的,由此造成了編碼錯誤。壓縮格式是Gzip格式,我們可以通過相應的算法進行解壓。

 

然后問題又來了,為什么客戶端請求的數據明明是未壓縮的內容,而響應的數據是壓縮過后的呢???

  有些服務器在實現http協議時可能存在bug,不支持identify或者請求頭中並沒有發送Accept-Encoding,那么服務器傾向於使用http1.0中的"gzip"and"compress",

服務器可能會按照客戶端類型發送更合適的encoding類型。

  在我們的爬蟲程序中,請求中並沒有Accept-Encoding,但是在請求頭中我們表明了自身是:Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko類型的客戶端瀏覽器,所以服務器給我們發送的是gzip格式的數據,在上面的python程序中,並沒有涉及到相關的解壓操作,導致數據編碼操作出錯。

 

修復bug,完善程序

import urllib.request
import urllib.parse
import gzip

def ungzip(data):
    try:
        data=gzip.decompress(data)
    except:
        pass
    return data

url="http://www.shuquge.com/txt/152/index.html"
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko',
}

req=urllib.request.Request(url,headers=headers)
res=urllib.request.urlopen(req)

with open('perfect_world.html','w',encoding='utf-8') as fp:
    fp.write(ungzip( res.read()).decode())

代碼成功運行,爬取結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM