基于Internet Explorer内核的网页信息抓取程序

本文档详细介绍了基于Internet Explorer内核开发网页信息抓取程序的过程,包括为何选择IE内核、开发环境的搭建、如何利用WebBrowser控件及IE提供的接口进行网页加载状态判断和元素信息获取,以及延时读取和超时退出的策略。程序旨在为项目提供详尽的HTML源代码和网页元素信息,并具备良好的通用性和适应性。
摘要由CSDN通过智能技术生成

程序开发背景

  本程序来源于我们项目组最近正在开发的一个开源项目——网页分块工具。其目的是作为一个底层的信息抽取模块,为后期分析提供尽可能详尽的分块线索,包括尽可能完整的HTML源代码和网页元素的位置、颜色、字体、背景色等信息。程序还 要具有较好的适应性,能够支持多种网页,而事实上很多网页都是不标准的。从通用性考虑,程序应该能够支持多种应用,而不仅限于网页分块。

 

预期目标分析

  程序应达到以下几点设计要求:

  • 能够指定要处理的网页的URL。
  • 能够为HTML源代码添加附件信息,如元素位置。
  • 对于JavaScript等动态脚本具有良好的解析能力。
  • 通过命令行调用,提供良好的通用性。
  • 通过socket套接字返回HTML源代码。
  • 支持延时读取,保证抓取的成功率。
  • 支持超时退出,保证程序不会因为加载不成功而卡死。

 

使用IE内核的原因

  本程序的核心部分使用的是IE内核。至于为什么要基于IE内核,而不使用其他浏览器的内核,有以下几方面的原因:

  首先,firefox、google chrome等浏览器虽然是开放源代码的,但是其源代码的阅读难度相当大,想在短时间内弄明白是很困难的。

  其次,IE的相关开发文档比较完整,开发环境比较容易构建,开发起来更容易上手。

  最后,从网页的兼容性考虑,得益于IE的广泛的市场占有率,其兼容性明显要比其他浏览器要好很多,尽管对很多标准都支持得不是很好。

  综上,就可以确定本程序使用IE内核进行开发,实验证明,这个做法是正确的。

 

Internet Explorer的程序结构

  对于本程序来说,其中最重要的的就是网页内容处理层,所用到的接口也都位于mshtml.dll文件中。

Internet Explorer程序架构

 

开发环境

  系统:Windows XP

  IDE:Visual Studio 2005中文版

  IE版本:Internet Explorer 6

 

构建基于对话框的MFC程序

  运行visual studio 2005(c++),新建一个项目,选择MFC标签下的 “MFC应用程序”作为模板,填入项目名称,确定。此时会弹出一个向导,按照以下步骤操作:点击左侧的”应用程序类型”,选择”基于对话框”,”在静态库中使用MFC”(方便以后发布),其他保持默认即可。然后单击完成,程序会自动生成相应的类。

  切换到资源视图,依次展开,在DIALOG中找到以项目名称命名的对话框,双击打开。删除“确定”和“取消”按钮。在对话框窗口上单击右键,选择“插入activeX控件”。在新弹出的窗口中选择”Microsoft web 浏览器”,确定。调整好IE控件的位置后,在其上单击右键,选择“添加变量”,输入名称m_webBrowser。

  切换到解决方案视图,打开对话框的源文件,名称通常为***Dlg.cpp(***为项目名)。将下面的代码添加到对话框初始化函数OnInitDialog()中。

  LPCTSTR url = _T(“http://***”);

  m_webBrowser.Navigate(url,&vtEmpty,&vtEmpty,&vtEmpty,&vtEmpty);

 

如何确定WebBrowser控件中的网页加载完成

  当网页下载完成后,WebBrowser控件触发DocumentComplete 事件。通过在程序中添加响应DocumentComplete事件的程序,我们就可以在网页下载完成后对其进行分析和处理。

  添加事件处理程序的操作步骤如下:切换到资源视图,打开包含WebBrowser控件的对话框,在WebBrowser控件上单击右键,选择“添加事件处理程序”,然后在弹出的对话框中选择DocumentComplete消息,点击“添加编辑”以确认。

  WebBrowser控件触发DocumentComplete事件的ReadyState属性更改为 READYSTATE_COMPLETE时,这表示 WebBrowser 控件已完成下载网页。

  虽然通过响应DocumentComplete事件可以知道网页是否加载完成,但是有的网页触发了不止一次DocumentComplete事件,例如网易首页会从加载开始到完全加载完毕会激发二十多次DocumentComplete事件。出现这种情况的主要原因是:网页中包含JavaScript等动态脚本,而且有可能会改变网页元素的结构,当这些脚本完成解析后会触发DocumentComplete事件;如果网页是由多个frame框架组成的,每个框架中的网页加载完成也会触发DocumentComplete事件。

  针对第二种情况,微软给出了具体的解决方案,<http:

在Excel中,你可以使用Visual Basic for Applications (VBA) 来编写自动化脚本来抓取网页或其他文档中的特定信息。这通常涉及网络请求、HTML解析以及数据提取。以下是一个简单的例子,展示如何抓取网页上的表格数据: 1. **准备工作**: - 首先,确定你要抓取的数据位于哪个网页上,获取该网页的URL。 - 确定需要抓取的具体元素,如表格、段落等,了解它们在HTML代码中的结构。 2. **创建VBA模块**: 在Excel VBA编辑器(Alt + F11)中新建一个模块,编写以下代码: ```vba Sub WebScraper() Dim objIE As Object ' 使用Internet Explorer的对象 Dim htmlDoc As Object ' HTML文档对象 Dim url As String ' 被抓取网页的URL Dim tableDiv As String ' 表格所在的HTML标签(例如,class="data-table") Dim rows() As Variant ' 存储抓取数据的二维数组 Dim rowCounter As Integer ' 设置URL和表格标签 url = "http://example.com" ' 请替换为实际网址 tableDiv = "class='data-table'" ' 根据实际页面调整 ' 初始化浏览器对象 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = False ' 隐藏浏览器窗口 ' 访问网页并加载HTML objIE.Navigate url While objIE.Busy Or objIE.ReadyState <> 4 ' 当页面加载完成时 DoEvents Wend ' 解析HTML,找到表格 Set htmlDoc = objIE.Document Set dataTables = htmlDoc.getElementsByClassName(tableDiv) ' 检查是否找到表格 If Not IsNull(dataTables) Then For Each dataTable In dataTables ' 创建一个二维数组来存储数据 ReDim rows(1 To dataTable.Rows.Count, 1 To dataTable.Columns.Count) ' 提取并保存数据 rowCounter = 1 For Each row In dataTable.Rows For Each cell In row.Cells rows(rowCounter, columnIndex) = cell.innerText ' 需要根据实际HTML调整innerText 或者 .Text columnIndex = columnIndex + 1 Next cell rowCounter = rowCounter + 1 Next row Next dataTable Else MsgBox "未找到指定的表格!" End If ' 关闭浏览器 objIE.Quit ' 显示或处理抓取的数据 ' ... (在这里添加你的数据操作代码) End Sub ``` 3. **运行和调试**: 在VBA编辑器中,选中你的`WebScraper`函数并按F5运行。完成后,可以查看`rows`数组里的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值