excel抓取多页网页数据(VBA基础的人来说不可能解决问题,我也不想把私信变成聊天窗 )

优采云 发布时间: 2021-10-15 06:09

  excel抓取多页网页数据(VBA基础的人来说不可能解决问题,我也不想把私信变成聊天窗

)

  因为知乎里面的一些回答,最近总有私信问我怎么用VBA抓网,但是我基本没有回复。因为这个问题太大了,有基础知识的人其实很容易自己在百度或者ExcelHome论坛上找到答案。我不需要说什么。对于没有基础知识的人来说,是不可能三言两语解决问题的。我不想把私信变成聊天窗口。趁着开专栏知乎的机会,来仔细解释一下这个问题。

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

  一、前期准备

  据我所知,VBA 不能操作任何浏览器和网页。我们所能做的就是在IE上执行一些操作,是的,只有IE。不要告诉我电脑上没有IE,所以你可以退出Sub。就像Python使用import,C#使用using一样,VBA也需要引用一些库来操作IE,不过好在它是微软的产品,所以我们可以很方便的使用VBA自带的一些库。

  我们需要做的第一件事是在 VBA 中引用 Micorsoft Internet Controls。通过查看这个名称,我们知道它可以帮助我们控制 IE 页面。

  二、网页操作

  引用 Micorsoft Internet Controls 后,我们可以对页面做任何我们想做的事情,但是我们需要在主页上有一个页面,上帝说我们需要一个页面!

  1、打开网页

  我们以在百度上搜索“查虎”关键词为例:

  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 的五种就绪状态,对应如下:

  2、获取信息

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

  1.     Set dmt = .Document

2.          For i = 0 To dmt.all.Length - 1

3.              Set htMent = dmt.all(i)

4.              With ActiveSheet

5.                  .Cells(i + 2, "A") = htMent.tagName

6.                  .Cells(i + 2, "B") = TypeName(htMent)

7.                  .Cells(i + 2, "C") = htMent.ID

8.                  .Cells(i + 2, "D") = htMent.Name

9.                  .Cells(i + 2, "E") = htMent.Value

10.                .Cells(i + 2, "F") = htMent.Text

11.                .Cells(i + 2, "G") = htMent.innerText

12.            End With

13.        Next i

  这段代码有点类似于JS,需要从IE.Document.all中找出页面上的所有节点。还有其他几种方法:

  这些更方便用于在抓取所有页面内容后帮助过滤有效信息。当然 all 最好用,因为 all 也有 all ("IDName") 和 all.IDName 用法。

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

  3、填写信息

  爬网神器当然是Python。大多数人使用Excel自动填写页面内容,直接将表格提交到网页,省去了问卷录入等大量工作。抓取页面内容后,填充起来就更容易了。你只需要直接给页面标签的Value属性赋值即可。

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

  1.  

 '下拉菜单选择

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

3.  '单选按钮选择

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

5.  '复选按钮选择

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

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

  三、数据接口

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

  1、请求接口

  比如我得到了一个可以从网上查询到城市免费WIFI的API,我用下面的代码通过Excel界面访问:(虽然是免费的,为了避免麻烦,我还是隐藏了我的A*敏*感*词*ey)

  1.    Dim http

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

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

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

5.    http.send "key=[A*敏*感*词*ey]&city=北京&page=1"

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

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

  2、接口返回

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

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线