日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取含跨域网址的框架网页的源码

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取含跨域网址的框架网页的源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面介紹過的獲取框架網頁的源碼的方法在針對框架中每個文檔的URL都是和主網頁在同一個域名(同一個網站)的情況下是不會出什么問題的,但如果框架包含的網頁是別的域的話,例如以下網頁:該網頁含左右兩個框架,都包含別的域的網址,該網頁源碼如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>框架網頁</title>
</head>
<frameset cols="*,*" frameborder="no" border="0" framespacing="0">
? <frame src="http://www.baidu.com" name="leftFrame" id="leftFrame" title="leftFrame" />
? <frame src="http://www.google.cn" name="mainFrame" id="mainFrame" title="mainFrame" />
</frameset>
<noframes><body>
</body>
</noframes></html>
?

如果使用以下的代碼獲取這兩個框架的網頁源碼:?

procedure?TForm1.Button1Click(Sender: TObject);
var
? doc, framedoc: IHTMLDocument2;
? frame_dispatch: IDispatch;
? ole_index: OleVariant;
? i: Integer;
begin
? doc :=?WebBrowser1.Document?as?IHTMLDocument2;
??if?doc =?nil then?Exit;
??for?i := 0?to?doc.frames.length - 1?do
??begin
??? ole_index := i;
??? frame_dispatch := doc.frames.item(ole_index);
????if?frame_dispatch =?nil then?Continue;
??? framedoc := (frame_dispatch?as?IHTMLWindow2).document;
????if?framedoc =?nil then?Continue;
??? ShowMessage(framedoc.body.innerHTML);
??end;
end;
?

執行這段代碼,系統會彈出“拒絕訪問”的出錯對話框,沒有任何商量的余地。怎么辦,框架網頁的源碼還是要獲取的,不會因為跨域問題而放棄的。只有百度一下了,幾番搜索,終于找到了另一種獲取網頁源碼的方法,而這種方法可以解決跨域問題,方法如下:

1. 單元引用 Uses?MsHtml, ActiveX

2. 代碼:

procedure TForm1.Button1Click(Sender: TObject);
var
? i: Integer;
? ole_index: OleVariant;
? FrameDis: IDispatch;
? FrameWin: IHtmlWindow2;
? psi:IServiceProvider;
? frameb: IWebBrowser2;
? pPersist: IPersistStreamInit;
? ss: TStringStream;
? str1, str2: String;
begin
? if WebBrowser1.Busy then Exit;
? Memo1.Lines.Clear;
??//獲取主網頁網址
? Memo1.Lines.Add(WebBrowser1.OleObject.document.url);
??//獲取主網頁源碼
? Memo1.Lines.Add(WebBrowser1.OleObject.document.documentElement.outerHTML);
??//添加空行
? Memo1.Lines.Add(' ');

? for i := 0 to WebBrowser1.OleObject.document.frames.length - 1 do
? begin
??? ole_index := i;
??? FrameDis := (WebBrowser1.Document as IHtmlDocument2).frames.item(ole_index);
??? FrameDis.QueryInterface(IID_IHTMLWindow2, FrameWin) ;
??? if FrameWin = nil then Continue;
??? FrameWin.QueryInterface(IServiceProvider, psi);
??? if psi = nil then Continue;
??? psi.QueryService(IID_IWebBrowserApp,IID_IWebBrowser2,frameb);
??? if frameb=nil then continue;
??? frameb.Document.QueryInterface(IPersistStreamInit, pPersist);
??? if pPersist = nil then Continue;
????//獲取框架頁網址
??? Memo1.Lines.Add((frameb.Document as IHtmlDocument2).url);
??? ss := TStringStream.Create('');
??? try
??????//獲取框架頁源碼
????? if Succeeded(pPersist.Save(TStreamAdapter.Create(ss), True)) then
????? begin
??????? str1 := ss.DataString;
??????? str2 := Utf8ToAnsi(str1);?//有些網頁使用UTF-8編碼方式,不進行轉換中文會亂碼
??????? if str2 = '' then
????????? Memo1.Lines.Add(str1)
??????? else
????????? Memo1.Lines.Add(str2);
????? end;
??? finally
????? FreeAndNil(ss);
??? end;
??? Memo1.Lines.Add(' ');?//添加空行
? end;
end;

總結

以上是生活随笔為你收集整理的获取含跨域网址的框架网页的源码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。