VB.net WebBrowser网页元素抓取分析方法

news2024/11/30 12:38:00

在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化,从而判断数据加载完毕呢?用IE开发者工具是不可能抓取到的,太快了。(当然,设置足够长的延时,也是可以实现的,只是不够科学及稳妥,毕竟有时因为网络原因,数据加载时间可能超过原来设定时间,其次,设置延时过长也导致程序不够友好)

实现的办法:

1、先用“系统处理中”查找(泛查找),并在找到html中,再细找缩小html元素范围。

bb = FindHtmlElement("系统处理中", ExtendedWebBrowser1.Document, "", "InnerText", false)

2、添加一个Timer控件,设定100毫秒。根据 1中找到的元素,进行不断抓取,并将抓到的结果输出到文本。

3、将2中输出,导入Excel,进行筛选,并从中找到重复次数少的行,便是数据加载、加载完成之间的变化。

Private Sub TimerProgress_Tick(sender As Object, e As EventArgs) Handles TimerProgress.Tick

       If Gethtmel Then

           Dim bb As HtmlElement

           bb = FindHtmlElement("all_jzts", ExtendedWebBrowser1.Document, "div", "id", True)

           If Not bb Is Nothing Then

               'WriteRunLog("Style :  " + bb.Style)

               WriteRunLog(bb.OuterHtml)

           Else

               WriteRunLog("all_jzts没找到")

           End If

           bb = FindHtmlElement("jzts", ExtendedWebBrowser1.Document, "div", "id", True)

           If Not bb Is Nothing Then

               'WriteRunLog("Style :  " + bb.Style)

               WriteRunLog(bb.OuterHtml)

           Else

               WriteRunLog("jzts没找到")

           End If

           'Gethtmel = False

       End If

       '系统处理中,请稍候...

       Application.DoEvents()

   End Sub
 Function FindHtmlElement(ByVal FindText As String, ByVal doc As HtmlDocument, ByVal cTagName As String, ByVal cGetAttribute As String, Optional ByVal StrictMatching As Boolean = False) As HtmlElement

       'cTagName:检索具有指定 html 标记的元素,标记需要输入完整的,缺省时查找所有。

       '例如:<input class="button" type="submit" value=提交 style="cursor:hand">,不能只输入"i",需要输入"input"

       'cGetAttribute :比较的属性类型,取值为:Id、InnerText、Name、title、classname、value、

       'Id、InnerText可以通过GetAttribute获取,也可以通过HtmlElement.Id、HtmlElement.InnerText获取,所以代码简化为用GetAttribute获取。

       'doc:WebBrowserExt1.Document

       'GetAttribute("classname")   '例如显示class="commonTable"的值commonTable

       'StrictMatching:True严格匹配FindText

       'WriteRunLog("FindHtmlElement开始:" + FindText)

       Try

           Dim i, k As Integer

           FindHtmlElement = Nothing

           FindHtmlElementOfDocument = doc

           If doc Is Nothing Then  '2023.11.15在递归调用中,因为有些iFrames还未真正加载,从而导致传入的doc = doc.Window.Frames.Item(k).Document 为 Nothing ,从而引发异常:未将对象引用设置到对象的实例。

               Exit Function

           End If



           If LCase(cGetAttribute) = "innertext" Then  'InnerText必须严格匹配,否则找到的结果是错误的。

               ’StrictMatching = True

           End If



           If cTagName <> "" Then

               Dim EE As HtmlElementCollection = doc.GetElementsByTagName(cTagName)

               For i = 0 To EE.Count - 1

                   If InStr(EE.Item(i).GetAttribute(cGetAttribute), FindText) > 0 _

             And (Not StrictMatching Or InStr(FindText, EE.Item(i).GetAttribute(cGetAttribute)) > 0) Then



                       FindHtmlElement = EE.Item(i)

                       'WriteRunLog("Loop1")

                       'WriteRunLog("FindHtmlElement结束0")

                       Exit Function                       '找到就退出

                   End If

               Next

           Else

               For i = 0 To doc.All.Count - 1

                   If InStr(doc.All.Item(i).GetAttribute(cGetAttribute), FindText) > 0 _

               And (Not StrictMatching Or InStr(FindText, doc.All.Item(i).GetAttribute(cGetAttribute)) > 0) And (cTagName = "" Or LCase(cTagName) = LCase(doc.All.Item(i).TagName)) Then

                       FindHtmlElement = doc.All.Item(i)

                       'WriteRunLog("Loop1")

                       'WriteRunLog("FindHtmlElement结束0")

                       Exit Function                       '找到就退出

                   End If

               Next

           End If

           '上面没找到,进行递归调用,递归会查找所有嵌套的Frame。

           For k = 0 To doc.Window.Frames.Count - 1

               'If k = 0 Then

               '    WriteRunLog("递归调用 doc.Window.Frames.Count:" + doc.Window.Frames.Count.ToString)     'For Test

               'End If

               '2018.3.14 直接 递归调用

               'WriteRunLog("递归调用:" + Str(k))

               ' WriteRunLog("doc.Window.Frames.Item(k).Name:" + doc.Window.Frames.Item(k).Name)

               FindHtmlElementOfDocument = doc.Window.Frames.Item(k).Document

               FindHtmlElement = FindHtmlElement(FindText, doc.Window.Frames.Item(k).Document, cTagName, cGetAttribute, StrictMatching)

               If Not FindHtmlElement Is Nothing Then  '找到就退出循环

                   'WriteRunLog("FindHtmlElement结束1")

                   Exit Function

               End If

           Next

       Catch ex As Exception

           FindHtmlElement = Nothing

           WriteRunLog("FindHtmlElement发生异常:" + ex.Message)

       End Try

   End Function


 Sub WriteRunLog(ByVal MyMsg As String)

       'Using w As StreamWriter = File.AppendText("RunLog.txt")

       Dim w As StreamWriter

       If File.Exists("RunLog.txt") Then

           If My.Computer.FileSystem.GetFileInfo("RunLog.txt").Length > 10485760 Then  '2017.5.4 文件大于10M,清0

               w = File.CreateText("RunLog.txt")

               w.Write("文件大于10M,置0从头开始!")

               w.Write(Chr(9))

           Else

               w = File.AppendText("RunLog.txt")

           End If

       Else

           w = File.CreateText("RunLog.txt")

       End If

       w.Write(Now)

       w.Write(Chr(9))     '插入Tab键

       w.WriteLine(MyMsg)

       w.Flush()

       w.Close()

       'End Using

   End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1215522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringJDBC模板类JdbcTemplate

