取网页HTML内容的奇怪问题,(200分)(200分)

  • 主题发起人 主题发起人 djrj
  • 开始时间 开始时间
D

djrj

Unregistered / Unconfirmed
GUEST, unregistred user!
我用INDY的HTTP取一个网页的HTML内容,
并用HTTPLook进行截包跟踪,发现奇怪的问题:
大体是这样:
1.设置IDHttp的一些参数,并登录.....
2.html:= IDhttp.get(url);
3.Memo1.Lines.Text:= html;
在截包中可以看到我已经成功登录了,
而且我要的网页的HTML内容也已经成功地取回来了,
但Memo1中却显示一个问号?,调试发现html有二进制数据。

盼望高手解决,天天等待中。。。。。
 
具体的网页呢?大家都来试一下。
 
谢谢二楼的关注,由于涉及帐号密码登录问题不便公开
HTTPLook截到的头:
Content-Encoding: gzip
....
HTTPLook截到的最后一行我发现加了这一句:
Message body has been unpacked.

有些包没有这最后一行的就可以正常显示,
现在问题就是怎么把一个gzip压缩的内存数据流直接在内存中解压缩.
 
下载回来的网页是gzip压缩的,怎样把它直接在内存中解压出来啊,
解决了500分相送,决不食言
 
我很在意这个问题。。
 
谢楼主,看了这个帖子我才知道浏览器中还有解压缩一功能。嘻嘻
帮你查了下。

+++++++++++++++++++
什么是HTTP压缩?

HTTP压缩(或叫HTTP内容编码)作为一种网站和网页相关的标准,存在已久了,只是最近几年才引起大家的注意。HTTP压缩的基本概念就是采用标准的gzip压缩或者deflate编码方法,来处理HTTP响应,在网页内容发送到网络上之前对源数据进行压缩。有趣的是,在版本4的IE和NetScape中就早已支持这个技术,但是很少有网站真正使用它。Port80软件公司做的一项调查显示,财富1000强中少于5%的企业网站在服务器端采用了HTTP压缩技术。不过,在具有领导地位的网站,如Google、Amazon、和Yahoo!等,HTTP内容编码技术却是普遍被使用的。考虑到这种技术会给大型的网站们带来带宽上的极大节省,用于突破传统的系统管理员都会积极探索并家以使用HTTP压缩技术。

+++++++++++++++++++++++++++++++++++++++++
我有一个方法试试,下面是请求的头
GET / HTTP/1.1
Host: www.port80software.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040206 Firefox/0.8
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate  //这里的不要了,让服务器认为你的客户端不支持gzip压缩,应该就会返回给你未经压缩的html流了。
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
 
没法帮你试验,猜测的,如果不行,我们再来试别的。嘻嘻
 
http://www.2ccc.com/article.asp?articleid=3454
中有个ThttpTask类,他说实现了类似浏览器一样的GZIP功能,我没研究,你看看是否他可以解析,反正他也是建立在idhttp控件上的。

+++++++++++++++++++
原文转:
本人还额外封装了一个 THTTPtask 类,该类是基于INDY进一步封装而成,并使用了一个第3方的压缩处理库,使 THTTPtask 如同浏览器那样,完全支持 GZIP
 
非常感谢shangshang的回答,
我试了去掉这行后也不行Accept-Encoding: gzip,deflate
你说的另一个方案我马上去看...
HTTPLook截到的包会自动加上这一行Message body has been unpacked.
不知HTTPLook是怎么在内存中完成数据注的解压的
 
如果还不行,就多做一步处理,用个stringstream来取得压缩流,然后seek到压缩开始点,然后随便找个gzip解压算法,自己解出来这个流,再根据你的应用比如与http头合成,
这些操作都是可以直接在内存里完成的。
 
还有一个瞎猜的想法:
Accept-Encoding: gzip,deflate  //这里的不要了,让服务器认为你的客户端不支持gzip压缩,应该就会返回给你未经压缩的html流了。

把上面的改为Accept-Encoding: deflate

Accept-Encoding:
都试试吧。
 
已经解决了,下载了一个LVK_FULL包,含源代码,
里面有支持gzip压缩和解压缩的,引用单元调用其中的函数就可以了.
盒子里的代码支持gzip的也是引用这些单元来实现的.
再次感谢shangshang的引导.
请shangshang再到这里一并领分
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3506728
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
880
DelphiTeacher的专栏
D
后退
顶部