CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  HTML/XML

放1000分,高手进来动手试试:如何提取AJAX里的HTML内容?

楼主asett1(asett1)2006-12-14 12:38:15 在 VC/MFC / HTML/XML 提问

就拿google   maps(http://maps.google.com)来实验吧.  
  发送一个请求,如:  
  http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.97\0821&spn=0.036453,0.086517&t=k  
  如何利用IHTML*   接口提取到地图里的图像地址?  
  每次请求可以得到20个地图图像的<IMG>标签。  
  偶现在很傻的办法是:嵌入一个browser控件,每次去取它的temp   files,  
  要么就是从firefox里的Tools   -->   Page   Info   里得到这些<IMG>  
   
  嵌入一个browser   实在很傻,偶需要轻量级的代码来实现。  
  偶的思路是   利用spidermonky   这样的java   解析器来分析得到的内容,但并不止这些。  
   
  1000分!!   得到解答后立即分5个贴给分。  
   
  问题点数:200、回复次数:62Top

1 楼antshome(我好累)回复于 2006-12-14 12:58:14 得分 20

先下载web页,取到html源代码  
   
  再用正则表达式取<img   src="..."   />  
   
   
  如果用.net要简单一点  
  获得html源代码,用HtmlAgilityPack分析并取出页面所有img标签的src属性Top

2 楼antshome(我好累)回复于 2006-12-14 12:59:12 得分 0

或者获得html源代码,再转为xml文档,用xpath取//img[@src]Top

3 楼Practise_Think(时代“过客”)回复于 2006-12-14 13:09:39 得分 0

关注~   也期待别的方式Top

4 楼antshome(我好累)回复于 2006-12-14 13:13:03 得分 0

如果是从AJAX里取,那已经是xml文档了  
   
  贴一段我以前写的代码  
   
  CXMLHTTPRequest   request   =   CXMLHTTP30Class::CreateXMLHTTPRequest();  
   
  CString   temp;  
  temp.Format("http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.97\0821&spn=0.036453,0.086517&t=k  
  ");  
  request.Open("GET",temp,false,"","");  
  request.Send("");  
   
  CXMLDOMDocument2   doc   =   CDOMDocument30Class::CreateXMLDOMDocument2();  
  doc.LoadXML(request.GetResponseText());  
   
  CXMLDOMNode   node   =   doc.SelectSingleNode("//img[@src]");  
   
   
   
  再遍历node就可以取到图片地址了  
   
   
   
  mfc里使用msxml可以考虑以下文章  
  http://www.codeproject.com/soap/msxmlcpp.aspTop

5 楼antshome(我好累)回复于 2006-12-14 13:16:50 得分 0

XmlNodeList   nodes   =     doc.SelectNodes("//img[@src]");Top

6 楼asett1(asett1)回复于 2006-12-14 13:53:46 得分 0

谢谢楼上各位参与。  
  偶表述的不太清楚,这个AJAX是表示google   maps用的是AJAX,并不是说已经得到了xml文档了。  
  我用HttpOpenRequest()得到了"第一次请求"的DOM文档.但是这个AJAX的DOM文档是多次获得的。  
  后面的DOM文档(包含地图<IMG>标签的)是由   js脚本文件触发得到的。这个目前只能由browser获得,  
   
  例如IE的   Save   As   全部文档是无法得到<IMG>内容的,打开后只是个空架子,必须连网去下载才行。  
  Firefox做的比IE好,可以得到全部内容。  
   
  大家先动手试一下,就明白怎么回事了。不要着急的贴代码,常规的代码是无效的,必须涉及到js解析,AJAX解析这些浏览器原理的代码才可以解决这个问题。好像IE的接口不涉及这么深层次的东西。  
  Top

7 楼qiujian5628(浪迹天涯)回复于 2006-12-19 15:18:18 得分 10

用winsock发送请求    
  接收所有请求回来的数据   分析这些数据    
  找到你感兴趣的img   然后下载下来可以吗  
   
  我一般不用ie   browser去另存为等  
  很多网页好多东西   但是查看源文件就是一点  
  用抓包工具抓包看看   然后再构造自己的请求  
  推荐ieHTTPHeaders这个ie抓包插件不错Top

8 楼LiChenYue(卐)(李忱悦)(怎堪蔑拒?鳄泪横流㊣暗恋未遂!独孤求偶)(卐)回复于 2006-12-19 16:34:06 得分 0

好高深呀,纯顶一下啦。Top

9 楼asett1(asett1)回复于 2006-12-20 20:25:39 得分 0

谢谢   qiujian5628(浪迹天涯)   推荐的ieHTTPHeaders工具,确实很好用,  
  你的思路也跟我的相似:我是用WinINet   HttpOpenRequest()来发送请求。  
  问题还是怎么解析js   文件   得到输出的GET命令,它每次都算出不同的GET参数,  
  总不能挂着IE来解析它吧,还是得研究spidermonky,怎么和firefox配合的问题  
  。  
  Top

10 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-21 16:56:48 得分 10

用Mimefilter对网页进行过滤,可以对text/HTML,对JS进行过滤  
  参考:http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx  
  对于能不能对JS、AJAX多次执行进行过滤,可以下载代码研究一下。Top

11 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-21 20:25:59 得分 0

可以用Asynchronous   Pluggable   Protocols根据不同的MIME类型拦截IE加载的不同类型的图片。  
  MIME类型:  
  image/gif    
  image/jpeg    
  image/pjpeg    
  image/tiff    
  image/x-png    
  image/x-xbitmap    
  image/bmp    
  image/x-jg    
  image/x-emf    
  image/x-wmf    
  Top

12 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-21 21:49:42 得分 0

我得到的你提供的网页内的图片:  
  http://kh2.google.com/kh?n=404&v=12&t=trstrtrrqtrrttq  
  http://kh1.google.com/kh?n=404&v=12&t=trstrtrrqtrqssr  
  http://kh3.google.com/kh?n=404&v=12&t=trstrtrrqtrrttt  
  http://kh1.google.com/kh?n=404&v=12&t=trstrtrrqtrrtqt  
  http://kh2.google.com/kh?n=404&v=12&t=trstrtrrqtrqsss  
  http://kh3.google.com/kh?n=404&v=12&t=trstrtrrqtrrttr  
  http://kh0.google.com/kh?n=404&v=12&t=trstrtrrqtrqsrs  
  http://kh0.google.com/kh?n=404&v=12&t=trstrtrrqtrrtts  
  http://kh2.google.com/kh?n=404&v=12&t=trstrtrrqtrrtqs  
  http://kh0.google.com/kh?n=404&v=12&t=trstrtrrqtrqssq  
  http://kh0.google.com/kh?n=404&v=12&t=trstrtrrqtrsqqq  
  http://kh1.google.com/kh?n=404&v=12&t=trstrtrrqtrqsst  
  http://kh3.google.com/kh?n=404&v=12&t=trstrtrrqtrqsrt  
  http://kh3.google.com/kh?n=404&v=12&t=trstrtrrqtrtrrr  
  http://kh0.google.com/kh?n=404&v=12&t=trstrtrrqtrrtsq  
  http://kh1.google.com/kh?n=404&v=12&t=trstrtrrqtrsqqr  
  http://kh1.google.com/kh?n=404&v=12&t=trstrtrrqtrrtst  
  http://kh3.google.com/kh?n=404&v=12&t=trstrtrrqtrrtrt  
  http://kh2.google.com/kh?n=404&v=12&t=trstrtrrqtrtrrq  
  http://kh2.google.com/kh?n=404&v=12&t=trstrtrrqtrsqrq  
  http://kh1.google.com/kh?n=404&v=12&t=trstrtrrqtrrtsr  
  http://kh2.google.com/kh?n=404&v=12&t=trstrtrrqtrrtss  
  http://kh0.google.com/kh?n=404&v=12&t=trstrtrrqtrrtrs  
  http://kh3.google.com/kh?n=404&v=12&t=trstrtrrqtrsqrrTop

13 楼asett1(asett1)回复于 2006-12-22 14:42:10 得分 0

谢谢   lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)    
  提供的有力工具。但是我只能得到第一个img   url   ,怎么能得到全部的img   list   ?  
  我只需要   pOIBindInfo->GetBindString(BINDSTRING_URL,   &Url,   1,   &Fetched);  
  就可以得到url了,不需要接下来的ReportData   ReportProgress了。  
   
  Top

14 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-22 16:21:16 得分 10

对于:http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx源码修改如下:  
  1、去掉CHTMLFilter实现的IInternetProtocolSink接口  
  2、CMimefilterDlg中:  
  BOOL   CMimefilterDlg::OnInitDialog()  
  {  
  CDialog::OnInitDialog();  
  SetIcon(m_hIcon,   TRUE); //   Set   big   icon  
  SetIcon(m_hIcon,   FALSE); //   Set   small   icon  
  HRESULT   hr=::CoGetClassObject(CLSID_HTMLFilter,CLSCTX_SERVER,NULL,IID_IClassFactory,(void**)&m_pFactory);  
  if(SUCCEEDED(hr))  
  {  
  hr=::CoInternetGetSession(0,&m_pSession,0);  
  if(SUCCEEDED(hr))  
  {  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"https",   0,   NULL,   0);  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"http",   0,   NULL,   0);  
  }  
  }  
  m_ie.Navigate("http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.97\\0821&spn=0.036453,0.086517&t=k",   NULL,   NULL,   NULL,   NULL);    
   
  return   TRUE;     //   return   TRUE     unless   you   set   the   focus   to   a   control  
  }  
  3、CHTMLFilter中:  
  STDMETHODIMP   CHTMLFilter::Start(LPCWSTR   szUrl,  
    IInternetProtocolSink   *pOIProtSink,  
    IInternetBindInfo   *pOIBindInfo,  
    DWORD   grfPI,   HANDLE_PTR   dwReserved)  
  {  
  FILE   *f   =   _wfopen(L"C:\\googlemap.log",   L"a");  
   
  fputws(szUrl,   f);  
  fputws(L"\n",   f);  
  fclose(f);  
  return   INET_E_USE_DEFAULT_PROTOCOLHANDLER;  
  }  
   
  STDMETHODIMP   CHTMLFilter::Continue(PROTOCOLDATA   *pProtocolData)  
  {  
  return   S_OK;  
  }  
   
  STDMETHODIMP   CHTMLFilter::Abort(HRESULT   hrReason,   DWORD   dwOptions)  
  {  
  UrlMonProtocol->Abort(hrReason,   dwOptions);  
  return   S_OK;  
  }  
   
  STDMETHODIMP   CHTMLFilter::Terminate(DWORD   dwOptions)  
  {  
  return   S_OK;  
  }  
   
  STDMETHODIMP   CHTMLFilter::Suspend()  
  {  
  return   S_OK;  
  }  
   
  STDMETHODIMP   CHTMLFilter::Resume()  
  {  
  return   S_OK;  
  }  
   
   
  //   IInternetProtocol  
  STDMETHODIMP   CHTMLFilter::Read(void   *pv,   ULONG   cb,   ULONG   *pcbRead)  
  {  
  return   S_OK;  
  }  
   
  STDMETHODIMP   CHTMLFilter::Seek(LARGE_INTEGER   dlibMove,   DWORD   dwOrigin,   ULARGE_INTEGER   *plibNewPosition)  
  {  
  return   E_FAIL;  
  }  
   
  STDMETHODIMP   CHTMLFilter::UnlockRequest()  
  {  
  return   S_OK;  
  }  
   
  STDMETHODIMP   CHTMLFilter::LockRequest(DWORD   dwOptions)  
  {  
  return   S_OK;  
  }  
  4、打开C:\googlemap.log,就可以看到所有的图片要址了(如果需要GOOGLE地图的图片,可以对CHTMLFilter::Start进行修改实现)Top

