当前位置: 首页 > news >正文

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

在用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.TickIf Gethtmel ThenDim bb As HtmlElementbb = FindHtmlElement("all_jzts", ExtendedWebBrowser1.Document, "div", "id", True)If Not bb Is Nothing Then'WriteRunLog("Style :  " + bb.Style)WriteRunLog(bb.OuterHtml)ElseWriteRunLog("all_jzts没找到")End Ifbb = FindHtmlElement("jzts", ExtendedWebBrowser1.Document, "div", "id", True)If Not bb Is Nothing Then'WriteRunLog("Style :  " + bb.Style)WriteRunLog(bb.OuterHtml)ElseWriteRunLog("jzts没找到")End If'Gethtmel = FalseEnd 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)TryDim i, k As IntegerFindHtmlElement = NothingFindHtmlElementOfDocument = docIf doc Is Nothing Then  '2023.11.15在递归调用中,因为有些iFrames还未真正加载,从而导致传入的doc = doc.Window.Frames.Item(k).Document 为 Nothing ,从而引发异常:未将对象引用设置到对象的实例。Exit FunctionEnd IfIf LCase(cGetAttribute) = "innertext" Then  'InnerText必须严格匹配,否则找到的结果是错误的。’StrictMatching = TrueEnd IfIf cTagName <> "" ThenDim EE As HtmlElementCollection = doc.GetElementsByTagName(cTagName)For i = 0 To EE.Count - 1If InStr(EE.Item(i).GetAttribute(cGetAttribute), FindText) > 0 _And (Not StrictMatching Or InStr(FindText, EE.Item(i).GetAttribute(cGetAttribute)) > 0) ThenFindHtmlElement = EE.Item(i)'WriteRunLog("Loop1")'WriteRunLog("FindHtmlElement结束0")Exit Function                       '找到就退出End IfNextElseFor i = 0 To doc.All.Count - 1If 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)) ThenFindHtmlElement = doc.All.Item(i)'WriteRunLog("Loop1")'WriteRunLog("FindHtmlElement结束0")Exit Function                       '找到就退出End IfNextEnd 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).DocumentFindHtmlElement = FindHtmlElement(FindText, doc.Window.Frames.Item(k).Document, cTagName, cGetAttribute, StrictMatching)If Not FindHtmlElement Is Nothing Then  '找到就退出循环'WriteRunLog("FindHtmlElement结束1")Exit FunctionEnd IfNextCatch ex As ExceptionFindHtmlElement = NothingWriteRunLog("FindHtmlElement发生异常:" + ex.Message)End TryEnd FunctionSub WriteRunLog(ByVal MyMsg As String)'Using w As StreamWriter = File.AppendText("RunLog.txt")Dim w As StreamWriterIf File.Exists("RunLog.txt") ThenIf My.Computer.FileSystem.GetFileInfo("RunLog.txt").Length > 10485760 Then  '2017.5.4 文件大于10M,清0w = File.CreateText("RunLog.txt")w.Write("文件大于10M,置0从头开始!")w.Write(Chr(9))Elsew = File.AppendText("RunLog.txt")End IfElsew = File.CreateText("RunLog.txt")End Ifw.Write(Now)w.Write(Chr(9))     '插入Tab键w.WriteLine(MyMsg)w.Flush()w.Close()'End UsingEnd Sub

相关文章:

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

在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

自建ES6.2.4切阿里云商业版ES(7.10)整体方案

一、切换目的&阿里云商业版ES版本选择 1.1 升级切换阿里云商业版7.10目的 自建的Elasticsearch服务运维难度高,操作复杂,需要手动调整资源,遇到性能瓶颈时优化难度相对云上Elasticsearch较大。使用阿里云提供的ES服务,提高系统稳定性使用云服务es,易于备份,数据恢复…...

Vue实现封装自定义指令

目录 一、什么是自定义指令&#xff1f; 二、自定义指令的使用 Vue中的自定义指令使用Vue.directive函数进行定义。该函数接受两个参数&#xff0c;第一个是指令名称&#xff0c;第二个是指令选项对象。 上述代码中&#xff0c;我们定义了一个名为my-directive的自定义指令…...

<MySQL> 查询数据进阶操作 -- 聚合查询

目录 一、聚合查询概述 二、聚合函数查询 2.1 常用函数 2.2 使用函数演示 2.3 聚合函数参数为*或列名的查询区别 2.4 字符串不能参与数学运算 2.5 具有误导性的结果集 三、分组查询 group by 四、分组后条件表达式查询 五、MySQL 中各个关键字的执行顺序 一、聚合查询…...

arm开发板

一个简单的hello world程序 minicom用来和开发板之间交互并且可以向开发板传输文件。打印hello world字符串。在linux虚拟机上编译我的代码&#xff0c;使用的交叉编译工具是arm-linux-gnueabihf-gcc (hard float) 可以使用 readelf -h libc.so.6 查看开发板是不是&#xff08…...

