
excel vba抓取网页数据
excel vba抓取网页数据(如何使用ExcelAPI网络函数库抓取JSON格式的网页数据?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 197 次浏览 • 2021-09-15 21:12
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢?今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据。第一步是找到豆瓣书的基本信息页面。步骤2:安装excel API网络函数库。步骤3:使用函数获取JSON数据
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢
今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据
第一步是找到豆瓣书的基本信息页面
豆瓣图书信息网站是9787111529385,网站上的最后一串数字是该书的ISBN号
在Firefox浏览器中,此URL将返回以下信息:标准JSON格式、蓝色字体的属性名称和红色字体的相应属性值
步骤2:安装excel API网络函数库
访问Excel API网络函数库官网,根据帮助文件安装函数库
步骤3:使用函数获取JSON数据
首先,使用函数getjsonsource(URL,“UTF-8”)返回JSON原创数据
然后,使用函数getjsonbypropertyname(json_source,property_name)返回书籍的基本信息
使用getjsonsource()函数可以一次性获取所有数据,然后根据需要获取数据。这样做的目的是提高捕获速度。毕竟,访问网页需要时间 查看全部
excel vba抓取网页数据(如何使用ExcelAPI网络函数库抓取JSON格式的网页数据?)
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢?今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据。第一步是找到豆瓣书的基本信息页面。步骤2:安装excel API网络函数库。步骤3:使用函数获取JSON数据
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢
今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据
第一步是找到豆瓣书的基本信息页面
豆瓣图书信息网站是9787111529385,网站上的最后一串数字是该书的ISBN号
在Firefox浏览器中,此URL将返回以下信息:标准JSON格式、蓝色字体的属性名称和红色字体的相应属性值

步骤2:安装excel API网络函数库
访问Excel API网络函数库官网,根据帮助文件安装函数库
步骤3:使用函数获取JSON数据
首先,使用函数getjsonsource(URL,“UTF-8”)返回JSON原创数据

然后,使用函数getjsonbypropertyname(json_source,property_name)返回书籍的基本信息

使用getjsonsource()函数可以一次性获取所有数据,然后根据需要获取数据。这样做的目的是提高捕获速度。毕竟,访问网页需要时间
excel vba抓取网页数据(VBA基础的人来说不可能解决问题,我也不想把私信变成聊天窗 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 103 次浏览 • 2021-09-14 03:13
)
因为知乎的一些回答,最近总有私信问我怎么用VBA抓网,我基本没有回复。因为这个问题太大了,有基础知识的人其实很容易自己在百度或者ExcelHome论坛上找到答案。我不需要说什么。对于没有基础知识的人来说,是不可能三言两语解决问题的。我不想把私信变成聊天窗口。借知乎open 专栏的机会,来仔细解释一下这个问题。
我对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、打开网页
我们以百度搜索“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 的五种就绪状态,对应如下:
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中找出页面上的所有节点。还有其他几种方法:
这些更方便使用,帮助在抓取所有页面内容后过滤有效信息。当然 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标签中,所以要返回一个set,需要选择一个option将对应的Selected属性修改为True。单选按钮和复选按钮都是输入标签。不同的是类型分别是radio和checkbox。选择一个选项,需要修改对应的Checked属性。
三、数据接口
有时我们可以直接获取一些 API。当然,通过API返回数据比打开网页更方便快捷,使用的方法也有些不同。
1、Request 接口
比如我得到了一个可以从网上查询到市内免费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协议头文件,最后发送的内容就是接口参数。当然,这个QueryString也可以直接写在URL中,发送一个空字符串即可。
2、interface 返回
接口返回和获取的方式很简单:
If http.Status = 200 Then Range("A1").Value = http.responseText 查看全部
excel vba抓取网页数据(VBA基础的人来说不可能解决问题,我也不想把私信变成聊天窗
)
因为知乎的一些回答,最近总有私信问我怎么用VBA抓网,我基本没有回复。因为这个问题太大了,有基础知识的人其实很容易自己在百度或者ExcelHome论坛上找到答案。我不需要说什么。对于没有基础知识的人来说,是不可能三言两语解决问题的。我不想把私信变成聊天窗口。借知乎open 专栏的机会,来仔细解释一下这个问题。
我对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、打开网页
我们以百度搜索“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 的五种就绪状态,对应如下:
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中找出页面上的所有节点。还有其他几种方法:
这些更方便使用,帮助在抓取所有页面内容后过滤有效信息。当然 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标签中,所以要返回一个set,需要选择一个option将对应的Selected属性修改为True。单选按钮和复选按钮都是输入标签。不同的是类型分别是radio和checkbox。选择一个选项,需要修改对应的Checked属性。
三、数据接口
有时我们可以直接获取一些 API。当然,通过API返回数据比打开网页更方便快捷,使用的方法也有些不同。
1、Request 接口
比如我得到了一个可以从网上查询到市内免费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协议头文件,最后发送的内容就是接口参数。当然,这个QueryString也可以直接写在URL中,发送一个空字符串即可。
2、interface 返回
接口返回和获取的方式很简单:
If http.Status = 200 Then Range("A1").Value = http.responseText
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
网站优化 • 优采云 发表了文章 • 0 个评论 • 239 次浏览 • 2021-09-13 19:18
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。 查看全部
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。
excel vba抓取网页数据(基础篇Excel的缺省脚本语言脚本的实现问题及解决办法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 164 次浏览 • 2021-09-13 14:04
基础文章
Excel默认的脚本语言是VBA,所以系统的所有界面理论上都可以通过VBA脚本访问,而其他脚本语言可能只能访问部分功能。这需要开发者清楚。但是Javascript脚本的优点是语法简单,结构清晰,用户友好:比如支持Function-Frist,不需要管理内存,支持Object类型,for循环语法简单。
JavaScript 的基本使用方法
1.在参考中收录“Microsoft Script Control”控件
添加对 MS Script Control 控件的支持
2.新建一个ScriptControl,即创建JS运行环境
3.在JS运行环境中添加JavaScript脚本(字符串)
4.在JS运行环境中调用函数
JavaScript 的基本使用方法
实际项目中的问题
在VBA脚本中以字符串的形式定义JavaScript脚本/程序会带来很多麻烦:
当字符串很长时,需要换行,而VBA本身需要在每行添加一个连字符进行换行。 JavaScript 程序的换行符只能用转义符表示。 JavaScript 代码的管理、维护、检查甚至调试都无法单独进行。因此,在实际项目中,一般需要分别管理JavaScript脚本和VBA脚本。然后涉及到如何在VBA中读取JavaScript脚本。拿到脚本对应的字符串后,就可以将其添加到JS运行环境中。大概有3种方法:(一)JavaScript与Excel文件一起发出。VBA脚本运行时读取本地JavaScript文件;(二)JavaScript文件放在服务器上,VBA下载JavaScript文件并读取。(三)JavaScript文件以某种方式收录在Excel文件中。显然,方法(一),(二)更适合开发阶段;而方法(三)是适合实际发布版本,下面介绍几种方法的实现问题。
问题 1:读取文件
支持UTF-8编码的文件
VBA中一般可以使用FileSystemObjectScripting对象的Open-Input接口或TextStream接口读取文件,但都不支持读取UTF-8编码的文件。而 JavaScript 脚本文件一般以 UTF-8 编码格式存储。因此,需要使用支持这种编码的文件读取方式。例如,示例中使用了 ADODB.Steam 对象来支持读取 UTF-8 编码的文件。
问题 2:下载远程文件。在 VBA 中有两种下载远程文件的方法。一种是使用VBA中提供的某些控件进行下载,另一种是使用操作系统的底层接口进行下载。一般来说,第二种方法更快更稳定。 查看全部
excel vba抓取网页数据(基础篇Excel的缺省脚本语言脚本的实现问题及解决办法)
基础文章
Excel默认的脚本语言是VBA,所以系统的所有界面理论上都可以通过VBA脚本访问,而其他脚本语言可能只能访问部分功能。这需要开发者清楚。但是Javascript脚本的优点是语法简单,结构清晰,用户友好:比如支持Function-Frist,不需要管理内存,支持Object类型,for循环语法简单。
JavaScript 的基本使用方法
1.在参考中收录“Microsoft Script Control”控件
添加对 MS Script Control 控件的支持
2.新建一个ScriptControl,即创建JS运行环境
3.在JS运行环境中添加JavaScript脚本(字符串)
4.在JS运行环境中调用函数
JavaScript 的基本使用方法
实际项目中的问题
在VBA脚本中以字符串的形式定义JavaScript脚本/程序会带来很多麻烦:
当字符串很长时,需要换行,而VBA本身需要在每行添加一个连字符进行换行。 JavaScript 程序的换行符只能用转义符表示。 JavaScript 代码的管理、维护、检查甚至调试都无法单独进行。因此,在实际项目中,一般需要分别管理JavaScript脚本和VBA脚本。然后涉及到如何在VBA中读取JavaScript脚本。拿到脚本对应的字符串后,就可以将其添加到JS运行环境中。大概有3种方法:(一)JavaScript与Excel文件一起发出。VBA脚本运行时读取本地JavaScript文件;(二)JavaScript文件放在服务器上,VBA下载JavaScript文件并读取。(三)JavaScript文件以某种方式收录在Excel文件中。显然,方法(一),(二)更适合开发阶段;而方法(三)是适合实际发布版本,下面介绍几种方法的实现问题。
问题 1:读取文件
支持UTF-8编码的文件
VBA中一般可以使用FileSystemObjectScripting对象的Open-Input接口或TextStream接口读取文件,但都不支持读取UTF-8编码的文件。而 JavaScript 脚本文件一般以 UTF-8 编码格式存储。因此,需要使用支持这种编码的文件读取方式。例如,示例中使用了 ADODB.Steam 对象来支持读取 UTF-8 编码的文件。
问题 2:下载远程文件。在 VBA 中有两种下载远程文件的方法。一种是使用VBA中提供的某些控件进行下载,另一种是使用操作系统的底层接口进行下载。一般来说,第二种方法更快更稳定。
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
网站优化 • 优采云 发表了文章 • 0 个评论 • 395 次浏览 • 2021-09-09 09:09
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。 查看全部
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。
excel vba抓取网页数据( VBA获取网页的全部源码内容_218.png )
网站优化 • 优采云 发表了文章 • 0 个评论 • 213 次浏览 • 2021-09-09 09:06
VBA获取网页的全部源码内容_218.png
)
VBA 获取网页的所有源内容_218.png
获取网页的完整源码只是获取网络资源的一种方式,但是返回数据的格式不同,做了一定的处理!首先要有一个Function来提取网络资源:
'-----------------------------------------------
'|获取网络数据
'-----------------------------------------------
'|注意:当使用Body提取整个页面时必须使用StrConv转换成字符串
'| HTML.body.innerHTML = StrConv(.responsebody, vbUnicode)
'-----------------------------------------------
Function getWebData(ByVal URL As String, Optional ByVal Method As String = "GET", Optional ByVal ReturnType As String = "Text", Optional ByVal Async As Boolean = False, Optional ByVal Username As String = "", Optional ByVal Password As String = "")
On Error Resume Next
'处理变量
Method = IIf(UCase(Method) = "GET", "GET", "POST")
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("Microsoft.XMLHTTP") ' "Msxml2.ServerXMLHTTP"
'发送请求
xmlHttp.Open Method, URL, Async, Username, Password
xmlHttp.Send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
If xmlHttp.ReadyState = 4 Then
'根据要求返回不同结果
Select Case UCase(ReturnType)
Case "TEXT"
getWebData = xmlHttp.responsetext
Case "BODY"
getWebData = xmlHttp.responsebody
Case "STREAM"
getWebData = xmlHttp.responseStream
Case "XML"
getWebData = xmlHttp.responseXML
Case Else
getWebData = xmlHttp.responsetext
End Select
Else
getWebData = "调用失败,错误代码:" & xmlHttp.Status '返回错误结果
End If
'销毁对象
Set xmlHttp = Nothing
End Function
第二步是提取数据。应该使用'responsebody'的类型。由于返回的类型不是字符串,因此需要对其进行处理并转换为字符串。具体方法如下:
'提取整个页面的HTML
MsgBox openTXT(StrConv(getWebData("http://data.eastmoney.com/stoc ... ot%3B, "get", "body"), vbUnicode)) 查看全部
excel vba抓取网页数据(
VBA获取网页的全部源码内容_218.png
)
VBA 获取网页的所有源内容_218.png
获取网页的完整源码只是获取网络资源的一种方式,但是返回数据的格式不同,做了一定的处理!首先要有一个Function来提取网络资源:
'-----------------------------------------------
'|获取网络数据
'-----------------------------------------------
'|注意:当使用Body提取整个页面时必须使用StrConv转换成字符串
'| HTML.body.innerHTML = StrConv(.responsebody, vbUnicode)
'-----------------------------------------------
Function getWebData(ByVal URL As String, Optional ByVal Method As String = "GET", Optional ByVal ReturnType As String = "Text", Optional ByVal Async As Boolean = False, Optional ByVal Username As String = "", Optional ByVal Password As String = "")
On Error Resume Next
'处理变量
Method = IIf(UCase(Method) = "GET", "GET", "POST")
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("Microsoft.XMLHTTP") ' "Msxml2.ServerXMLHTTP"
'发送请求
xmlHttp.Open Method, URL, Async, Username, Password
xmlHttp.Send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
If xmlHttp.ReadyState = 4 Then
'根据要求返回不同结果
Select Case UCase(ReturnType)
Case "TEXT"
getWebData = xmlHttp.responsetext
Case "BODY"
getWebData = xmlHttp.responsebody
Case "STREAM"
getWebData = xmlHttp.responseStream
Case "XML"
getWebData = xmlHttp.responseXML
Case Else
getWebData = xmlHttp.responsetext
End Select
Else
getWebData = "调用失败,错误代码:" & xmlHttp.Status '返回错误结果
End If
'销毁对象
Set xmlHttp = Nothing
End Function
第二步是提取数据。应该使用'responsebody'的类型。由于返回的类型不是字符串,因此需要对其进行处理并转换为字符串。具体方法如下:
'提取整个页面的HTML
MsgBox openTXT(StrConv(getWebData("http://data.eastmoney.com/stoc ... ot%3B, "get", "body"), vbUnicode))
excel vba抓取网页数据(如何使用ExcelAPI网络函数库抓取JSON格式的网页数据?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 197 次浏览 • 2021-09-15 21:12
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢?今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据。第一步是找到豆瓣书的基本信息页面。步骤2:安装excel API网络函数库。步骤3:使用函数获取JSON数据
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢
今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据
第一步是找到豆瓣书的基本信息页面
豆瓣图书信息网站是9787111529385,网站上的最后一串数字是该书的ISBN号
在Firefox浏览器中,此URL将返回以下信息:标准JSON格式、蓝色字体的属性名称和红色字体的相应属性值
步骤2:安装excel API网络函数库
访问Excel API网络函数库官网,根据帮助文件安装函数库
步骤3:使用函数获取JSON数据
首先,使用函数getjsonsource(URL,“UTF-8”)返回JSON原创数据
然后,使用函数getjsonbypropertyname(json_source,property_name)返回书籍的基本信息
使用getjsonsource()函数可以一次性获取所有数据,然后根据需要获取数据。这样做的目的是提高捕获速度。毕竟,访问网页需要时间 查看全部
excel vba抓取网页数据(如何使用ExcelAPI网络函数库抓取JSON格式的网页数据?)
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢?今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据。第一步是找到豆瓣书的基本信息页面。步骤2:安装excel API网络函数库。步骤3:使用函数获取JSON数据
excel 2013之后的版本提供WebService和filterxml功能,可用于网页数据捕获,但只能捕获XML格式的数据。现在许多网站的网页或接口返回HTML或JSON数据,那么如何准确地捕获这些数据呢
今天,笔者将以捕捉豆瓣书的基本信息为例,介绍如何使用Excel API网络函数库捕捉JSON格式的网页数据
第一步是找到豆瓣书的基本信息页面
豆瓣图书信息网站是9787111529385,网站上的最后一串数字是该书的ISBN号
在Firefox浏览器中,此URL将返回以下信息:标准JSON格式、蓝色字体的属性名称和红色字体的相应属性值

步骤2:安装excel API网络函数库
访问Excel API网络函数库官网,根据帮助文件安装函数库
步骤3:使用函数获取JSON数据
首先,使用函数getjsonsource(URL,“UTF-8”)返回JSON原创数据

然后,使用函数getjsonbypropertyname(json_source,property_name)返回书籍的基本信息

使用getjsonsource()函数可以一次性获取所有数据,然后根据需要获取数据。这样做的目的是提高捕获速度。毕竟,访问网页需要时间
excel vba抓取网页数据(VBA基础的人来说不可能解决问题,我也不想把私信变成聊天窗 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 103 次浏览 • 2021-09-14 03:13
)
因为知乎的一些回答,最近总有私信问我怎么用VBA抓网,我基本没有回复。因为这个问题太大了,有基础知识的人其实很容易自己在百度或者ExcelHome论坛上找到答案。我不需要说什么。对于没有基础知识的人来说,是不可能三言两语解决问题的。我不想把私信变成聊天窗口。借知乎open 专栏的机会,来仔细解释一下这个问题。
我对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、打开网页
我们以百度搜索“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 的五种就绪状态,对应如下:
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中找出页面上的所有节点。还有其他几种方法:
这些更方便使用,帮助在抓取所有页面内容后过滤有效信息。当然 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标签中,所以要返回一个set,需要选择一个option将对应的Selected属性修改为True。单选按钮和复选按钮都是输入标签。不同的是类型分别是radio和checkbox。选择一个选项,需要修改对应的Checked属性。
三、数据接口
有时我们可以直接获取一些 API。当然,通过API返回数据比打开网页更方便快捷,使用的方法也有些不同。
1、Request 接口
比如我得到了一个可以从网上查询到市内免费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协议头文件,最后发送的内容就是接口参数。当然,这个QueryString也可以直接写在URL中,发送一个空字符串即可。
2、interface 返回
接口返回和获取的方式很简单:
If http.Status = 200 Then Range("A1").Value = http.responseText 查看全部
excel vba抓取网页数据(VBA基础的人来说不可能解决问题,我也不想把私信变成聊天窗
)
因为知乎的一些回答,最近总有私信问我怎么用VBA抓网,我基本没有回复。因为这个问题太大了,有基础知识的人其实很容易自己在百度或者ExcelHome论坛上找到答案。我不需要说什么。对于没有基础知识的人来说,是不可能三言两语解决问题的。我不想把私信变成聊天窗口。借知乎open 专栏的机会,来仔细解释一下这个问题。
我对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、打开网页
我们以百度搜索“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 的五种就绪状态,对应如下:
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中找出页面上的所有节点。还有其他几种方法:
这些更方便使用,帮助在抓取所有页面内容后过滤有效信息。当然 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标签中,所以要返回一个set,需要选择一个option将对应的Selected属性修改为True。单选按钮和复选按钮都是输入标签。不同的是类型分别是radio和checkbox。选择一个选项,需要修改对应的Checked属性。
三、数据接口
有时我们可以直接获取一些 API。当然,通过API返回数据比打开网页更方便快捷,使用的方法也有些不同。
1、Request 接口
比如我得到了一个可以从网上查询到市内免费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协议头文件,最后发送的内容就是接口参数。当然,这个QueryString也可以直接写在URL中,发送一个空字符串即可。
2、interface 返回
接口返回和获取的方式很简单:
If http.Status = 200 Then Range("A1").Value = http.responseText
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
网站优化 • 优采云 发表了文章 • 0 个评论 • 239 次浏览 • 2021-09-13 19:18
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。 查看全部
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。
excel vba抓取网页数据(基础篇Excel的缺省脚本语言脚本的实现问题及解决办法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 164 次浏览 • 2021-09-13 14:04
基础文章
Excel默认的脚本语言是VBA,所以系统的所有界面理论上都可以通过VBA脚本访问,而其他脚本语言可能只能访问部分功能。这需要开发者清楚。但是Javascript脚本的优点是语法简单,结构清晰,用户友好:比如支持Function-Frist,不需要管理内存,支持Object类型,for循环语法简单。
JavaScript 的基本使用方法
1.在参考中收录“Microsoft Script Control”控件
添加对 MS Script Control 控件的支持
2.新建一个ScriptControl,即创建JS运行环境
3.在JS运行环境中添加JavaScript脚本(字符串)
4.在JS运行环境中调用函数
JavaScript 的基本使用方法
实际项目中的问题
在VBA脚本中以字符串的形式定义JavaScript脚本/程序会带来很多麻烦:
当字符串很长时,需要换行,而VBA本身需要在每行添加一个连字符进行换行。 JavaScript 程序的换行符只能用转义符表示。 JavaScript 代码的管理、维护、检查甚至调试都无法单独进行。因此,在实际项目中,一般需要分别管理JavaScript脚本和VBA脚本。然后涉及到如何在VBA中读取JavaScript脚本。拿到脚本对应的字符串后,就可以将其添加到JS运行环境中。大概有3种方法:(一)JavaScript与Excel文件一起发出。VBA脚本运行时读取本地JavaScript文件;(二)JavaScript文件放在服务器上,VBA下载JavaScript文件并读取。(三)JavaScript文件以某种方式收录在Excel文件中。显然,方法(一),(二)更适合开发阶段;而方法(三)是适合实际发布版本,下面介绍几种方法的实现问题。
问题 1:读取文件
支持UTF-8编码的文件
VBA中一般可以使用FileSystemObjectScripting对象的Open-Input接口或TextStream接口读取文件,但都不支持读取UTF-8编码的文件。而 JavaScript 脚本文件一般以 UTF-8 编码格式存储。因此,需要使用支持这种编码的文件读取方式。例如,示例中使用了 ADODB.Steam 对象来支持读取 UTF-8 编码的文件。
问题 2:下载远程文件。在 VBA 中有两种下载远程文件的方法。一种是使用VBA中提供的某些控件进行下载,另一种是使用操作系统的底层接口进行下载。一般来说,第二种方法更快更稳定。 查看全部
excel vba抓取网页数据(基础篇Excel的缺省脚本语言脚本的实现问题及解决办法)
基础文章
Excel默认的脚本语言是VBA,所以系统的所有界面理论上都可以通过VBA脚本访问,而其他脚本语言可能只能访问部分功能。这需要开发者清楚。但是Javascript脚本的优点是语法简单,结构清晰,用户友好:比如支持Function-Frist,不需要管理内存,支持Object类型,for循环语法简单。
JavaScript 的基本使用方法
1.在参考中收录“Microsoft Script Control”控件
添加对 MS Script Control 控件的支持
2.新建一个ScriptControl,即创建JS运行环境
3.在JS运行环境中添加JavaScript脚本(字符串)
4.在JS运行环境中调用函数
JavaScript 的基本使用方法
实际项目中的问题
在VBA脚本中以字符串的形式定义JavaScript脚本/程序会带来很多麻烦:
当字符串很长时,需要换行,而VBA本身需要在每行添加一个连字符进行换行。 JavaScript 程序的换行符只能用转义符表示。 JavaScript 代码的管理、维护、检查甚至调试都无法单独进行。因此,在实际项目中,一般需要分别管理JavaScript脚本和VBA脚本。然后涉及到如何在VBA中读取JavaScript脚本。拿到脚本对应的字符串后,就可以将其添加到JS运行环境中。大概有3种方法:(一)JavaScript与Excel文件一起发出。VBA脚本运行时读取本地JavaScript文件;(二)JavaScript文件放在服务器上,VBA下载JavaScript文件并读取。(三)JavaScript文件以某种方式收录在Excel文件中。显然,方法(一),(二)更适合开发阶段;而方法(三)是适合实际发布版本,下面介绍几种方法的实现问题。
问题 1:读取文件
支持UTF-8编码的文件
VBA中一般可以使用FileSystemObjectScripting对象的Open-Input接口或TextStream接口读取文件,但都不支持读取UTF-8编码的文件。而 JavaScript 脚本文件一般以 UTF-8 编码格式存储。因此,需要使用支持这种编码的文件读取方式。例如,示例中使用了 ADODB.Steam 对象来支持读取 UTF-8 编码的文件。
问题 2:下载远程文件。在 VBA 中有两种下载远程文件的方法。一种是使用VBA中提供的某些控件进行下载,另一种是使用操作系统的底层接口进行下载。一般来说,第二种方法更快更稳定。
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
网站优化 • 优采云 发表了文章 • 0 个评论 • 395 次浏览 • 2021-09-09 09:09
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。 查看全部
excel vba抓取网页数据(可以,只能用IE实现,引用MicrosoftInternetControls就可以)
是的,只能用IE来实现。您可以通过引用 Microsoft Internet Controls 在 VBA 中操作网页上的内容。
Dim mShellwindows As New ShellWindows
Dim IE As InternetExplorer
For Each IE In mShellwindows '搜索页面
If IE.LocationURL = [URL] Then Exit For
Next
With IE.Document '在文本框填写内容
.all("[id_or_name]").Value = Sheet1.Cells(1, 1).Value
End With
基本原理如上代码所示。
[URL]是你要填写数据的页面,先用IE浏览器打开这个页面。
[id_or_name] 是你要填写的控件的id或者name,这个需要提前从页面中获取。
至于其他个性化定制内容,需要自己写~如果不想发图就问吧!
顺便说一句
Sub getPageInfo()
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate [URL]
While .ReadyState 4 Or .Busy
DoEvents
Wend
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
Set r = Nothing
.Quit
End With
MsgBox "获取页面信息成功!"
End Sub
这是抓取页面内容的代码...如果要登录,必须先打开页面。
excel vba抓取网页数据( VBA获取网页的全部源码内容_218.png )
网站优化 • 优采云 发表了文章 • 0 个评论 • 213 次浏览 • 2021-09-09 09:06
VBA获取网页的全部源码内容_218.png
)
VBA 获取网页的所有源内容_218.png
获取网页的完整源码只是获取网络资源的一种方式,但是返回数据的格式不同,做了一定的处理!首先要有一个Function来提取网络资源:
'-----------------------------------------------
'|获取网络数据
'-----------------------------------------------
'|注意:当使用Body提取整个页面时必须使用StrConv转换成字符串
'| HTML.body.innerHTML = StrConv(.responsebody, vbUnicode)
'-----------------------------------------------
Function getWebData(ByVal URL As String, Optional ByVal Method As String = "GET", Optional ByVal ReturnType As String = "Text", Optional ByVal Async As Boolean = False, Optional ByVal Username As String = "", Optional ByVal Password As String = "")
On Error Resume Next
'处理变量
Method = IIf(UCase(Method) = "GET", "GET", "POST")
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("Microsoft.XMLHTTP") ' "Msxml2.ServerXMLHTTP"
'发送请求
xmlHttp.Open Method, URL, Async, Username, Password
xmlHttp.Send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
If xmlHttp.ReadyState = 4 Then
'根据要求返回不同结果
Select Case UCase(ReturnType)
Case "TEXT"
getWebData = xmlHttp.responsetext
Case "BODY"
getWebData = xmlHttp.responsebody
Case "STREAM"
getWebData = xmlHttp.responseStream
Case "XML"
getWebData = xmlHttp.responseXML
Case Else
getWebData = xmlHttp.responsetext
End Select
Else
getWebData = "调用失败,错误代码:" & xmlHttp.Status '返回错误结果
End If
'销毁对象
Set xmlHttp = Nothing
End Function
第二步是提取数据。应该使用'responsebody'的类型。由于返回的类型不是字符串,因此需要对其进行处理并转换为字符串。具体方法如下:
'提取整个页面的HTML
MsgBox openTXT(StrConv(getWebData("http://data.eastmoney.com/stoc ... ot%3B, "get", "body"), vbUnicode)) 查看全部
excel vba抓取网页数据(
VBA获取网页的全部源码内容_218.png
)
VBA 获取网页的所有源内容_218.png
获取网页的完整源码只是获取网络资源的一种方式,但是返回数据的格式不同,做了一定的处理!首先要有一个Function来提取网络资源:
'-----------------------------------------------
'|获取网络数据
'-----------------------------------------------
'|注意:当使用Body提取整个页面时必须使用StrConv转换成字符串
'| HTML.body.innerHTML = StrConv(.responsebody, vbUnicode)
'-----------------------------------------------
Function getWebData(ByVal URL As String, Optional ByVal Method As String = "GET", Optional ByVal ReturnType As String = "Text", Optional ByVal Async As Boolean = False, Optional ByVal Username As String = "", Optional ByVal Password As String = "")
On Error Resume Next
'处理变量
Method = IIf(UCase(Method) = "GET", "GET", "POST")
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("Microsoft.XMLHTTP") ' "Msxml2.ServerXMLHTTP"
'发送请求
xmlHttp.Open Method, URL, Async, Username, Password
xmlHttp.Send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
If xmlHttp.ReadyState = 4 Then
'根据要求返回不同结果
Select Case UCase(ReturnType)
Case "TEXT"
getWebData = xmlHttp.responsetext
Case "BODY"
getWebData = xmlHttp.responsebody
Case "STREAM"
getWebData = xmlHttp.responseStream
Case "XML"
getWebData = xmlHttp.responseXML
Case Else
getWebData = xmlHttp.responsetext
End Select
Else
getWebData = "调用失败,错误代码:" & xmlHttp.Status '返回错误结果
End If
'销毁对象
Set xmlHttp = Nothing
End Function
第二步是提取数据。应该使用'responsebody'的类型。由于返回的类型不是字符串,因此需要对其进行处理并转换为字符串。具体方法如下:
'提取整个页面的HTML
MsgBox openTXT(StrConv(getWebData("http://data.eastmoney.com/stoc ... ot%3B, "get", "body"), vbUnicode))