15 楼asett1(asett1)回复于 2006-12-22 21:43:47 得分 0

谢谢lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)   的快速回复,但是还是有2个问题请教:  
  1.   使用web   browser控件只能得到可见的20个图像,而不是全部的24个图像,请问你怎么一次得到24个图像的?   能否再给出代码?一次得不到全部图像给我后续代码带来了很大麻烦。  
  2.如果把web   browser控件属性设为invisable,   什么结果也得不到。因为我后续的程序很消耗内存和显存,而且高度频繁的更新url,实现不想让browser显示任何图像,我只想得到img   url   list,   由下载线程来处理。请问怎么让web   browser控件不做任何显示的事情?  
   
  Top

16 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-23 00:14:25 得分 10

我做了一个试验:  
  (1)我做了一个BHO(Browser   Helper   Objects),把我们的过滤功能加进去。  
  (2)用CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_SERVER,IID_IWebBrowserApp,(LPVOID*)&pWBApp)创建一个IE窗口,并用代码将其导航到GOOGLE地图页面,从而得到图片日志。  
   
  第一种情况:将IE的Visible设为FALSE时,则LOG日志中的图片内容为空。  
  (以下几种情况,Visible为TRUE)  
  第二种情况:将IE的Width、Height都置为0,则LOG日志中的图片数为3。  
  第三种情况:在我拖拽IE的窗口,改变其大小时,LOG内的图片数,随之增加。  
  第四种情况:将IE的Width、Height分别置为1024、768,则得到的图片为20。  
  第五种情况:将IE的Width、Height、Top、Left分别置为1024、768、0、0,则得到的图片数中24。  
   
  总结:  
  GOOGLE   MAPS页面中的AJAX与服务器的交互和页面的布局、大小有很大的关系,它会根据浏览器控件当前显示的区域从服务器上下载不等数据的图片以供显示。  
  所以楼主不能将浏览器控件隐藏,且设置适当的显示区域,以取得一定的图片数。Top

