Python 笔记六:入门爬虫坑--网页数据压缩
源码github地址在此,记得点星:
https://github.com/brandonxiang/get_html_deflate_gzip
做项目就伴随着一个问题--数据来源。在网络数据获取的过程,考虑到数据的动态下载需要爬虫。这也是必经之路吧。
我在运用urllib2做相当简单的爬虫入门实验的时候,出现编码以及压缩等问题。这一个坑很多人踩过,甚至有人处理编码问题会出现一种情况,就是5分钟开发完成,25分钟处理编码问题。更不用说数据压缩,数据会面目全非。网页压缩主要两种,区别可参考gzip和deflate的几点区别。
在这里用python举个栗子,小项目,用urllib2爬网页十分简单。
data = urllib2.urlopen(url).read()
网上有各种各样的解决数据压缩的方法。但是都没有很完美的解决方案。有些讲的是deflate,有的讲的是gzip。事实上,网页压缩技术采用deflate的网站已经很少,由于国内落后的网站还有一个很大保有量,特别是一些政府企事业的网站。我希望能提供一种两全齐美的解决方案。
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()
将两者结合写成一个整合方法
通过对Content-Encoding
属性的判断,将两个方法结合在一起。
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()
转载,请表明出处。总目录Awesome GIS
转载,请表明出处。总目录后端记事本