源碼github地址在此,記得點星:
https://github.com/brandonxiang/get_html_deflate_gzip
做項目就伴隨著一個問題--數(shù)據(jù)來源。在網(wǎng)絡(luò)數(shù)據(jù)獲取的過程,考慮到數(shù)據(jù)的動態(tài)下載需要爬蟲。這也是必經(jīng)之路吧。
我在運用urllib2做相當(dāng)簡單的爬蟲入門實驗的時候,出現(xiàn)編碼以及壓縮等問題。這一個坑很多人踩過,甚至有人處理編碼問題會出現(xiàn)一種情況,就是5分鐘開發(fā)完成,25分鐘處理編碼問題。更不用說數(shù)據(jù)壓縮,數(shù)據(jù)會面目全非。網(wǎng)頁壓縮主要兩種,區(qū)別可參考gzip和deflate的幾點區(qū)別。
在這里用python舉個栗子,小項目,用urllib2爬網(wǎng)頁十分簡單。
data = urllib2.urlopen(url).read()
網(wǎng)上有各種各樣的解決數(shù)據(jù)壓縮的方法。但是都沒有很完美的解決方案。有些講的是deflate,有的講的是gzip。事實上,網(wǎng)頁壓縮技術(shù)采用deflate的網(wǎng)站已經(jīng)很少,由于國內(nèi)落后的網(wǎng)站還有一個很大保有量,特別是一些政府企事業(yè)的網(wǎng)站。我希望能提供一種兩全齊美的解決方案。
import zlibdef deflate(data): try: return zlib.decompress(data, -zlib.MAX_WBITS) except zlib.error: return zlib.decompress(data)
兩種壓縮格式的解壓方法有很大的差異。
from gzip import GzipFilefrom StringIO import StringIOdef gzip(data): buf = StringIO(data) f = gzip.GzipFile(fileobj=buf) return f.read()
通過對Content-Encoding
屬性的判斷,將兩個方法結(jié)合在一起。
import urllib2from gzip import GzipFilefrom StringIO import StringIOimport zlibdef 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 contentdef 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 contentif __name__ == '__main__': main()
轉(zhuǎn)載,請表明出處。總目錄Awesome GIS
轉(zhuǎn)載,請表明出處。總目錄后端記事本