17 楼asett1(asett1)回复于 2006-12-23 21:37:09 得分 0

谢谢   lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)   深夜还帮我试验代码,很感动!  
   
    BHO(Browser   Helper   Objects)能不能大概列一下?关键是如何设定IE的Width、Height、Top、Left   ?  
  能不能实现这个BHO仅做url解析和接受?   不做接下来的download和display   ?    
  Top

18 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-25 08:41:13 得分 0

1、关于BHO:http://www.vckbase.com/document/viewdoc/?id=1426  
  2、http://support.microsoft.com/kb/167658,像文中那样去建立IE实例,用:  
      HRESULT   IWebBrowser2::put_Width(long   Width);  
      HRESULT   IWebBrowser2::put_Height(long   Height);  
      HRESULT   IWebBrowser2::put_Top(long   Top);  
      HRESULT   IWebBrowser2::put_Left(long   Left);  
  3、我想这个BHO不太可能只做解析,不过你可以尝试一下。Top

19 楼asett1(asett1)回复于 2006-12-25 14:25:39 得分 0

谢谢lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)   ,让我前进了一步:虽然仍然在用web   browser,但是捕捉了url消息。原来是从Temp   files里取,现在是从消息里获得。  
  我再等等看看如何阻塞IE的   download和display.  
  Top