Spring JdbcTemplate使用JdbcTemplate完成增删改查环境准备新增修改删除查询一个对象批量添加批量修改和批量删除使用德鲁伊连接池&#xff08;之前数据源是用我们自己写的&#xff09; JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类&#xff0c;是对JDBC的封装&…

c语言-浅谈指针(2)

文章目录 1.数组名的理解2.使用指针访问数组3.一维数组传参的本质4.二级指针5.指针数组 本篇文章是关于数组与指针的&#xff0c;在上一篇指针内容的基础上进一步了解指针 1.数组名的理解 我们先来了解一个知识点&#xff1a;在给指针变量赋值时&#xff0c;数组用数组名赋给指…

光伏仪器-1763卫星帆板电源阵列模拟器

01 1763卫星帆板电源阵列模拟器 产品综述&#xff1a; 1763卫星帆板电源阵列模拟器用于解决卫星电源系统研制等帆板电源阵列及二次供电设备的测量和分析&#xff0c;解决电源分系统功能验证、现场试验等无法使用真实的帆板电源等带来的难题&#xff0c;用于卫星或卫星测试系…

顺序理清linux下的环境变量

文章目录 关于环境变量概念&#xff08;了解&#xff09;例引 环境变量 查看环境变量的方法echo && printenv 命令 环境变量的配置.bash_profile 常见 环境变量通过程序获取环境变量本地变量环境变量表 关于环境变量 概念&#xff08;了解&#xff09; 环境变量的概念…

有什么进销存软件,比较适合零售行业日常开单要求及库存记录?

本文将为大家总结一下对于进销存软件要求&#xff1a; 基础功能&#xff1a;可以日常开单、退换货处理、出入库进阶功能&#xff1a;电脑、手机数据同步&#xff0c;保障数据安全&#xff0c;可进行数据分析 其实无论是小型创业公司&#xff0c;还是一家大型企业&#xff0c;…

为什么SSL证书会有序列号

SSL证书中的序列号是为了唯一标识该证书。他是用于识别和跟踪证书的唯一标识符。以确保每个证书都具有唯一的值。 有序列号的原因如下&#xff1a; 唯一性&#xff1a;通过序列号&#xff0c;可以确保每个ssl证书都有一个独特的标识符。这对于区分不同的证书非常重要。 跟踪和…

tsconfig.json无法写入文件“XXXX“因为它会覆盖输入文件

在开发ts项目的时候&#xff0c;包错提示无法写入文件&#xff1a; tsconfig.json无法写入文件"XXXX"因为它会覆盖输入文件 这是tsconfig.json文件配置问题&#xff0c;需要加入下面的配置就好了&#xff1a; {"compilerOptions": {"outDir": …

