大家都知道,在默认模式下,http协议中发送的网页的Html代码是经过gzip编码后传送的。那么我们怎么才能回复这段编码后的html呢?
大家可能都知道linux下有一个gzip命令。可以把文件压缩成gzip编码的格式,即*.gz
而对于文件的压缩和解压缩,可以采用zlib库中提供的各种接口来进行 *** 作。但是这里问题来了。关于gzip编码的那些函数都带有gz开头的标示。而这些接口维护了一个名叫gz_stream的结构体。并且是针对文件FILE* *** 作的。
而我们要解决的问题是,我们把截取的封包中的gzip编码的内容拿出来,放到一个buffer中。那么怎么才能针对这个buffer中的数据应用这些接口呢?
我本来的想法是能不能在这些接口中找到专门对内存中的数据进行解码?
考虑这个问题,我看了这个库的源代码。后来放弃了。至于放弃的原因,可能是我意志力不够,或者不想看那些源代码了。总之,我看了一天,看的我头疼。
后来我就想个办法绕开这一思路,走个弯路。问题豁然开朗。
思路如下:
1. 把获取到的经过编码的数据保存到一个文件中。注意写文件的时候一定要以二进制方式。否则是不能解码的。
2. 应用zlib中的接口,gzopen(),gzread(),gzclose()即可完成解码的任务了。
一直都觉得微信公众号是爬虫的理想对象,获取到的对象url在手机上展示非常的赞,广告排版都在能接受的范围内,正好最近2练手python爬虫,果断的上了。首先分析一下搜狗微信公众号的手机端:
这里的请求非常简单 分析之后可以发现基本就是:
url='http://weixin.sogou.com/wapindex/wap/0612/wap_9/%d.html'%i
变换的也就是后面的数字
然后正常使用requests去请求:
response=requests.get(url,headers=mergedHeaders)
然后就乱码了,这里我尝试了很多解码方式,但是都解决不了,当然最后折腾了好久之后发现是html的gzip压缩问题,在网络上查询基本都是urllib2的解决办法
重新查询requests的官方文档发现了我需要的:
很明显,这里说了使用response.content方法
Requests会自动解码gzip,不过返回的是byte内容,所以我们只需要将byte to String 就可以了,好,尝试一下
转换方法:
def byteToString(byteData):
'''
将byte转化为String
:parambyteData:
:return: String
'''
returnBytesIO(byteData).read().decode()
然后请求内容:
response=requests.get(url,headers=mergedHeaders)
ifresponse.headers['Content-Encoding']=='gzip':
result=BytesIO(response.content).read().decode()
returnresult
else:
returnresponse.text
问题解决
下面”舒宇卓创站长“将和大家一起分享一下,希望对咱们站长有所帮助! 1.开启网页GZIP压缩有什么好处? Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。 进而对于搜索引擎的收录也有一定的好处,也大大提高了我们的用户体验度。 2.如何启用IIS的Gzip压缩功能: 首先要有网站管理权限和服务器远程管理权限步骤如下: 第一、如果你需要压缩静态文件(HTML),需要在硬盘上建一个目录,并给它“IUSR_机器名”这个用户的写权限。如果压缩动态文件(PHP,asp,aspx)就不需要了,因为它的页面是每次都动态生成的,压缩完就放弃。打开Internet信息服务(IIS)管理器,右击“网站”—>“属性”(注意:这里的网站是整个网站文件不是某个网站目录),之后选择“服务”。在“HTTP压缩”框中选中“压缩应用程序文件”和“压缩静态文件”,按需要设置“临时目录”和“临时目录的最大限制”。 第二、在Internet信息服务(IIS)管理器,右击“Web服务扩展”—>“增加一个新的Web服务扩展”,在“新建Web服务扩展”框中输入扩展名“HTTP Compression”,添加“要求的文件”为C:\WINDOWS\system32\inetsrv\gzip.dll,其中Windows系统目录根据您的安装可能有所不同,选中“设置扩展状态为允许”;这时候静态内容是可以压缩的,但是对于动态内容,aspx文件却不在压缩范围内。因为默认的可压缩文件并没有这个扩展名。而管理界面中你又找不到可以增加扩展名的地方,这时候只能去修改它的配置文件了。 第三、使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml(建议先备份),查找 IIsCompressionScheme标签,有三个相同名字的段,分别是deflate,gzip,Parameters,第三段不用管它,前两段有基本相同的参数,HcDynamicCompressionLevel,设置压缩率,取值0~10,0不压缩,10最高压缩率,这里设置成9,9是性价比最高的一个。HcFileExtensions,需要压缩的静态文件扩展名,默认只有htm,html,txt,可以把js,css,xml添加进去。建议按原来的格式,用换行作为分隔。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)