20 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-25 14:37:29 得分 0

不客气!我想没有现成的、强大的JS/HTML解析器,在短时间内,你是先走不出web   browser的。Top

21 楼gangjh(阿飞)回复于 2006-12-25 16:19:57 得分 10

可以用java   script引擎,與html   parser.  
  bmozjs   ,引擎不錯.  
  html   parser,如果只是提取,   用lex分析是很簡單的.  
  Top

22 楼gangjh(阿飞)回复于 2006-12-25 16:22:48 得分 0

暈貼都貼錯了.   mozilla引擎.  
  Top

23 楼asett1(asett1)回复于 2006-12-27 09:47:25 得分 0

谢谢   gangjh(阿飛)   (   一级(初级))    
  能不能说说“怎么使用”mozilla引擎的java   script引擎,與html   parser   ?  
  我找遍mozilla网站也没发现什么文档。只有一些原理的文档。好像mozilla引擎没法独立使用,必须在它自己的环境里。  
  html   parser   能解决AJAX的问题吗?   google   map的每张图都是通过复杂的js解析计算出来的,  
  影响因素有浏览器大小,位置,版本,提交参数,等n多因素。单单一个lex分析能解决吗?  
   
  Top

24 楼asett1(asett1)回复于 2006-12-27 09:52:45 得分 0

mozilla的java   script引擎是否就是spidermonky   ?   你用过吗?没有使用文档啊。  
  我编译了一下,得到了js.exe   但是几乎没法用阿:用它来解析google   map的js   文件,  
  说没定义window,   document等基本变量,请问怎么定义呢?    
   
  像google   map是先执行html的js脚本,得到一些变量定义,加上browser的window,document   才去执行真正的js文件,  
   
  像这种情况怎么模拟?  
  Top

25 楼gangjh(阿飞)回复于 2006-12-27 10:00:26 得分 10

