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