教育案例分享 | 安全狗云安全体系为高校提升立体化纵深防御能力

一、客户情况 某高校有服务器500台&#xff0c;对外站点200个&#xff0c;核心交换流量20G。 二、客户痛点 校园网系统分类较多&#xff0c;并且每类网站中安全级重要程度又各不相同&#xff0c;同时有多个网络出口(如&#xff1a;教育网、电信网、移动网等)&#xff0c;二级学…

常见JMeter面试题

1、什么是JMeter&#xff1f; JMeter是一种开源的性能测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;如Web应用程序、数据库、FTP服务器等。 2、JMeter可以测试哪些类型的应用&#xff1f; JMeter可以测试各种类型的应用程序&#xff0c;包括Web应用程序、数…

【知网会议征稿】第三届社会科学与人文艺术国际学术会议 (SSHA 2024)

第三届社会科学与人文艺术国际学术会议 (SSHA 2024) 2024 3rd International Conference on Social Sciences and Humanities and Arts 第三届社会科学与人文艺术国际学术会议 (SSHA 2024)于2024年3月1-3日在中国福州举行。会议旨在为从事“社会科学”与“人文艺术”研究的专…

【C++&数据结构】二叉树(结合C++)的经典oj例题 [ 盘点&全面解析 ](24)

前言 大家好吖&#xff0c;欢迎来到 YY 滴数据结构系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴 数据结构 专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.二叉树创建字符串1…

.NET 7 创建Android项目 (拥有原生的界面设计能力,比MAUI更好的性能)

vs2022默认移动开发使用的是maui项目模板&#xff0c;maui确实有很多亮点&#xff0c;就是对比android原生项目性能还需要优化&#xff0c;特别是启动app时无法达到秒开。后来发现vs2022中依然可以直接创建android项目&#xff0c;性能和原生Android基本一致。 1、搜索模板 dot…

办理的流量卡怎么判断是否激活成功?看实名认证还是看充值?

很多朋友可能都会有一个疑问&#xff0c;在网上购买的流量卡怎么才算是激活成功呢&#xff1f;是实名之后就算激活成功&#xff0c;还是需要充值使用才算激活成功呢&#xff1f;这篇文章带大家一块儿来了解一下。 ​  可能很多朋友都会有一个疑问&#xff0c;当你收到流量卡&…

Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

Leetcode刷题详解——被围绕的区域

1. 题目链接&#xff1a;130. 被围绕的区域 2. 题目描述&#xff1a; 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&#xff1a;board [["…

漏洞分析 | 漏洞调试的捷径:精简代码加速分析与利用

0x01前言 近期&#xff0c;Microsoft威胁情报团队曝光了DEV-0950&#xff08;Lace Tempest&#xff09;组织利用SysAid的事件。随后&#xff0c;SysAid安全团队迅速启动了应急响应&#xff0c;以应对该组织的攻击手法。然而&#xff0c;在对漏洞的分析和复现过程中&#xff0c…

rabbitmq 集群搭建

RabbitMQ集群介绍 RabbitMQ集群是一组RabbitMQ节点&#xff08;broker&#xff09;的集合&#xff0c;它们一起工作以提供高可用性和可伸缩性服务。 RabbitMQ集群中的节点可以在同一物理服务器或不同的物理服务器上运行。 RabbitMQ集群的工作原理是&#xff0c;每个节点在一个…

语音识别芯片NRK3301在智能茶吧机的应用

传统的饮水机传大多只能提供热水和冷水&#xff0c;而智能茶吧机则是一款集合了热饮水机、煮茶器、泡茶壶等多种功能于一体的多功能生活电器。它不仅具备了传统饮水机的所有功能&#xff0c;还可以根据不同的需求&#xff0c;提供多种水温的饮水方式&#xff1b;还具备了煮茶和…

打开IE浏览器

原文地址&#xff1a;https://www.xiaoheiwoo.com/windows-11-internet-explorer/#:~:text%E5%A6%82%E4%BD%95%E5%9C%A8%20Windows11%20%E4%B8%AD%E5%90%AF%E7%94%A8%20IE%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%843%E7%A7%8D%E6%96%B9%E6%B3%95%201%20%E6%96%B9%E6%B3%95%E4%B8%80…

系列九、对象的生命周期和GC

一、堆细分 Java堆从GC的角度还可以细分为&#xff1a;新生代&#xff08;eden【伊甸园区】、from【幸存者0区】、to【幸存者1区】&#xff09;和老年代。 二、MinorGC的过程 复制>清空》交换 1、eden、from区中的对象复制到to区&#xff0c;年龄1 首先&#xff0c;当eden区…