excelvba抓取网页数据( VBA·5个月前如何使用VBA网抓的? )

优采云 发布时间: 2022-02-04 15:23

  excelvba抓取网页数据(

VBA·5个月前如何使用VBA网抓的?

)

  使用Excel+VBA操作网页

  

  黄晨5 个月前

  由于知乎中的一些答案,最近总是有私信问我如何使用VBA进行抓包,但我基本没有回复。因为这个问题太大了,对于有基础知识的人来说,在百度或者ExcelHome论坛上其实很容易找到答案,我也不用多说。对于没有基础知识的人来说,三言两语是不可能解决问题的。我不想将私人消息变成聊天窗口。趁着知乎开专栏的机会,正好来详细解释一下这个问题。

  我对Excel和VBA的了解有限,只能解决一些遇到的问题,不一定适用于所有场景。以下内容是在了解基本VBA使用和HTML语言知识的基础上创建的:css

  1、前期准备

  据我所知,VBA不能操作任何浏览器和网页,我们能做的就是在IE上做一些操作,是的,只有IE。不要告诉我我的电脑上没有IE,所以我可以Exit Sub。就像 Python 使用 import 和 C# 使用 using 一样,VBA 也需要参考一些库来操作 IE,但好在它们都是微软的产品,所以我们可以轻松使用 VBA 自带的一些库。阿贾克斯

  我们要做的第一件事就是参考 VBA 中的 Micorsoft Internet Controls。从名字上我们就知道它是用来帮助我们控制IE页面的。json

  2、网页操作

  引用微软互联网控制之后,我们可以对页面做任何我们想做的事情,但我们必须在主页上有一个页面,上帝说我们必须有一个页面!api

  一、打开网页数组

  以百度搜索“chahu”关键词为例:浏览器

   With CreateObject("internetexplorer.application")

.Visible = True

.Navigate "https://www.baidu.com/s?wd=扯乎"

'关闭网页

' .Quit

End With

  代码很简单,先创建一个IE对象,然后给一些属性赋值。Visible 是可见性,表示对网页进行操作时是否会看到该网页。熟练后可以设置为False,这样不仅让程序在运行的时候感觉很神秘(没有),速度也快了一点。服务器

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

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

  科尔斯

   While .ReadyState 4 Or .Busy

DoEvents

Wend

  Busy 是网页的忙碌状态,ReadyState 是 HTTP 的五个就绪状态,对应如下: 异步

  二、获取信息

  我们先抓取页面上的所有内容,后面过滤掉有用的部分,然后慢慢给抓取添加条件。

   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中找出页面上的所有节点。这里还有一些其他的方法:

  在抓取所有页面内容后,这些都有助于筛选有效信息。虽然 all 仍然是最好用的,因为 all 也有 all("IDName") 和 all.IDName 用法。

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

  三、填写信息

  虽然网页爬取神器还是Python,但是大部分人使用Excel的目的是自动填写页面内容,直接提交表单到页面,输入问卷。爬取页面内容后,填充就更简单了,只需要直接给页面标签的Value属性赋值即可。

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

  '下拉菜单选择

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

'单选按钮选择

.all("radio").Checked = True

'复选按钮选择

.all("checkbox").Checked = True

  下拉菜单是一个选择标签,每个选项都在一个选项标签中,所以返回一个集合。要选择一个选项,请将相应的 Selected 属性修改为 True。单选按钮和复选按钮都是输入标签。不同的是类型是单选和复选框。要选择一个选项,您需要修改相应的 Checked 属性。

  3、数据接口

  有时我们可以直接获取一些API。当然,通过 API 返回数据比打开网页更方便快捷,但使用的方法也不同。

  一、请求接口

  比如我从网上获取了一个可以查询某城市免费WIFI的API,通过Excel接口使用如下代码访问:(虽然是免费的,但是为了避免麻烦,隐藏了个人A*敏*感*词*ey)

   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=[A*敏*感*词*ey]&city=北京&page=1"

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

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

  二、接口返回

  接口返回采集的方式很简单:

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线