你可以用tcptrace跟蹤   ajax請求的http數據包,  
  java   script腳本執行最終都需要通過post,或get方法向Web   Service請求數據.  
  找找看,它的HTTP據包該類似下面.  
   
  GET   http://www.google.com/   HTTP/1.0  
  Accept:   image/gif,   image/x-xbitmap,   image/jpeg,   image/pjpeg,   application/x-shockwave-flash,   application/vnd.ms-powerpoint,   application/vnd.ms-excel,   application/msword,   */*  
  Accept-Language:   zh-tw  
  Cookie:   PREF=ID=91fc2af9086acc7f:NW=1:TM=1157597063:LM=1157597063:S=Nixvn2epcAr7Bu49  
  User-Agent:   Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.0)  
  Host:   www.google.com....  
  Top

26 楼asett1(asett1)回复于 2006-12-27 12:07:49 得分 0

我用ieHTTPHeaders工具已经得到了全部的HTTP数据包,但是这些数据包是通过解析一个map.70.js的脚本文件得到的,不同的url请求参数,会得到不同的HTTP数据包。所以怎么使用js.exe来模拟才是关键。  
  能否再给点建议?  
  Top

27 楼gangjh(阿飞)回复于 2006-12-27 13:06:02 得分 10

分析一下不同的參數產生的http請求有什麼不同喔.  
  或者你直接由它來產生,得到http請求,然後透過socket發送到google,  
  再用lex分析google   返回.Top

28 楼asett1(asett1)回复于 2006-12-27 17:20:55 得分 0

gangjh(阿飛)   ,你提供的思路没问题,但是没法实施啊。  
  请看:对于这么一个请求,从得到的结果看,怎么可能找到规律呢?  
  换句换说,答案就在返回的结果里,要是已经得到了,也不需要用lex分析了啊。  
  请求:  
  http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.970821&spn=0.036453,0.086517&t=k  
   
  结果:  
   
  GET   http:   //kh1.google.com/kh?n=404&v=13&t=trstrqtrqqrsrqr   HTTP/1.1  
  Accept:   */*  
  Referer:   http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.970821&spn=0.036453,0.086517&t=k  
  Accept-Language:   zh-cn  
  Accept-Encoding:   gzip,   deflate  
  User-Agent:   Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.0;   .NET   CLR   1.1.4322)  
  Host:   kh1.google.com  
  Proxy-Connection:   Keep-Alive  
  Cookie:   khcookie=fzwq1KAV2G5pfwSBP4g1QNZWjOCXbjbO7S3zrQ;   PREF=ID=67fd415ca3d04858:NW=1:TM=1167210906:LM=1167210906:S=zRjdbLWvwUZjZwYh;   testcookie=  
  Proxy-Authorization:   NTLM   TlRMTVNTUAABAAAAB4IAogAAAAAAAAAAAAAAAAAAAAAFAJMIAAAAD1==  
   
   
  GET   http:   //kh2.google.com/kh?n=404&v=13&t=trstrqtrqqrsrrq   HTTP/1.1  
  Accept:   */*  
  Referer:   http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.970821&spn=0.036453,0.086517&t=k  
  Accept-Language:   zh-cn  
  Accept-Encoding:   gzip,   deflate  
  User-Agent:   Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.0;   .NET   CLR   1.1.4322)  
  Host:   kh2.google.com  
  Proxy-Connection:   Keep-Alive  
  Cookie:   khcookie=fzwq1KAV2G5pfwSBP4g1QNZWjOCXbjbO7S3zrQ;   PREF=ID=67fd415ca3d04858:NW=1:TM=1167210906:LM=1167210906:S=zRjdbLWvwUZjZwYh;   testcookie=  
  Proxy-Authorization:   NTLM   TlRMTVNTUAABAAAAB4IAogAAAAAAAAAAAAAAAAAAAAAFAJMIAAAAD1==  
   
  GET   http:   //kh0.google.com/kh?n=404&v=13&t=trstrqtrqqrrsts   HTTP/1.1  
  Accept:   */*  
  Referer:   http://maps.google.com/maps?f=q&hl=zh-CN&q=Shanghai&ie=UTF8&om=0&z=14&ll=36.451113,115.970821&spn=0.036453,0.086517&t=k  
  Accept-Language:   zh-cn  
  Accept-Encoding:   gzip,   deflate  
  User-Agent:   Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.0;   .NET   CLR   1.1.4322)  
  Host:   kh0.google.com  
  Proxy-Connection:   Keep-Alive  
  Cookie:   khcookie=fzwq1KAV2G5pfwSBP4g1QNZWjOCXbjbO7S3zrQ;   PREF=ID=67fd415ca3d04858:NW=1:TM=1167210906:LM=1167210906:S=zRjdbLWvwUZjZwYh;   testcookie=  
  Proxy-Authorization:   NTLM   TlRMTVNTUAABAAAAB4IAogAAAAAAAAAAAAAAAAAAAAAFAJMIAAAAD1==  
  Top

29 楼asett1(asett1)回复于 2006-12-27 18:18:06 得分 0

一共0-   30组   (具体根据browser   的位置,大小,版本等)  
  答案就是这些:  
  GET   http:   //kh0.google.com/kh?n=404&v=13&t=trstrqtrqqrrsts   HTTP/1.1  
   
  确实没法找到这些   “trstrqtrqqrrsts”   啊。  
  Top

30 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-27 22:28:53 得分 0

你可以模拟BROWSER的位置、大小、版本,将这些信息传送到服务器。Top

31 楼asett1(asett1)回复于 2006-12-28 09:38:30 得分 0

谢谢lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)   ,  
  有个问题请教:现在我想得到browser   object接受到的全部html,txt,javascript,js   ,请问在你的代码里如何得到?  
   
  能否说说如何在socket   request里构造browser的位置、大小、版本   ?   谢谢!  
  Top

32 楼asett1(asett1)回复于 2006-12-28 09:42:03 得分 0

