前面介绍过的获取框架网页的源码的方法在针对框架中每个文档的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;

获取含跨域网址的框架网页的源码相关推荐

  1. 完全跨域的单点登录(SSO)解决方案源码解析

    为什么80%的码农都做不了架构师?>>>    本文介绍的是一种PHP的开源SSO解决方案,可完全跨域,实现较简洁,源码地址:https://github.com/legalthin ...

  2. HTML5期末大作业:电商购物网站设计——易购电商购物网页设计与实现(31页) 含论文+答辩+PPT 计算机毕设网页设计源码 HTML+CSS+JavaScript web课程设计网页规划与设计...

    HTML5期末大作业:电商网站设计--易购电商购物网页设计与实现(31页) 含论文+PPT 学生DW网页设计作业成品 HTML+CSS+JavaScript web课程设计网页规划与设计 计算机毕设网 ...

  3. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    阅读目录 一.Django请求生命周期: 二.WEB开发模式: 三.cbv源码分析: 四.认识RESTful 补充知识:跨域 五.基于原生django开发restful的接口 六.drf安装.使用.A ...

  4. 操作系统ppt_华为车BU王军:华为三大汽车操作系统,及跨域集成软件框架(内含PPT)...

    2020年8月13日-15日,"2020中国汽车论坛"在上海召开.该论坛是由中国汽车工业协会(CAAM)主办,世界汽车组织(OICA).世界经济论坛(WEF)支持.在8月14日举办 ...

  5. webbrowser抓取php网页源码,获取webbrowser控件 网页的源码(收藏)

    获取webbrowser控件 网页的源码(收藏) 翻译|其它|编辑:郝浩|2005-04-28 09:45:00.000|阅读 3152 次 概述: 我在网上找到使用rft控件保存webbrowse文 ...

  6. php 框架获取服务器,Thinkphp 框架基础之源码获取、环境要求与目录结构分析

    本文实例讲述了Thinkphp 框架基础之源码获取.环境要求与目录结构.分享给大家供大家参考,具体如下: 获取ThinkPHP 获取ThinkPHP的方式很多,官方网站(http://thinkphp ...

  7. 众多网页游戏源码素材一键即可获取

    上次给大家测评过手游的游戏源码素材,大家觉得怎么样呢?想必大家也在为找网游游戏源码素材而头疼吧,今天小编都为大家整理好咯,大家喜欢的可以先行收藏哈,之后会持续更新哒~ 爱给网 登录问题: QQ一键注册 ...

  8. 基于JAVA跨境电商网站计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA跨境电商网站计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA跨境电商网站计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  9. HTML5期末大作业:网上花店网站设计——简约的网上花店网站设计(4页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码

    HTML5期末大作业:网上花店网站设计--简约的网上花店网站设计(4页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网 ...

最新文章

  1. R语言bioconductor包—maftools的使用
  2. “数字化”才是智能制造的基础!
  3. java+enum+devicetype_JSF web编程:通过enum数组生成
  4. 互联网协议 — BGP 边界网关协议 — Overview
  5. 怎么强制限制div宽度
  6. 辅助方法 @Html.Raw与 HtmlString区别
  7. MFC命令行及CCommandLineInfo类
  8. mysql 临时索引_MYSQL临时表创建索引
  9. 菜单栏、工具栏、状态栏
  10. win7系统如何升级安装win11正式版,win7升级win11系统的方法
  11. JVM学习笔记 之 JVM概述
  12. 一些常用的MacBook快捷键
  13. 小说作者推荐:休屠城合集
  14. Unsupported major.minor version 52.0 解决方案
  15. 求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积(基础作业
  16. 基因数据处理104之SparkBWAMaster文件得到空文件,中间sam文件找不到
  17. 【2015年第4期】城市交通大数据技术及智能应用系统
  18. NOIP2016 天天爱跑步 线段树合并
  19. 联想微型计算机开机没反应,电脑开机没反应,教您怎么解决电脑开机没反应
  20. 打印设置自定义表尾_打印excel工作表时,如何把表头和表尾一起打印到每一页上?-excle怎样设置表尾打印...

热门文章

  1. Xcode7 beta 网络请求报错:The resource could not be loade
  2. Office Communication Server(OCS)2007 Communicator Web Access(CWA)的部署
  3. 结婚戒指为什么戴在无名指上的原因
  4. PHP + mysql 对日期的操作
  5. Golang之Go Module使用
  6. Django中的模型继承
  7. 顽石系列:Java技术面试
  8. oracle查看被锁的表以及解锁表
  9. Maven远程仓库:pom依赖以及jar包下载
  10. 文件上传到ubuntu -- WinSCP 登录ftp服务器