想写一个抓取免费代理并验证是否可用得爬虫,写的过程中发现一个问题,某些网站用urll2请求返回乱码,并且把返回数据给beautifulsoup解析不出数据,如果是编码问题导致的乱码肯定不会影响beautifulsoup的解析,所以肯定是其他原因,经过各种百度,谷歌,找到的问题的原因。
一些网站不管你的请求头带不带
Accept-Encoding:gzip
他都会返回经过gzip压缩后的内容,即返回头部带有
Content-Encoding:gzip
这就是beautifulsoup无法解析的原因。既然知道的原因,那就好办了,将gzip解压即可。
import urllib2 import gzip import StringIO def ungzip(buf): content = buf.read() content = StringIO.StringIO(content) #将content作为“内存文件”操作 buf = gzip.GzipFile(fileobj=content) return buf buf = urllib2.urlopen('http://www.kuaidaili.com/free/inha/') if buf.headers.get('Content-Encoding') == 'gzip': buf = ungzip(buf) print buf.read()