有个关键的信息:30个image   url的排列顺序必定是也传给了  
  browser,否则browser没法正确显示图像。但是browser是异步下载数据的,  
  这造成了在我们代码里得到的图像顺序是不对的,而且是随机的。  
  没办法正确显示图像。  
   
   
  Top

33 楼gangjh(阿飞)回复于 2006-12-28 10:09:16 得分 0

看來樓主離成功還有差一步.  
  圖片顯示位置有可能是由javascript決定的.  
  這是個比較細致的工作.樓主好好調試.  
   
  有點奇怪的是,樓主為什麼不研究一下google提供的API   .Top

34 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-28 10:17:34 得分 10

1、Webbrowser的方法:要得到HTMTL和JS内容,就得再做两个Filter.你现在的Filter是"http",再做两个分别用“text/html”、“application/javascript”,具体代码类似于我的例子。  
  2、mozilla引擎的方法:我的意思是,GOOGLE用JS先得到browser位置、大小、版本相关的信息(可能还有其它信息),然后再用JS将其进行运算(加密等操作,当然了,对于我们来说这并不保密,哈哈),再提交到服务器。你可以分析GOOGLE的JS代码,用程序来模拟运算(加密),再用socket提交到服务器。Top

35 楼asett1(asett1)回复于 2006-12-28 10:49:05 得分 0

我添加了这几句代码了,还是得不到啊  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"text/html",   0,   NULL,   0);  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"text/plain",   0,   NULL,   0);  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"application/javascript",   0,   NULL,   0);  
   
  是不是在CHTMLFilter::Start()里或其它地方还要更改,我看这里捕捉的都是szUrl   阿,其他文字在哪里捕捉啊?  
   
  google提供的API研究了,不能达到我的项目要求:不能取到image,只能print,而且全是script   不能在c++里用.Top

36 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-28 11:04:52 得分 0

Add   two   ATL   objects   that   implement   IInternetProtocol   and   IInternetProtocolSink(CHTMLFilterHTML   and   CHTMLFilterJS),   then   Register   like   this:  
  //m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"http",   0,   NULL,   0);  
  m_pSession->RegisterMimeFilter(m_pFactory,CLSID_HTMLFilterHTML,L"text/html");  
  m_pSession->RegisterMimeFilter(m_pFactory,CLSID_HTMLFilterJS,L"application/javascript");  
  Top

37 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-28 11:10:30 得分 0

modify:  
  m_pSession->RegisterMimeFilter(m_pFactory,CLSID_HTMLFilterJS,L"application/x-javascript");Top

38 楼asett1(asett1)回复于 2006-12-28 12:58:59 得分 0

lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)    
  请问修改一下你的CHTMLFilter   类型为"text/html"就可以得到下面列的xml数据吗?在CHTMLFilter::ReportData()需要进行什么修改吗?  
   
   
  每个image   其xml数据如下  
  <IMG  
            style="border:   0px   none   ;   margin:   0px;   padding:   0px;   position:   absolute;   left:    
   
  917px;   top:   724px;   width:   256px;   height:   256px;   -moz-user-select:   none;"    
   
  src="http://kh2.google.com/kh?n=404&amp;v=13&amp;t=ttrrq"/>  
   
   
  我用firefox的DOM   Inspector仔细察看了一下图像DOM   node   发现其实每个image的left,top   就给出了位置,只要得到image   DOM   node的属性就行了。只不过位置需要再调一下,view里看不到的位置都是负值。  
   
   
   
   
   
  Top

39 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-28 13:03:08 得分 0

说说你的思路是什么样的?我现在不太明白。Top

40 楼asett1(asett1)回复于 2006-12-28 14:56:39 得分 0

原来我们用  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"http",   0,   NULL,   0);  
  仅仅得到了image   url   ,现在我想进一步得到image   position   属性,就像  
  <IMG  
  style="border:   0px   none   ;   margin:   0px;   padding:   0px;   position:   absolute;   left:  
   
  917px;   top:   724px;   width:   256px;   height:   256px;   -moz-user-select:   none;"  
   
  src="http://kh2.google.com/kh?n=404&amp;v=13&t=ttrrq"/>  
   
  这些response如何得到?  
  修改一下你的CHTMLFilter   类型为"text/html"就可以得到上面的数据吗?在CHTMLFilter::ReportData()需要进行什么修改吗?  
   
   
   
  Top

41 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-28 15:16:00 得分 20

如果上面的<IMG>位于HTML中就用“text/html”,如果位于XML中就用“text/xml”。  
  可能CHTMLFilter::ReportData不会做太大的改变,因为我也没动写过过滤XML的代码所以可以试一下。Top

