Python 筆記六:入門(mén)爬蟲(chóng)坑--網(wǎng)頁(yè)數(shù)據(jù)壓縮
源碼github地址在此栅组,記得點(diǎn)星:
https://github.com/brandonxiang/get_html_deflate_gzip
做項(xiàng)目就伴隨著一個(gè)問(wèn)題--數(shù)據(jù)來(lái)源日川。在網(wǎng)絡(luò)數(shù)據(jù)獲取的過(guò)程红柱,考慮到數(shù)據(jù)的動(dòng)態(tài)下載需要爬蟲(chóng)。這也是必經(jīng)之路吧。
我在運(yùn)用urllib2做相當(dāng)簡(jiǎn)單的爬蟲(chóng)入門(mén)實(shí)驗(yàn)的時(shí)候,出現(xiàn)編碼以及壓縮等問(wèn)題。這一個(gè)坑很多人踩過(guò)踊兜,甚至有人處理編碼問(wèn)題會(huì)出現(xiàn)一種情況,就是5分鐘開(kāi)發(fā)完成棵里,25分鐘處理編碼問(wèn)題润文。更不用說(shuō)數(shù)據(jù)壓縮姐呐,數(shù)據(jù)會(huì)面目全非。網(wǎng)頁(yè)壓縮主要兩種典蝌,區(qū)別可參考gzip和deflate的幾點(diǎn)區(qū)別曙砂。
在這里用python舉個(gè)栗子,小項(xiàng)目骏掀,用urllib2爬網(wǎng)頁(yè)十分簡(jiǎn)單鸠澈。
data = urllib2.urlopen(url).read()
網(wǎng)上有各種各樣的解決數(shù)據(jù)壓縮的方法。但是都沒(méi)有很完美的解決方案截驮。有些講的是deflate笑陈,有的講的是gzip。事實(shí)上葵袭,網(wǎng)頁(yè)壓縮技術(shù)采用deflate的網(wǎng)站已經(jīng)很少涵妥,由于國(guó)內(nèi)落后的網(wǎng)站還有一個(gè)很大保有量,特別是一些政府企事業(yè)的網(wǎng)站坡锡。我希望能提供一種兩全齊美的解決方案蓬网。
deflate
import zlib
def deflate(data):
try:
return zlib.decompress(data, -zlib.MAX_WBITS)
except zlib.error:
return zlib.decompress(data)
兩種壓縮格式的解壓方法有很大的差異。
gzip
from gzip import GzipFile
from StringIO import StringIO
def gzip(data):
buf = StringIO(data)
f = gzip.GzipFile(fileobj=buf)
return f.read()
將兩者結(jié)合寫(xiě)成一個(gè)整合方法
通過(guò)對(duì)Content-Encoding
屬性的判斷鹉勒,將兩個(gè)方法結(jié)合在一起帆锋。
import urllib2
from gzip import GzipFile
from StringIO import StringIO
import zlib
def loadData(url):
request = urllib2.Request(url)
request.add_header('Accept-encoding', 'gzip,deflate')
response = urllib2.urlopen(request)
content = response.read()
encoding = response.info().get('Content-Encoding')
if encoding == 'gzip':
content = gzip(content)
elif encoding == 'deflate':
content = deflate(content)
return content
def gzip(data):
buf = StringIO(data)
f = gzip.GzipFile(fileobj=buf)
return f.read()
def deflate(data):
try:
return zlib.decompress(data, -zlib.MAX_WBITS)
except zlib.error:
return zlib.decompress(data)
def main():
url = "http://www.szxuexiao.com/"
content = loadData(url)
print content
if __name__ == '__main__':
main()
轉(zhuǎn)載,請(qǐng)表明出處禽额。總目錄Awesome GIS
轉(zhuǎn)載锯厢,請(qǐng)表明出處。總目錄后端記事本