獲取含跨域網址的框架網頁的原始碼
前面介紹過的獲取框架網頁的原始碼的方法在針對框架中每個文件的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;
相關文章
- QWebView獲取網頁原始碼WebView網頁原始碼
- 想獲取JS載入網頁的源網頁的原始碼,不想獲取JS載入後的資料JS網頁原始碼
- 用python寫個爬取指定網址上所有圖片,並能根據獲取到的圖片網址,進入網址,再次進行圖片獲取 的程式碼指令碼Python指令碼
- 防止跨域問題無法訪問網址跨域
- DukuanCMS_網址導航,導航網站,網址導航原始碼網站原始碼
- 通過網址獲取ES最近10分鐘的資料量
- JavaScript 獲取網頁尾本程式碼內容JavaScript網頁
- python3中編碼如何獲取網頁?Python網頁
- php獲取網頁內容的三種方法PHP網頁
- Qt(QtWebEngine)載入本地網頁跨域問題的總結QTWeb網頁跨域
- js/jq 獲取網頁寬高JS網頁
- W外鏈 短網址系統API 原始碼,網址縮短API介面API原始碼
- z-library映象地址,如何獲取最新網址(2024.10.20)
- python四種方式解析網頁獲取頁面中的連結Python網頁
- 網頁直播原始碼三種主流的開發領域你都知道嗎網頁原始碼
- vue專案中jsonp跨域獲取qq音樂首頁推薦VueJSON跨域
- 好看的404頁面html原始碼 網站404原始碼分享HTML原始碼網站
- vue 前端框架的網頁是否是不能用 js 和 jquery 獲取元素屬性或修改?Vue前端框架網頁JSjQuery
- 爬取外文工業技術期刊網頁原始碼(自用)網頁原始碼
- 127 PHP獲取網頁標題的3種實現方法程式碼例項PHP網頁
- Chrome 獲取網頁顏色(文字、圖片)Chrome網頁
- 個性網址導航原始碼,ThinkPHP網站導航原始碼兩套主題模板原始碼PHP網站
- 兒童攝影網-網頁原始碼全網頁原始碼
- Postman模擬瀏覽器網頁請求並獲取網頁資料Postman瀏覽器網頁
- 使用canvas儲存網頁為pdf檔案支援跨域Canvas網頁跨域
- 靜態網頁使用Node.js跨域代理服務網頁Node.js跨域
- Laravel 原始碼筆記 框架目錄命名的含義Laravel原始碼筆記框架
- 「無程式碼」高效的爬取網頁資料神器網頁
- JB的Python之旅-爬取phizhub網站(原始碼)Python網站原始碼
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(二)資源的獲取和釋放AQS原始碼
- 基於ThinkPHP開發的仿好123個性化網址導航網站原始碼PHP網站原始碼
- 獲取AOSP原始碼原始碼
- 可用的空白頁網址,自己用來自定義瀏覽器的起始頁.瀏覽器
- 常用指令碼:獲取隱含引數指令碼
- WKWebView 獲取網頁高度,圖片點選檢視,網頁連結點選WebView網頁
- 抓取網頁的含義和URL基本構成網頁
- Andriod 網路框架 OkHttp 原始碼解析框架HTTP原始碼
- Android 網路框架 Retrofit 原始碼解析Android框架原始碼
- 高仿短文學網原始碼 含手機端原始碼