42 楼asett1(asett1)回复于 2006-12-28 16:32:44 得分 0

lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)   还得进一步请教:  
   
  1.   我试了一下午,发现得到的"text/html"   内容很少,没有任何  
    http://kh2.google.com/kh?n=404&v=13&t=tqtrq  
  的信息,跟最早用HttpOpenRequest()得到的内容一样。  
  为啥用  
  m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"http",   0,   NULL,   0);  
  至少可以得到url   呢?能解释一下吗?  
   
  2.使用  
  CComPtr<IStream>   DataStream;  
  总是报错。在  
  DataStream->Read(pv,   cb,   pcbRead);  
  和  
  CreateStreamOnHGlobal(0,   true,   &DataStream);  
  时,请问这个DataStream做什么用的?可否完全去掉呢?  
  Top

43 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-29 08:35:15 得分 20

1、你用的是“text/html”?我想你应该用“text/xml”  
        m_pSession->RegisterNameSpace(m_pFactory,   CLSID_HTMLFilter,   L"http",   0,   NULL,   0);  
        是对URL的http命名空间的截获。  
  2、DataStream是为浏览器准备的数据。报错?出什么错误?Top

44 楼asett1(asett1)回复于 2006-12-29 09:04:06 得分 0

我今天再试试"text/xml"   不过总感觉捕获不到。  
  DataStream   报错在Atlbase.h   的指针非NULL   断言错误,如下:  
   
  _NoAddRefReleaseOnCComPtr<T>*   operator->()   const  
  {  
  ATLASSERT(p!=NULL);  
  return   (_NoAddRefReleaseOnCComPtr<T>*)p;  
  }  
   
  如何修改?  
  Top

45 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-29 09:57:45 得分 0

example:  
  http://support.microsoft.com/kb/260840Top

46 楼asett1(asett1)回复于 2006-12-29 11:35:04 得分 0

lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)    
  我试了"text/xml"   结果什么都得不到,连CHTMLFilter::ReportData()都没调用!  
  说明得到的还是HTML   ,firefox的DOM   Inspector把HTML转成xml而已。  
  您提供的例子也肯定没帮助了:它是把xml转成HTML.  
   
  能否空闲时动手帮我试一下?   我等您的消息。这东西实践性太强,肯定有很大的处理技巧,单单指导效果不大。像您动手帮我把URL得到用到的MIME   filter   对我就属于新东西。  
  谢谢!  
   
  Top

47 楼lily_123567(lili)回复于 2006-12-29 11:49:18 得分 0

markTop

48 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-29 13:03:14 得分 0

<IMG  
  style="border:   0px   none   ;   margin:   0px;   padding:   0px;   position:   absolute;   left:  
   
  917px;   top:   724px;   width:   256px;   height:   256px;   -moz-user-select:   none;"  
   
  src="http://kh2.google.com/kh?n=404&amp;v=13&t=ttrrq"/>  
   
  请问,这段代码你是怎样得到的?Top

49 楼asett1(asett1)回复于 2006-12-29 15:03:44 得分 0

通过firefox自带的工具   DOM   Inspector   得到的  
  firefox的工具确实强大:除了DOM   Inspector,Page   Info,Save   As   都可以得到image   url,  
  image的属性在DOM   Inspector   和Save   As里也可以得到。  
  我感觉google   maps   就是分2步走:第一步得到常见的html,第二步再根据解析maps.70.js   文件,进一步连接server,得到HTML,   本质上第二次方法跟第一次都一样,只不过它分2次走,造成获取HTML的困难。  
  Top

50 楼lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)回复于 2006-12-30 08:54:46 得分 0

得到图片地址的方法是拦截的服务器到本地的代码。  
  要得到图片的位置,和JS的解析有关,研究中。Top

51 楼asett1(asett1)回复于 2006-12-30 09:43:11 得分 0

谢谢   lion_wing(凤之焚-业与情的纠缠,死而复生的蜕变!)    
  我觉得:图像位置的HTML也是server发到本地来的,而且在DOM   Inspector里也仅找到一处image   url  
  出现的地方(共30个),说明browser是把接受到的HTML   “剥离”了,把图像地址发出,被我们截获,  
  而image的属性被browser保留用作显示。  
  我准备趁元旦这几天好好研究firefox   2.0源码,目标是提取个超精简的js/xml解析器Top

52 楼DarknessTM(我的缘分在哪里?)回复于 2007-01-03 14:47:17 得分 10

此问题分明是开发浏览器中JS解析器的部分了Top

53 楼masterz(www.fruitfruit.com)回复于 2007-01-03 15:31:42 得分 20

