Http协议 压缩
阅读原文时间:2023年07月12日阅读:3

  先说结论:Request和Response可以设置gzip压缩从而节省流量/带宽,这是一个不常见的问题。具体可见连接:HTTP 协议之压缩

  最近测试代理服务器时,意外的发现使用urlopen请求百度首页时,会返回两种结果,一种是正常的百度首页html源码(以下简称正常结果),一种是'乱码'。样例如下:

\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x8dVKo\xe36\x10\xfe+*\x8d\xbd\x04\xd6\xcb\x89\x13G\xb2\rl\x1c\x17\xbb\xa7\x16\xc5\x16\xc8.\n\x18\x94H\xc9L$QKQ~\xaca\xa0=\xb7\xb7\x9ezj/\xed\xb9\xbd-\x8a\xb6\xbf&\x8bEO\xfd\x0b\x1dJ\x94-\xc7IQ\x08\x90\xc4\xe1\xc7y|3\x1cr\xf8\xc9\xf5g\x93W\xaf?\x9f\x1as\x99&\xe3\xa1~SL\xc6\xc3\x94J\x0cb\x99\x9b\xf4m\xc9\x16#\x14\xf2L\xd2L\x9ar\x9dSd\xe8\xd1\x08I\xba\x92\xb6Z\xe8\x87s,\n*G\xa5\x8c\xcc\x01zD\xc3\x8d\xf9\xe5ss\xc2\xd3\x1cK\x16$m%/\xa7\xa3)\x89),JXvg\x08\x9a\x8cP1\xe7B\x86\xa54\x18\xc0\x901\x174\x1a!;\xc2\x0b5\xb6\xe0\x85\x0c\xe5\xca\x08\xb1\x14\xc7\xd4^\x99\x15n<\x94L&t\xfc\xf1\x87\xbf>\xfc\xfe\xcb\xfd\xfb\xaf\xef\xdf\x7f\xfb\xcf\x1f\xdf\xdd\xff\xf9\xd3\x87_\x7f\xfb\xf8\xe3\xcf\x7f\x7f\xf3\xfd\xd0\xae!\xc3B\xae\xe1\xa3|\xef\x06\x9c\xac7s\xca\xe2\xb9\xf4\\\xc7y\xb6U\xd2\r_P\x11%|i\xae=\\J\xbe\xadP\x118\xed\xb9\xbd|e`\xc1p\xe2\x078\xbc\x8b\x05/3\xe2u\xa2(\xaa@\xdd\xbc\x1bq\x91v\xcb\xa4\x9b\xb0M\x8aE\xcc2\xcf\xf1sL\x08\xcbb\xf8KX!\xcd\xca\xbe\x97\xf1\x8c\xd6\x8b\xd4\x92M\xce\x0b&\x19\xcf< \x01xZ\xd0-K\xe3M\xc0\x05\xa1\xc2s\xb6x\x13\xf2\x84\x0b\xaf\xe38\xe1\x16{8T\x90F\x16\x9d;[\x96\xe5\xa5\xdc\xe1\xf7&\xb7\x9d\xa5\xc0yN\xc5\xb1\x05\x7f\xb6\x13\xf9)\xcb\xcc6\x0f\x1dU\r\x1b\xad\xc5\x0c\xb8\x94\xb0\xef\xfc\x0f-\x86\xa5\xde\xb3\xc6\x8d\x83\x98*\xa2uVzU&!\xbb\x86\xe3\xd7~\x9e\x9f\xb9\x87\xd1%4\x92\xfe.4\x07\xa8\xbc[>\x92\'\xab\x98\x052\xdb\xd4J.\xfb\xfbXO\xc1\xc4.\x04\xc9s\x0f\xc6_]\xfa\xaa\x90\xcc\x82\xbd\xa3\x9e{\x06\x80}\x1d\x99:\x9d\x84\x90\xb6tg\xd11\xcc\xb3\x01\xac\x08KQ\x00.\xe7L\xb1\x7fh\xbfNQ\xe3\xc0\xb9BWJ\x97s&i\xdb\xb4\xf23\xa1\x12\x14\x98E\x8eCU+\xee\x817^\xe7\xf4t\xd0\x8f"\xbf\xae\xa9]\r\x00m\x05O\x181:=r1\x88\xce|^J\xd8\xbd\xd4K)ae\xea\x9f\x1c\xe2\x1d\xdf\\\xd2\xe0\x8e\x01\xa9\x90\x10,p\x16\xd6\xb5\xbf\x93k\xbc\xc0\xb0\xbc\x80\x82\xad\xe3\x81\x0c6\x94^\xb4"R\x8c\x11V\xe4\t^{,Sv\xcd \xe1\xe1\xdd\xa3\x84\x99n\x0f\xd8\xd0\xac\x9d\x1c\x97W\x93[\xc7\x87\r/Y\x88\x13\x9dyH\xd6\x91\x1b\xaaV\x1a7\xaa\xff\xa7x\x91\x10#P*`o\x1c\x91\xa1\xb4\xb2\\*\xad\xad\x88\xf6R+\x88\xbb;\xc3j\xd0)J\xf8lZ\xd1Um\xaf\xee\x1e{ez\xdf\xb7\x92\x13\x9c\xab\xa7qRW\xd6E\xa0\x9efr\xff\xad\xe5\x0f[\xda\xe3D\x1fS\xa5\xf7O\xff\xf4\x12h\xae\xb7\x97)\xaa\xe0\x9c\xc6~5\xd4\xfd\xc0y\xe0T0PO\x9b6\xa3\x13\x86\xa1\xa1\'\xfc\xa6\x1b{sF\x08\xcdt\xd4:+\xfd\xde\xf9\xbe:\xd4\x9e\xf6\xeb>\rR\xdb\x1d\xec\x9au\xe5\x7f\x0b\x05\xdbP\xf7\x01\x00\x1a\x0e<\x17\xfb\xbd\xaa<\xdc3\xd1N\xe7\xae\xbd65\xffdu+/\x1f\xef\xeb\xbe\xea\x04\xa7\x03\xab\xf7\xac\xc1\xcc\x9e\xee\xd0\nk\xba\x97\x90\xd7\xed\xd0\xae\xcf\xad\xa1]\x1f\xd4\xea\xe80\xd4\xb19Bp(\xc0\xb1\x10\xc2!H\xd8\xc2`d\x84\xb4\xc6\x96D-\xd2\xc30\xc1EQKf\x87@=S\xbb\xf5\x98lv\xac8\x89a\x00g\x95\x01\xe9\xa1\x11\x0fK\x00KQRT\x88\x10\x8c\xc0=\xc0\xb3\xed\xe5ri\x05\x98\x91\xd2\nyj\x03\xda\x0e\xc8,\xe11w\xad<\x8bQ\x95\xcb\x11\xea]8\xa8N\xd2\x08\xb9\xbdK\xd0k\x83\x95\xf1PY\xaelUne8\x85\xd3?B\xea\x0c\xe4\x19\xdc\r\n\xa4}\x8c\x94\xcf\xd5A\xa8\xaf\x08u\xc5\xe8\x15\x8c\xa2\x05NJ\xf8kn*OB\xc3y\x03\xfd/\x94\xcc\x1aT\x15\x1a@\xa1N\xb2\x86\xb0 6\x9a\xed\xd9\xcc\xa8\x10\x94$\x9fs\xc9UtJ\xda\x18P\x93wK\xadzI\xd0\x8ewX\xb1\xf3&\xc5\xab\x84fqEV\xbf\x8fT\x1f\x02Bsh\xe40\xcb\xa3h\xaf\xf4\xc8\x95\xba\xa7<\x88\xa7(\x83\x94I\xa4l\x17ec\xa5}\x87B\x0fT\xec\r\xd8*\x19M\x86\xeawS\x12\xa5\x8b\x0e\'\x0e\xa7#9\xa9nl\xed\xb9"\x14\x10\xe7x\x81\x85\x91\x92>Dw\xeaL>\xbd\xba\xb9zsu3\x99L\xae\xaf^O\xa6\xd7_L\x9f_\xbf\x9a\xbe\x80\xef\xcb\xeb7\x08\xfc\xa8\xd7\xe8\xb5F\xbb\xdeH\xd2\xb3na\xe3s\x9cU\x15w\xfb\xb6\xa4b\xad?\xa6k\xb9\x8e5\xb0\xe0\x02a\xdd\x16UDZSu\xa1\x1d\xff\x0b\xaaR\xe1\t\x1f\x0b\x00\x00

  并且,作者尝试了请求五十次,结果如下:

