如何用excel vba操控IE在按下网页上的按钮?

 我来答
创作者DPGTTT9Ftl
推荐于2019-08-26 · TA获得超过3672个赞
知道小有建树答主
回答量:53
采纳率:100%
帮助的人:8504
展开全部

With IE

.navigate URL

.Visible = True

.document.forms(0).submit

End With

如果不是你想要的,说明目标网页不只有一个form,需要你去目标网页,点f12,找你想要的那个。当然你也可以通过更改forms(x)去一个个试,总能找到你要的那个。当然你也可以去找那个按钮的值,用按钮点击的方法。

ie.document.getElementById(按钮的值).click

ActiveSheet.WebBrowser1.Document.form1.Button1.Click

页面.webbrowser控件.网页.表单名.按钮名.点击

帐号已注销
2018-04-01 · TA获得超过25.9万个赞
知道小有建树答主
回答量:2206
采纳率:96%
帮助的人:82.9万
展开全部

一、前期准备

VBA并不能操作任意浏览器及网页,我们所能做的仅仅是对IE进行一些操作,就像Python用import、C#用using一样,VBA也需要引用一些库才能对IE进行操作,不过好在同属微软产品,所以我们能很简便的利用VBA自带的一些库。首先要做的就是在VBA中引用Micorsoft Internet Controls,看这个名字就知道是帮助我们控制IE页面用的。

1、打开网页

我们以在百度搜索“扯乎”关键词为例:

With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.baidu.com/s?wd=扯乎"
'关闭网页
'       .Quit
End With

代码很简单,先创建一个IE对象,然后给一些属性赋值。Visible是可见性,说的是在对网页进行操作时,这个网页是不是会被看见。熟练之后可以设置为False,不仅让程序在跑的时候有种神秘感(并没有),还能稍微加快一点速度。

不过有一点要记住,这个网页我们打开之后并没有关闭,也就是说程序结束后需要手动关闭,如果网页不可见是无法手动关闭的。代码中注释的部分就是关闭网页用的。Navigate不用多说就是URL。

我们必须要等网页完全加载完才能开始信息的抓取,这个时候使用到:(从这里开始,所有的代码都需要写在With代码块中)

While .ReadyState <> 4 Or .Busy
DoEvents
Wend

Busy是网页忙碌状态,ReadyState是HTTP的5种就绪状态,对应如下:

  • 0:请求未初始化(还没有调用 open())。

  • 1:请求已经建立,但是还没有发送(还没有调用 send())。

  • 2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。

  • 3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。

  • 4:响应已完成;您可以获取并使用服务器的响应了。

2、获取信息

我们先把页面中的所有内容抓下来,后期筛选出有用的部分再慢慢给抓取添加条件。

Set dmt = .Document
For i = 0 To dmt.all.Length - 1
Set htMent = dmt.all(i)
With ActiveSheet
.Cells(i + 2, "A") = htMent.tagName
.Cells(i + 2, "B") = TypeName(htMent)
.Cells(i + 2, "C") = htMent.ID
.Cells(i + 2, "D") = htMent.Name
.Cells(i + 2, "E") = htMent.Value
.Cells(i + 2, "F") = htMent.Text
.Cells(i + 2, "G") = htMent.innerText
End With
Next i

这块代码和JS有些相似,需要从IE.Document.all中把页面上所有节点找出来。这里也提供其他几种方法:

  • getElementById("IDName"):返回第一个内部标有IDName的标签

  • getElementsByName("a") :返回所有的<a>标签,返回值为集合

  • getElementsByClassName("css"):返回所有样式名称为css的标签,返回值为集合

  • 这些都是在抓取了全部页面内容后帮助筛选有效信息时使用起来比较方便的。当然all还是最好用的,因为all也存在all("IDName")以及all.IDName等等用法。

    上面代码部分返回的属性值都是HTML基本内容,就不一一解释了。

    3、填充信息

    网抓神器当然还是Python,大部分人使用Excel的目的还是在于对页面内容进行自动填充,直接让表格提交网页,问卷录入之类的工作都省心不少。在抓取了页面内容之后,想填充更加是易如反掌的事情,只需要直接给页面标签的Value属性赋值就可以了。

    不过网页中除了文本框,可能还存在一些其他没有Value的标签,比如:下拉菜单、单选框。给这些内容赋值就需要一些基本的HTML知识了。

  • '下拉菜单选择

  • .all("select")(0).Selected = True

  • '单选按钮选择

  • .all("radio").Checked = True

  • '复选按钮选择

  • .all("checkbox").Checked = True

  • 下拉菜单是select标签,每个选项都在一个option标签里,所以返回一个集合,需要选中某个选项就要修改对应的Selected属性为True。单选和复选按钮都是input标签,区别在于类型分别是radio和checkbox,要选中某个选项需要修改对应的Checked属性。

    三、数据接口

    有时候我们能直接拿到一些API,通过API返回数据当然比打开网页更方便快捷,所使用的方法也有一些不太一样。

    1、请求接口

    比如我从网上得到一个能通过城市查询免费WIFI的API,通过Excel接口访问就使用下面的代码:(虽然是免费的,为了避免麻烦还是把我的AppKey隐去了)

  •  Dim http

  •  Set http = CreateObject("Microsoft.XMLHTTP")

  •  http.Open "GET", "http://api.avatardata.cn/Wifi/QueryByCity", False

  •  http.setRequestHeader "CONTENT-TYPE", "application/x-www-form-urlencoded"

  •  http.send "key=[AppKey]&city=北京&page=1"

  • 这时我们创建的对象就不再是IE,而是HTTP对象。这里用的是ajax的Open方法,GET是数据发送方式,第二个参数是接口地址,第三个参数是指定请求方式是否为异步。如果这个API有帐号密码,分别写在第四第五个参数。

    setRequestHeader就是给接口发送一个HTTP协议头文件,最后send的内容是接口参数。当然,这个QueryString也可以直接写在URL里,send一个空字符串就可以了。

    2、接口返回

    接口返回获取的方式很简单:

  •  If http.Status = 200 Then Range("A1").Value = http.responseText

  • 这里的HTTP状态又变成200了,和之前说好的不一样啊摔~有兴趣可以自己查查具体有哪些。

    不过接口返回要么是JSON要么是XML,Excel处理起来十分不方便。这里提供一个处理JSON的方法,是从网上找来的类模块,具体内容放在附录里。在添加了这个clsJSON类模块后,对JSON的处理就变得十分简单了。

    将上面的代码改成:

  •  If http.Status = 200 Then

  •     Dim json$

  •     json = http.responseText

  •     Dim objJSON As New clsJSON, dicJSON As Object

  •     Set dicJSON = objJSON.parse(json)

  •    

  •     For i = 1 To dicJSON("result")("data").Count

  •       Sheet1.Cells(i + 1, 1) = dicJSON("result")("data")(i)("name")

  •       Sheet1.Cells(i + 1, 2) = dicJSON("result")("data")(i)("intro")

  •       Sheet1.Cells(i + 1, 3) = dicJSON("result")("data")(i)("address")

  •     Next i

  •  End If

  • 接口返回的示例我也放在附录里了,根据接口返回的对象名、数组名去修改dicJSON后面的内容就可以了。这个处理JSON的模块用的是VBA中字典+集合的原理,所以数据处理后的调用方式也参照字典和集合。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式