要执行js可能没有轻量级的办法,下面的资料可能有些帮助  
  http://support.microsoft.com/kb/185127  
  如何从   WebBrowser   VC   应用程序调用脚本函数  
  我觉得可以在程序中嵌入webbrowser控件,执行js脚本,同时禁止加载图像(通过实现IDocHostUIHandler接口,输入     DOCHOSTUIFLAG_NOPICS   flag.)这样可以获得纯html文本而不下载图片文件。Top

54 楼asett1(asett1)回复于 2007-01-04 10:04:02 得分 0

多谢   DarknessTM(我的缘分在哪里?)   ,masterz(www.fruitfruit.com)   两位高手帮顶。  
   
  我使用过codeproject网上类似masterz(www.fruitfruit.com)提供的JS   call   封装类。  
  但是主要问题没解决:  
  1.对于复杂JS脚本文件的解析(170k   大小)。JS   call   封装类只是对于单个简单的JS脚本的封装。  
      对于如此复杂的maps.70.js   文件没有任何反应。  
  2.   Webbrowser如何接受,和JS解析器进行交互?   我们虽然有强大的spidermonky的JS解析器的exe和lib,但  
  怎样和Webbrowser传递变量?传递结果的?   这方面没有任何文档描述。只能看firefox源码。  
   
  Top

55 楼lonely001(独行客)回复于 2007-01-04 11:57:35 得分 0

markTop

56 楼ReverseEngineering(★给我一杯壮阳水☆换我一夜不下垂★男人阳萎不是罪☆)回复于 2007-01-11 20:56:32 得分 0

有分我就路过。Top

57 楼jiangsheng(蒋晟.Net[MVP])回复于 2007-01-30 07:36:41 得分 20

Javascriipt   functions   are   methods   of   the   script   engine,   which   you   can   access   via   IHTMLDocument::get_Script.  
   
  If   you   know   the   prototype   of   the   javascript   function,   you   might   be   able   to   "override"   it   by   using   IDispatchEx     to   replace   the   property   with   your   IDispatch   implementation,   which   calls   the   original   javascript   function.    
   
  further   reading:  
  http://www.codeproject.com/com/dispexsinkconnector.aspTop

58 楼hot_blood2001()回复于 2007-02-01 16:18:14 得分 0

upTop

59 楼Iamfish(呆鱼)回复于 2007-02-04 22:11:34 得分 10

你是不是想在map.google.com下载卫片?  
  我觉得你需要转换一下思路。  
  人家用Flash实现的。我已经反编译出Action   Script,正在分析中。  
   
  http://www.flashearth.com/flash_earth.swfTop

60 楼asett1(asett1)回复于 2007-02-08 22:52:13 得分 0

Iamfish(呆鱼)   给的思路也很好啊。  
  我现在分析了部分firefox的源码,思路清晰多了,估计春节就可以提炼出一个强大的Javascript分析器:给定一个url,   提交后就可以下载到指定特征的img   或   其他媒体文件的返回字符串。  
  其实firefox关于javascript的解析不复杂,主要是它的实现框架。Top

61 楼asett1(asett1)回复于 2007-03-01 20:21:30 得分 0

试了老外的代码,已经不管用了。google   和hacker在玩猫捉老鼠的游戏。网上众多的下载软件也都不能下了。  
  看来还是我的思路保险:用hack的办法只能管一会,不能管时间长。google会不停的变换加密算法的。但不管怎么变换,还是得让browser观看啊。  
   
   
   
   
  Top

62 楼asett1(asett1)回复于 2007-03-27 22:19:37 得分 0

经过几个月不懈的努力,终于成功实现了全部功能,可以下载并自动合成超大的google卫星图片了,  
  可以达到80000*60000大小   Jpeg格式,并没有上限。下一步,准备实现智能自动探索城市范围,以及  
  配套的看图软件,这么大的图片可是一打开就死机的。  
  自动探索城市范围可以自动发现一些军事基地啥的,google会在很多偏僻的地方提供大图,而这些很难用人工发现的。  
   
  软件效率也经过优化,运行时内存不超过20M,即使合成超大图片的时候,还可以进一步利用显卡加速。  
  这么个小软件,用到的技术和技巧,足以写一本非常综合的编程书籍。  
   
  最后,感谢各位提供的思路,回过头来才发现你们的建议是多么有效。  
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:asett1
  • antshome
  • qiujian5628
  • lion_wing
  • lion_wing
  • lion_wing
  • gangjh
  • gangjh
  • gangjh
  • lion_wing
  • lion_wing
  • lion_wing
  • DarknessTM
  • masterz
  • jiangsheng
  • Iamfish

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo