想写一个抓取免费代理并验证是否可用得爬虫,写的过程中发现一个问题,某些网站用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()