Python下载文件时出现乱码的解决方法之一:Content-Encoding: gzip

之前写过一个简单的爬虫程序,这次想试着再写一个下载固定文件的爬虫程序。

写完之后发现下载的文件,有些是可以正常打开的,而有些是提示了编码错误,用wireshark抓包,过滤出http的包,发现wireshark上显示的数据是没错的。然后又详细看了http数据包的内容。发现有一个"Content-Encoding: gzip"的项,根据之前写爬虫程序时看的教程,大概知道应该是数据被压缩的,所以之前保存的内容是压缩后的数据,导致读取失败。

上网搜索了一下,可以使用gzip库来对数据进行解压缩,代码如下:

			req = urllib2.Request(url)
			try:
				response = urllib2.urlopen(req)
				data = response.read()
			except:
				return

			headers = response.info()
			if 'Content-Encoding' in headers and 'gzip' == headers['Content-Encoding']:
				import gzip, StringIO
				data = StringIO.StringIO(data)
				gz = gzip.GzipFile(fileobj = data)
				data = gz.read()
				gz.close()

按照上面解压缩后,在保存为对应格式的文件,就可以正常打开了。不过上面只判断了一种类型。

代码中的StringIO用于在内存缓冲区中读写数据。

在搜索解决方法的时候,发现一篇文章,说到gzip是用来压缩与解压缩文件,而zlib是压缩与解压缩数据的。不过没有深入去看,先留着,说不定以后可以用到。文章链接为:http://www.crifan.com/compress_html_in_urllib2_open_then_decompress_returned_gzip_data_in_python/

你可能感兴趣的:(python)