请求地址

返回‘乱码’ &使用代理(阿里云)

返回‘乱码’ &不使用代理

http://www.baidu.com/

45

26

http://www.baidu.com

0

9

  然后作者查看了异常结果的Response.info(),如下:

Server: Apache-Coyote/1.1
Cache-Control:
Content-Type: text/html;charset=UTF-8
Content-Encoding: gzip
Content-Length: 1285
Set-Cookie: fist_user=1;Domain=.baidu.com;Path=/;Max-Age=300
Pragma: no-cache

  可以看出,Response可能采用的Gzip编码。使用Gzip对其进行解码,得到的结果与正常结果一样。解码代码如下:

import urllib
import gzip
from StringIO import StringIO
Response= urllib.urlopen("http://www.baidu.com",proxies=proxies)
buf = StringIO(Response)
f = gzip.GzipFile(fileobj=buf)
data = f.read()
print data

  然后,作者搜索了Response+gzip的相关内容,发现使用gzip对Request和Response进行压缩是一种很常用的技术(节省流量),至于刚开始为什么一部分成功一部分不成功,估计和网速有关吧,百度服务器的设置。

  1. Gzip压缩的好处:简单来说, Gzip压缩是在一个文本文件中找出类似的字符串, 并临时替换他们,使整个文件变小。这种形式的压缩对Web来说非常适合, 因为HTML和CSS文件通常包含大量的重复的字符串,例如空格,标签。

  2. 正常网页的Response.info()如下:

    Date: Fri, 26 May 2017 09:47:21 GMT
    Content-Type: text/html; charset=utf-8
    Connection: Close
    Vary: Accept-Encoding
    Set-Cookie: BAIDUID=BC372CE9BA2818456F638398397AA396:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BIDUPSID=BC372CE9BA2818456F638398397AA396; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: PSTM=1495792041; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BDSVRTM=0; path=/
    Set-Cookie: BD_HOME=0; path=/
    Set-Cookie: H_PS_PSSID=23080_1457_21114_22748_22916_20929; path=/; domain=.baidu.com
    P3P: CP=" OTI DSP COR IVA OUR IND COM "
    Cache-Control: private
    Cxy_all: baidu+be1deb4364f132ec4f46c09e73d3c3a2
    Expires: Fri, 26 May 2017 09:47:00 GMT
    X-Powered-By: HPHP
    Server: BWS/1.1
    X-UA-Compatible: IE=Edge,chrome=1
    BDPAGETYPE: 1
    BDQID: 0xe2d7aa44000004ed
    BDUSERID: 0

  3. 测试源码

    import urllib

    # a=urllib.getproxies()

    # print a

    a ='\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x8dVKo\xe36\x10\xfe+*\x8d\xbd\x04\xd6\xcb\x89\x13G\xb2\rl\x1c\x17\xbb\xa7\x16\xc5\x16\xc8.\n\x18\x94H\xc9L$QKQ~\xaca\xa0=\xb7\xb7\x9ezj/\xed\xb9\xbd-\x8a\xb6\xbf&\x8bEO\xfd\x0b\x1dJ\x94-\xc7IQ\x08\x90\xc4\xe1\xc7y|3\x1cr\xf8\xc9\xf5g\x93W\xaf?\x9f\x1as\x99&\xe3\xa1~SL\xc6\xc3\x94J\x0cb\x99\x9b\xf4m\xc9\x16#\x14\xf2L\xd2L\x9ar\x9dSd\xe8\xd1\x08I\xba\x92\xb6Z\xe8\x87s,\n*G\xa5\x8c\xcc\x01zD\xc3\x8d\xf9\xe5ss\xc2\xd3\x1cK\x16$m%/\xa7\xa3)\x89),JXvg\x08\x9a\x8cP1\xe7B\x86\xa54\x18\xc0\x901\x174\x1a!;\xc2\x0b5\xb6\xe0\x85\x0c\xe5\xca\x08\xb1\x14\xc7\xd4^\x99\x15n<\x94L&t\xfc\xf1\x87\xbf>\xfc\xfe\xcb\xfd\xfb\xaf\xef\xdf\x7f\xfb\xcf\x1f\xdf\xdd\xff\xf9\xd3\x87_\x7f\xfb\xf8\xe3\xcf\x7f\x7f\xf3\xfd\xd0\xae!\xc3B\xae\xe1\xa3|\xef\x06\x9c\xac7s\xca\xe2\xb9\xf4\\\xc7y\xb6U\xd2\r_P\x11%|i\xae=\\J\xbe\xadP\x118\xed\xb9\xbd|e`\xc1p\xe2\x078\xbc\x8b\x05/3\xe2u\xa2(\xaa@\xdd\xbc\x1bq\x91v\xcb\xa4\x9b\xb0M\x8aE\xcc2\xcf\xf1sL\x08\xcbb\xf8KX!\xcd\xca\xbe\x97\xf1\x8c\xd6\x8b\xd4\x92M\xce\x0b&\x19\xcf< \x01xZ\xd0-K\xe3M\xc0\x05\xa1\xc2s\xb6x\x13\xf2\x84\x0b\xaf\xe38\xe1\x16{8T\x90F\x16\x9d;[\x96\xe5\xa5\xdc\xe1\xf7&\xb7\x9d\xa5\xc0yN\xc5\xb1\x05\x7f\xb6\x13\xf9)\xcb\xcc6\x0f\x1dU\r\x1b\xad\xc5\x0c\xb8\x94\xb0\xef\xfc\x0f-\x86\xa5\xde\xb3\xc6\x8d\x83\x98*\xa2uVzU&!\xbb\x86\xe3\xd7~\x9e\x9f\xb9\x87\xd1%4\x92\xfe.4\x07\xa8\xbc[>\x92\'\xab\x98\x052\xdb\xd4J.\xfb\xfbXO\xc1\xc4.\x04\xc9s\x0f\xc6_]\xfa\xaa\x90\xcc\x82\xbd\xa3\x9e{\x06\x80}\x1d\x99:\x9d\x84\x90\xb6tg\xd11\xcc\xb3\x01\xac\x08KQ\x00.\xe7L\xb1\x7fh\xbfNQ\xe3\xc0\xb9BWJ\x97s&i\xdb\xb4\xf23\xa1\x12\x14\x98E\x8eCU+\xee\x817^\xe7\xf4t\xd0\x8f"\xbf\xae\xa9]\r\x00m\x05O\x181:=r1\x88\xce|^J\xd8\xbd\xd4K)ae\xea\x9f\x1c\xe2\x1d\xdf\\\xd2\xe0\x8e\x01\xa9\x90\x10,p\x16\xd6\xb5\xbf\x93k\xbc\xc0\xb0\xbc\x80\x82\xad\xe3\x81\x0c6\x94^\xb4"R\x8c\x11V\xe4\t^{,Sv\xcd \xe1\xe1\xdd\xa3\x84\x99n\x0f\xd8\xd0\xac\x9d\x1c\x97W\x93[\xc7\x87\r/Y\x88\x13\x9dyH\xd6\x91\x1b\xaaV\x1a7\xaa\xff\xa7x\x91\x10#P*`o\x1c\x91\xa1\xb4\xb2\\*\xad\xad\x88\xf6R+\x88\xbb;\xc3j\xd0)J\xf8lZ\xd1Um\xaf\xee\x1e{ez\xdf\xb7\x92\x13\x9c\xab\xa7qRW\xd6E\xa0\x9efr\xff\xad\xe5\x0f[\xda\xe3D\x1fS\xa5\xf7O\xff\xf4\x12h\xae\xb7\x97)\xaa\xe0\x9c\xc6~5\xd4\xfd\xc0y\xe0T0PO\x9b6\xa3\x13\x86\xa1\xa1\'\xfc\xa6\x1b{sF\x08\xcdt\xd4:+\xfd\xde\xf9\xbe:\xd4\x9e\xf6\xeb>\rR\xdb\x1d\xec\x9au\xe5\x7f\x0b\x05\xdbP\xf7\x01\x00\x1a\x0e<\x17\xfb\xbd\xaa<\xdc3\xd1N\xe7\xae\xbd65\xffdu+/\x1f\xef\xeb\xbe\xea\x04\xa7\x03\xab\xf7\xac\xc1\xcc\x9e\xee\xd0\nk\xba\x97\x90\xd7\xed\xd0\xae\xcf\xad\xa1]\x1f\xd4\xea\xe80\xd4\xb19Bp(\xc0\xb1\x10\xc2!H\xd8\xc2`d\x84\xb4\xc6\x96D-\xd2\xc30\xc1EQKf\x87@=S\xbb\xf5\x98lv\xac8\x89a\x00g\x95\x01\xe9\xa1\x11\x0fK\x00KQRT\x88\x10\x8c\xc0=\xc0\xb3\xed\xe5ri\x05\x98\x91\xd2\nyj\x03\xda\x0e\xc8,\xe11w\xad<\x8bQ\x95\xcb\x11\xea]8\xa8N\xd2\x08\xb9\xbdK\xd0k\x83\x95\xf1PY\xaelUne8\x85\xd3?B\xea\x0c\xe4\x19\xdc\r\n\xa4}\x8c\x94\xcf\xd5A\xa8\xaf\x08u\xc5\xe8\x15\x8c\xa2\x05NJ\xf8kn*OB\xc3y\x03\xfd/\x94\xcc\x1aT\x15\x1a@\xa1N\xb2\x86\xb0 6\x9a\xed\xd9\xcc\xa8\x10\x94$\x9fs\xc9UtJ\xda\x18P\x93wK\xadzI\xd0\x8ewX\xb1\xf3&\xc5\xab\x84fqEV\xbf\x8fT\x1f\x02Bsh\xe40\xcb\xa3h\xaf\xf4\xc8\x95\xba\xa7<\x88\xa7(\x83\x94I\xa4l\x17ec\xa5}\x87B\x0fT\xec\r\xd8*\x19M\x86\xeawS\x12\xa5\x8b\x0e\'\x0e\xa7#9\xa9nl\xed\xb9"\x14\x10\xe7x\x81\x85\x91\x92>Dw\xeaL>\xbd\xba\xb9zsu3\x99L\xae\xaf^O\xa6\xd7_L\x9f_\xbf\x9a\xbe\x80\xef\xcb\xeb7\x08\xfc\xa8\xd7\xe8\xb5F\xbb\xdeH\xd2\xb3na\xe3s\x9cU\x15w\xfb\xb6\xa4b\xad?\xa6k\xb9\x8e5\xb0\xe0\x02a\xdd\x16UDZSu\xa1\x1d\xff\x0b\xaaR\xe1\t\x1f\x0b\x00\x00'
    file = open(r"C:\Users\wzs\Desktop\baidu",'w')
    proxies={'http':'http://120.24.79.140:8118'}
    i = 0
    j0 = 0
    j1 = 0
    proxyfiles = []
    localfiles = []
    while i < 50:
    proxyfile = urllib.urlopen("http://www.baidu.com",proxies=proxies).read()
    localfile = urllib.urlopen("http://www.baidu.com").read()
    if proxyfile==a:
    j0+=1
    else:
    proxyfiles.append(proxyfile)
    if localfile==a:
    j1+=1
    else:
    localfiles.append(localfile)
    i+=1
    file.writelines(proxyfiles)
    file.writelines("\n-------------------------------------------------------------\n")
    file.writelines(localfiles)
    file.close()
    print j0
    print j1

  4. 待续