nodejs+vue教室管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户 用户管理&#xff1a;查看&#xff0c;修改自己的个人信息 教室预约&#xff1a;可以预约今天明天的教室&#xff0c;按着时间段预约&#xff08;可多选&#xff09;&#xff0c;如果当前时间超过预约时间段不能预约该时间段的教室 预约教室的时候要有个预约用途&#xff…...

rabbitMQ的Topic模式的生产者与消费者使用案例

topic模式 RoutingKey 按照英文单词点号多拼接规则填充。其中消费者匹配规则时候 * 代表一个单词&#xff0c;#表示多个单词 消费者C1的RoutingKey 规则按照*.orange.* 匹配 绑定队列Q1 package com.esint.rabbitmq.work05;import com.esint.rabbitmq.RabbitMQUtils; import …...

【软考篇】中级软件设计师 第五部分

中级软件设计师 第五部分 三十六. 下午题变动题型参考答案例题一 如何保持数据流图平衡例题二 结构化语言例题三 关系模式例题四 用例关系内涵例题五 观察者模式 三十七&#xff1a;下午题第四题往年算法部分参考答案 读前须知&#xff1a; 【软考篇】中级软件设计师 学前须知 …...

论文阅读——RetNet

transformer的问题&#xff1a;计算量大&#xff0c;占用内存大&#xff0c;不好部署。 所以大家在找能解决办法&#xff0c;既能和transformer表现一样好&#xff0c;又能在推理阶段计算复杂度很低。 这些方法大概分类三类&#xff1a;一是代替transformer非线性注意力机制的…...

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温度…...

【工具使用-VScode】设置 VSCode 的自动保存功能

要设置 VSCode 的自动保存功能&#xff0c;请按照以下步骤进行操作&#xff1a; 打开 VSCode 编辑器。在顶部菜单中选择 “文件&#xff08;File&#xff09;”。选择 “首选项&#xff08;Preferences&#xff09;”。在下拉菜单中选择 “设置&#xff08;Settings&#xff0…...

常用Git命令记录

持续补充… git add&#xff1a;提交到暂存区git remote add <remote_name> <remote_url> : 添加一个新的远程仓库。指定一个远程仓库的名称和 URL&#xff0c;将其添加到当前仓库中。git commit&#xff1a;暂存区提交到本地仓库&#xff1b;-m&#xff1a;添加日…...

Go语言常用库

Go语言常用库 文本主要介绍Go常用的一些系统库&#xff1a; sort、math、copy、strconv、crypto 1、sort package mainimport ("fmt""sort" )// sort // int排序 // sort.Ints([]int{}) // 字符串排序 // sort.Strings([]string{}) // 自定义排序 // s…...

二叉树(进阶)

文章目录 1.内容安排说明2. 二叉搜索树2.1二叉搜索树的概念2.2二叉搜索树的实现2.3二叉树的性能&#xff1a; 搜索二叉树的应用k 模型kv模型 1.内容安排说明 二叉树在前面c数据结构阶段&#xff1b;已经讲过了&#xff1b;本节取名二叉树进阶的原因是&#xff1a; 1.map和set特…...

Flink之OperatorState

在Flink中状态主要分为三种: Operator State(算子状态)Keyed State(键控状态)Broadcast State(广播状态) 这里简单介绍一下Operator State的使用,说到使用State就必然要使用到Flink的容错机制也就是Checkpoint.具体内容见代码注解 数据源 这里选用Socket作为Source输入,便于…...

Python集成学习和随机森林算法

大家好&#xff0c;机器学习模型已经成为多个行业决策过程中的重要组成部分&#xff0c;然而在处理嘈杂或多样化的数据集时&#xff0c;它们往往会遇到困难&#xff0c;这就是集成学习&#xff08;Ensemble Learning&#xff09;发挥作用的地方。 本文将揭示集成学习的奥秘&am…...

代码随想录算法训练营第二十四天| 77 组合

目录 77 组合 暴力 减枝优化 77 组合 暴力 class Solution {List<List<Integer>>res new ArrayList<>();LinkedList<Integer>newList new LinkedList<>();public List<List<Integer>> combine(int n, int k) {dfs(n,k,1);r…...

el-dialog element-ui弹窗

bulkImport.vue 自定义组件 <template> <el-dialog :visible"modalVisible" title"批量导入" centered close"$emit(close)" :fullscreen"true"> <span>弹窗内容</span> <span slot"foot…...

计算机网络的发展

目录 一、计算机网络发展的四个阶段 1、第一阶段&#xff1a;面向终端的计算机网络&#xff08;20世纪50年代&#xff09; 2、第二阶段&#xff1a;计算机—计算机网络&#xff08;20世纪60年代&#xff09; 3、第三阶段&#xff1a;开放式标准化网络&#xff08;20世纪70年…...

官宣!Wayland正式支持基于IntelliJ的IDE

对于基于IntelliJ IDE的Linux用户来说&#xff0c;一项令人期待的进步即将到来 – 对 Wayland 显示服务器协议的支持。 这项更新将带来许多好处&#xff0c;包括解决古老的分数缩放问题以及在与适用于 Linux 的 Windows 子系统 (WSLg)&#xff08;在底层运行 Wayland 服务器&am…...

资深大模型工程师详细讲解:RAG召回率优化三重微调实战

✅ 一、核心策略再解构&#xff1a;从“三层次”到“五维协同链路”原有“数据-索引-查询”三层结构非常精准&#xff0c;但为了更贴近企业级复杂场景&#xff0c;我们进一步抽象为 五维协同链路&#xff1a;维度关键目标是否可微调微调切入点1. 数据生成质量构建高质量正负样本…...

【Python 3.14 JIT性能调优权威指南】:20年CPython核心开发者亲授3大接入瓶颈突破法

第一章&#xff1a;Python 3.14 JIT编译器的演进脉络与接入价值Python 3.14 引入了实验性但高度集成的内置 JIT&#xff08;Just-In-Time&#xff09;编译器&#xff0c;标志着 CPython 运行时首次在官方发行版中提供可生产级启用的动态编译能力。该 JIT 并非独立运行时或第三方…...

ai辅助tomcat调优:用自然语言指令让快马生成专业级服务器配置

最近在准备一个Spring MVC项目的上线&#xff0c;作为后端负责人&#xff0c;Tomcat的调优配置成了我的重点工作。传统的手动配置不仅耗时&#xff0c;还容易遗漏关键参数。这次尝试了用AI辅助开发的方式&#xff0c;通过自然语言描述需求&#xff0c;让InsCode(快马)平台直接生…...

PPTist:4大突破性功能重塑Web端演示文稿创作体验

PPTist&#xff1a;4大突破性功能重塑Web端演示文稿创作体验 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for the…...

2026AI大模型入门学习教程(建议收藏),大模型入门学习路线,非常详细看这一篇就够了!

一、LLM Fundamentals 基础 1. 机器学习的数学基础 在掌握机器学习之前&#xff0c;理解支撑这些算法的基本数学概念非常重要。 线性代数&#xff1a;这是理解许多算法&#xff08;特别是深度学习算法&#xff09;的关键。主要概念包括向量、矩阵、行列式、特征值和特征向量、…...

网络钓鱼攻击特征识别与多维度防御技术研究

摘要 网络钓鱼是当前最普遍、危害最突出的网络安全威胁类型&#xff0c;攻击者依托伪造邮件、短信、社交信息与虚假网站&#xff0c;结合社会工程学手段诱导用户泄露敏感数据或执行恶意操作&#xff0c;对个人信息安全与机构运行稳定构成持续威胁。本文以网络钓鱼攻击机理、典型…...

CA6140车床杠杆831009钻M6孔夹具设计全套带图

CA6140车床作为机械加工领域的经典设备&#xff0c;其杠杆零件&#xff08;编号831009&#xff09;的加工精度直接影响整机性能。针对该零件M6螺纹孔的加工需求&#xff0c;专用夹具的设计需兼顾定位稳定性、操作便捷性与加工经济性。通过分析零件结构可知&#xff0c;杠杆两端…...

PyTorch 2.8镜像实战解析:RTX 4090D上Stable Video Diffusion推理提速实测

PyTorch 2.8镜像实战解析&#xff1a;RTX 4090D上Stable Video Diffusion推理提速实测 1. 镜像环境深度解析 1.1 硬件适配优化方案 这个PyTorch 2.8镜像针对RTX 4090D显卡进行了全方位优化&#xff0c;就像给赛车手量身定制了高性能装备。24GB显存的设计让大模型推理不再捉襟…...

AI辅助开发:描述需求即可自动生成流程图,比手动visio下载更智能

最近在做一个用户系统的设计&#xff0c;需要画登录注册的流程图。以前用Visio这类工具时&#xff0c;经常要手动拖拽各种图形、调整连线&#xff0c;特别费时间。这次尝试了用AI辅助生成&#xff0c;发现效率提升太多了&#xff01; 需求解析环节 我把需求描述成一段自然语言&…...

Qwen3-14B镜像深度解析:内置权重+FlashAttention-2+PyTorch 2.4优化

Qwen3-14B镜像深度解析&#xff1a;内置权重FlashAttention-2PyTorch 2.4优化 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是专为RTX 4090D 24GB显存环境优化的开箱即用解决方案。这个镜像最大的特点是将模型权重、运行环境和优化组件全部预装完成&#xff0c;用户无需处理…...