放1000分,高手进来动手试试:如何提取AJAX里的HTML内容?
就拿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&v=13&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&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&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




