vba xmlhttp 抓取网页

vba xmlhttp 抓取网页

vba xmlhttp 抓取网页(AJAX1.实现方式原生的JS实现 )

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-04-17 21:37 • 来自相关话题

  vba xmlhttp 抓取网页(AJAX1.实现方式原生的JS实现
)
  文章目录
  一、AJAX 1.概念
  Ajax 是一种无需重新加载整个网页即可更新部分网页的技术。它是异步 JavaScript 和 XML。
   通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某
部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
  异步:
  客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作
  同步:
  客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作
  2.实现方式Native JS实现方式
  
//定义方法
function fun() {
//发送异步请求
//1、创建核心对象
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//2、建立连接
/*
参数:
1、请求方式:GET、POST
get方式,请求参数在URL后边拼接,send方法为空参
post方式,请求参数在send中定义
2、请求的URL
3、同步或异步请求:true(异步)或false(同步)
*/
xmlhttp.open("GET", "ajaxServlet?username=tom", true);
//3、发送请求
xmlhttp.send();
//4、接收并处理来着服务的响应结果
//获取方式:xmlhttp.responseText
//当服务器响应成功后再获取
//当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange
xmlhttp.onreadystatechange = function () {
//判断readyState就绪状态是否为4,判断事件status响应状态码是否为200
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
//获取服务器的响应结果
var responseText = xmlhttp.responseText;
alert(responseText);
// document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
}

  JQeury实现方法
  1、$.ajax()
  语法:
  $,ajax({键值对});
  示例代码:
  
//定义方法
function fun() {
//使用$.ajax()发送异步请求
$.ajax({
url: "ajaxServlet",//请求路径
type: "POST",//请求方式
data: "username=jack&age=23",//请求参数方式一
data: {"usernsme": "jack", "age": 23},//方式二
success: function (data) {
alert(data);
},//响应成功后的回调函数
error: function () {
alert("出错了");
},//如果请求响应出现错误会执行的回调函数
dataType: "text",//设置接收到的响应数据的格式
});
}

  2、$.get()
  语法:
  $.get(url, [data], [callback], [type])
url:请求路径
data:请求参数
callback:回调函数
type:响应结果的类型
  示例代码:
  

//定义方法
function fun() {
$.get("ajaxServlet", {username: "rose"}, function (data) {
alert(data);
}, "text");
}

  3、$.post()
  语法:
  $.post(url, [data], [callback], [type])
  示例代码:
  二、JSON 1.概念
  JSON 是一种 JavaScript 对象表示法,现在主要用于存储和交换文本信息以及用于数据传输。 JSON 比 XML 更小、更快且更易于解析。
  2.语法基本规则
  数据在名称/值对中:json数据是由键值对构成的
键用引号(单双都行)引起来,也可以不使用引号
值的取值类型:
1. 数字(整数或浮点数)
2. 字符串(在双引号中)
3. 逻辑值(true 或 false)
4. 数组(在方括号中) {"persons":[{},{}]}
5. 对象(在花括号中) {"address":{"province":"XX"....}}
6. null
数据由逗号分隔:多个键值对由逗号分隔
花括号保存对象:使用{}定义json 格式
方括号保存数组:[]
  示例代码:
  
//定义基本格式
var parson = {"name": "张三", age: 23, 'gender': true};
//1、获取name的值
// var name = parson.name;
var name = parson["name"];
// alert(name);
// alert(parson);
//2、嵌套格式{}---->[]
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
]
};
//获取王五值
var name1 = persons.persons[2].name;
// alert(name1);
// alert(persons);
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//获取李四值
alert(ps[1].name);
// alert(ps);

  获取数据
   1. json对象.键名
2. json对象["键名"]
3. 数组对象[索引]
4. 遍历
  循环值示例:
<p>
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//获取person对象中所有的键和值
//for in循环
/* for (var key in parson) {
//获取不出来,因为相当于person."name"
// alert(key+":"+parson.key);
alert(key + ":" + parson[key]);
}*/
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//通过双层for循环获取ps的所有值
for (var i = 0; i 查看全部

  vba xmlhttp 抓取网页(AJAX1.实现方式原生的JS实现
)
  文章目录
  一、AJAX 1.概念
  Ajax 是一种无需重新加载整个网页即可更新部分网页的技术。它是异步 JavaScript 和 XML。
   通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某
部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
  异步:
  客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作
  同步:
  客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作
  2.实现方式Native JS实现方式
  
//定义方法
function fun() {
//发送异步请求
//1、创建核心对象
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//2、建立连接
/*
参数:
1、请求方式:GET、POST
get方式,请求参数在URL后边拼接,send方法为空参
post方式,请求参数在send中定义
2、请求的URL
3、同步或异步请求:true(异步)或false(同步)
*/
xmlhttp.open("GET", "ajaxServlet?username=tom", true);
//3、发送请求
xmlhttp.send();
//4、接收并处理来着服务的响应结果
//获取方式:xmlhttp.responseText
//当服务器响应成功后再获取
//当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange
xmlhttp.onreadystatechange = function () {
//判断readyState就绪状态是否为4,判断事件status响应状态码是否为200
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
//获取服务器的响应结果
var responseText = xmlhttp.responseText;
alert(responseText);
// document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
}

  JQeury实现方法
  1、$.ajax()
  语法:
  $,ajax({键值对});
  示例代码:
  
//定义方法
function fun() {
//使用$.ajax()发送异步请求
$.ajax({
url: "ajaxServlet",//请求路径
type: "POST",//请求方式
data: "username=jack&age=23",//请求参数方式一
data: {"usernsme": "jack", "age": 23},//方式二
success: function (data) {
alert(data);
},//响应成功后的回调函数
error: function () {
alert("出错了");
},//如果请求响应出现错误会执行的回调函数
dataType: "text",//设置接收到的响应数据的格式
});
}

  2、$.get()
  语法:
  $.get(url, [data], [callback], [type])
url:请求路径
data:请求参数
callback:回调函数
type:响应结果的类型
  示例代码:
  

//定义方法
function fun() {
$.get("ajaxServlet", {username: "rose"}, function (data) {
alert(data);
}, "text");
}

  3、$.post()
  语法:
  $.post(url, [data], [callback], [type])
  示例代码:
  二、JSON 1.概念
  JSON 是一种 JavaScript 对象表示法,现在主要用于存储和交换文本信息以及用于数据传输。 JSON 比 XML 更小、更快且更易于解析。
  2.语法基本规则
  数据在名称/值对中:json数据是由键值对构成的
键用引号(单双都行)引起来,也可以不使用引号
值的取值类型:
1. 数字(整数或浮点数)
2. 字符串(在双引号中)
3. 逻辑值(true 或 false)
4. 数组(在方括号中) {"persons":[{},{}]}
5. 对象(在花括号中) {"address":{"province":"XX"....}}
6. null
数据由逗号分隔:多个键值对由逗号分隔
花括号保存对象:使用{}定义json 格式
方括号保存数组:[]
  示例代码:
  
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//1、获取name的值
// var name = parson.name;
var name = parson["name"];
// alert(name);
// alert(parson);
//2、嵌套格式{}---->[]
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
]
};
//获取王五值
var name1 = persons.persons[2].name;
// alert(name1);
// alert(persons);
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//获取李四值
alert(ps[1].name);
// alert(ps);

  获取数据
   1. json对象.键名
2. json对象["键名"]
3. 数组对象[索引]
4. 遍历
  循环值示例:
<p>
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//获取person对象中所有的键和值
//for in循环
/* for (var key in parson) {
//获取不出来,因为相当于person."name"
// alert(key+":"+parson.key);
alert(key + ":" + parson[key]);
}*/
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//通过双层for循环获取ps的所有值
for (var i = 0; i

vba xmlhttp 抓取网页(集搜客GooSeeker网络爬虫如何在数据时自动抓取数据相关内容)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-04-13 12:19 • 来自相关话题

  vba xmlhttp 抓取网页(集搜客GooSeeker网络爬虫如何在数据时自动抓取数据相关内容)
  (°ο°) 互联网不断涌现出新的信息、新的设计模式和海量的数据。将这些数据组织到一个独特的库中并非易事。但是,有很多优秀的网络抓取工具可用。ProxyCrawl 使用Proxy Crawl API,可以找到关于python不打开页面抓取数据的相关内容,包括python不打开页面抓取数据相关文档代码介绍,相关教程视频课程,以及相关python不打开页面抓取数据打开页面爬取数据问答内容。为您解决当前阶段。
  爬取网页数据的方法如上所述。爬取数据只是一小步。如何分析数据是大学的问题。欢迎讨论。上面不清楚的是,我们在爬取数据时,通常不会只爬取网页当前页面的数据,而是经常在翻页后继续爬取数据。本文将向大家介绍GooSeeker网络爬虫是如何在爬取时自动爬取数据的。
  站长之家注:在大数据时代,如何有效获取数据已成为驱动业务决策的关键技能。分析市场趋势、监控竞争对手等都需要数据采集。网页抓取是数据采集的主要方法之一。在这篇文章中,Chris是如何从网页的源代码中抓取到他想要的数据,但是在源代码中还是有很多数据是看不到的。显示的金额是25000。如上图,我想得到红框中“保本”的金额,但是通过查看网页的源代码,发现保证金的金额在源代码。
  Web Scraper 插件允许您以“所见即所得”的方式选择要提取的网页数据形成模板,以后可以随时执行,执行结果可以导出为 CSV 格式。网页爬虫对比类可以获取数据但是不能在页面上渲染问题描述:我获取到了所有的数据,js写的console.log(音乐)数据打印正确,但是页面上不显示。多次对数。
  我是按照你的方法修改的,不知道是不是网页结构的原因。爬取的数据有空白是因为怕爬虫爬不到介绍。本期文章主要介绍了“必须知道”的14条采集数据网站,解决工作中90%以上的问题!以及相关的经验技巧,文章约2725字,278浏览量,6个赞,值得推荐!在日常生活中。 查看全部

  vba xmlhttp 抓取网页(集搜客GooSeeker网络爬虫如何在数据时自动抓取数据相关内容)
  (°ο°) 互联网不断涌现出新的信息、新的设计模式和海量的数据。将这些数据组织到一个独特的库中并非易事。但是,有很多优秀的网络抓取工具可用。ProxyCrawl 使用Proxy Crawl API,可以找到关于python不打开页面抓取数据的相关内容,包括python不打开页面抓取数据相关文档代码介绍,相关教程视频课程,以及相关python不打开页面抓取数据打开页面爬取数据问答内容。为您解决当前阶段。
  爬取网页数据的方法如上所述。爬取数据只是一小步。如何分析数据是大学的问题。欢迎讨论。上面不清楚的是,我们在爬取数据时,通常不会只爬取网页当前页面的数据,而是经常在翻页后继续爬取数据。本文将向大家介绍GooSeeker网络爬虫是如何在爬取时自动爬取数据的。
  站长之家注:在大数据时代,如何有效获取数据已成为驱动业务决策的关键技能。分析市场趋势、监控竞争对手等都需要数据采集。网页抓取是数据采集的主要方法之一。在这篇文章中,Chris是如何从网页的源代码中抓取到他想要的数据,但是在源代码中还是有很多数据是看不到的。显示的金额是25000。如上图,我想得到红框中“保本”的金额,但是通过查看网页的源代码,发现保证金的金额在源代码。
  Web Scraper 插件允许您以“所见即所得”的方式选择要提取的网页数据形成模板,以后可以随时执行,执行结果可以导出为 CSV 格式。网页爬虫对比类可以获取数据但是不能在页面上渲染问题描述:我获取到了所有的数据,js写的console.log(音乐)数据打印正确,但是页面上不显示。多次对数。
  我是按照你的方法修改的,不知道是不是网页结构的原因。爬取的数据有空白是因为怕爬虫爬不到介绍。本期文章主要介绍了“必须知道”的14条采集数据网站,解决工作中90%以上的问题!以及相关的经验技巧,文章约2725字,278浏览量,6个赞,值得推荐!在日常生活中。

vba xmlhttp 抓取网页(我对Google表格抓取了解不多我无法正确获取数据(图) )

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2022-04-11 18:14 • 来自相关话题

  vba xmlhttp 抓取网页(我对Google表格抓取了解不多我无法正确获取数据(图)
)
  用户名
  我应该如何抓取这个页面,具体需要表中提到的ROE数?
  我在 Excel 中使用了以下代码。我对 Google 表格抓取了解不多
   Sub FetchData()
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;https://www.bseindia.com/stock ... ot%3B, Destination:=Range( _
"$A$1"))
.Name = "www"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
  我无法正确获取数据。
  有什么建议/帮助吗? ROE图是必须的,其余的不需要。
  QHarr
  使用页面可以更快地使用其 API。您可以使用 powerquery 来处理 json 响应、json 解析器或只是拆分。如果您想在按钮按下时刷新,请将代码放在标准模块中并链接到按钮。
  Option Explicit
Public Sub GetInfo()
Dim s As String, ids(), i As Long
ids = Array(500820, 500312, 500325, 532540)
With CreateObject("MSXML2.XMLHTTP")
For i = LBound(ids) To UBound(ids)
.Open "GET", "https://api.bseindia.com/BseIn ... ot%3B & ids(i) & "&seriesid=", False
.send
s = .responseText
ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0)
Next
End With
End Sub 查看全部

  vba xmlhttp 抓取网页(我对Google表格抓取了解不多我无法正确获取数据(图)
)
  用户名
  我应该如何抓取这个页面,具体需要表中提到的ROE数?
  我在 Excel 中使用了以下代码。我对 Google 表格抓取了解不多
   Sub FetchData()
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;https://www.bseindia.com/stock ... ot%3B, Destination:=Range( _
"$A$1"))
.Name = "www"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
  我无法正确获取数据。
  有什么建议/帮助吗? ROE图是必须的,其余的不需要。
  QHarr
  使用页面可以更快地使用其 API。您可以使用 powerquery 来处理 json 响应、json 解析器或只是拆分。如果您想在按钮按下时刷新,请将代码放在标准模块中并链接到按钮。
  Option Explicit
Public Sub GetInfo()
Dim s As String, ids(), i As Long
ids = Array(500820, 500312, 500325, 532540)
With CreateObject("MSXML2.XMLHTTP")
For i = LBound(ids) To UBound(ids)
.Open "GET", "https://api.bseindia.com/BseIn ... ot%3B & ids(i) & "&seriesid=", False
.send
s = .responseText
ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0)
Next
End With
End Sub

vba xmlhttp 抓取网页(《VBA信息获取与处理》教程之HTML与HTML)

网站优化优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-04-11 12:00 • 来自相关话题

  vba xmlhttp 抓取网页(《VBA信息获取与处理》教程之HTML与HTML)
  【分享成果,为正能量而欢欣鼓舞】“人情如纸,世界如一盘棋”,对外界叠加期待,简直是在骚扰自己。世事跌宕起伏,学会放弃依赖,降低期望,控制敏感,多一些冷漠,顺其自然,更容易得到意想不到的快乐。
  《VBA信息获取与处理》教程是我推出的第六套教程,目前是第一次改版。这套教程定位在最高级的水平。这是针对初学者和中级的教程。本教程将为大家讲解:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO对象的使用、获取工作表和文件夹信息、图形信息获取、自定义工作表信息功能等。程序文件在32位和64位OFFICE系统上测试。非常抽象,更有研究价值。
  本课程由两卷八十四讲组成。今天的内容是话题八《VBA与HTML文档》:文档访问端口DOM
  
  第 5 节 HTML 文档访问端口 DOM(文档对象模型)
  大家好,我们继续研究HTML文档。在前面的部分中,我们了解了 Web 文档中的各种元素,那么我们如何访问它们,以及如何实现它们呢?实际上,HTML 文档提供了访问其元素的端口,即 HTML DOM,它定义了一组标准的机制,用于访问或操作 HTML 文档中的对象。 HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换句话说,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。
  1 HTML DOM(文档对象模型)对象集合
  加载到浏览器中的每个 HTML 文档都成为一个 Document 对象。 Document 对象使我们能够从脚本访问 HTML 页面中的所有元素。 Document 对象是 HTML 文档的根节点。
  特别说明:Document对象是Window对象的一部分,可以通过window.document属性访问。
  集合说明
  all[] 提供对文档中所有 HTML 元素的访问。
  anchors[] 返回对文档中所有 Anchor 对象的引用。
  applet 返回对文档中所有 Applet 对象的引用。
  forms[] 返回对文档中所有 Form 对象的引用。
  images[] 返回对文档中所有 Image 对象的引用。
  links[] 返回对文档中所有 Area 和 Link 对象的引用。
  VBA 直接支持有限数量的对象调用,如下:
  对象描述
  Document代表整个HTML文档,可以用来访问页面中的所有元素
  锚点代表元素的集合
  body代表元素
  表单代表元素的集合
  框架表示元素或元素的集合
  图片代表
  元素的集合
  链接代表元素的集合
  Options表示元素的集合(可以直接在select元素中使用)
  Cells表示元素的集合(可以直接用在表格元素中)
  Rows表示元素的集合(可以直接用在表格元素中)
  提供对文档中所有 HTML 元素的访问的所有对象的集合。
  上面的VBA支持直接调用对象的元素,调用起来很方便。可以通过序号调用,比如forms(0),也可以通过name/ID调用,比如forms("name/ID")。其他不能直接调用对象的元素可以间接调用元素或者DOM对象对应的元素来自一般的所有对象集合。
  (待续)
  本节知识点介绍:
  HTML DOM 文档的属性有哪些,常用的属性有哪些。
  本节参考:008 Worksheet.xlsm
  
  我 20 多年的 VBA 实践经验全部浓缩为以下教程,按顺序排列:
  
  【分享成果,快乐正能量】只要身体健康平安,人生就是最充实的人生,人生就是最美好的一天。 查看全部

  vba xmlhttp 抓取网页(《VBA信息获取与处理》教程之HTML与HTML)
  【分享成果,为正能量而欢欣鼓舞】“人情如纸,世界如一盘棋”,对外界叠加期待,简直是在骚扰自己。世事跌宕起伏,学会放弃依赖,降低期望,控制敏感,多一些冷漠,顺其自然,更容易得到意想不到的快乐。
  《VBA信息获取与处理》教程是我推出的第六套教程,目前是第一次改版。这套教程定位在最高级的水平。这是针对初学者和中级的教程。本教程将为大家讲解:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO对象的使用、获取工作表和文件夹信息、图形信息获取、自定义工作表信息功能等。程序文件在32位和64位OFFICE系统上测试。非常抽象,更有研究价值。
  本课程由两卷八十四讲组成。今天的内容是话题八《VBA与HTML文档》:文档访问端口DOM
  
  第 5 节 HTML 文档访问端口 DOM(文档对象模型)
  大家好,我们继续研究HTML文档。在前面的部分中,我们了解了 Web 文档中的各种元素,那么我们如何访问它们,以及如何实现它们呢?实际上,HTML 文档提供了访问其元素的端口,即 HTML DOM,它定义了一组标准的机制,用于访问或操作 HTML 文档中的对象。 HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换句话说,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。
  1 HTML DOM(文档对象模型)对象集合
  加载到浏览器中的每个 HTML 文档都成为一个 Document 对象。 Document 对象使我们能够从脚本访问 HTML 页面中的所有元素。 Document 对象是 HTML 文档的根节点。
  特别说明:Document对象是Window对象的一部分,可以通过window.document属性访问。
  集合说明
  all[] 提供对文档中所有 HTML 元素的访问。
  anchors[] 返回对文档中所有 Anchor 对象的引用。
  applet 返回对文档中所有 Applet 对象的引用。
  forms[] 返回对文档中所有 Form 对象的引用。
  images[] 返回对文档中所有 Image 对象的引用。
  links[] 返回对文档中所有 Area 和 Link 对象的引用。
  VBA 直接支持有限数量的对象调用,如下:
  对象描述
  Document代表整个HTML文档,可以用来访问页面中的所有元素
  锚点代表元素的集合
  body代表元素
  表单代表元素的集合
  框架表示元素或元素的集合
  图片代表
  元素的集合
  链接代表元素的集合
  Options表示元素的集合(可以直接在select元素中使用)
  Cells表示元素的集合(可以直接用在表格元素中)
  Rows表示元素的集合(可以直接用在表格元素中)
  提供对文档中所有 HTML 元素的访问的所有对象的集合。
  上面的VBA支持直接调用对象的元素,调用起来很方便。可以通过序号调用,比如forms(0),也可以通过name/ID调用,比如forms("name/ID")。其他不能直接调用对象的元素可以间接调用元素或者DOM对象对应的元素来自一般的所有对象集合。
  (待续)
  本节知识点介绍:
  HTML DOM 文档的属性有哪些,常用的属性有哪些。
  本节参考:008 Worksheet.xlsm
  
  我 20 多年的 VBA 实践经验全部浓缩为以下教程,按顺序排列:
  
  【分享成果,快乐正能量】只要身体健康平安,人生就是最充实的人生,人生就是最美好的一天。

vba xmlhttp 抓取网页(MFaizanFarooqExcel工作表中的地址字段变为空白结果(r,4) )

网站优化优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2022-04-08 05:17 • 来自相关话题

  vba xmlhttp 抓取网页(MFaizanFarooqExcel工作表中的地址字段变为空白结果(r,4)
)
  M费赞法鲁克
  Excel 工作表中的地址字段变为空白
  结果(r, 4) = comment("街道地址")
  在网页抓取期间;我正在从 网站 导入字段并相应地导入数据,请指导我。
  表 A1 =
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", Sheet1.Range("A1") & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
ThisWorkbook.Worksheets(sheetName).ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = review("streetAddress") 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .Test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
  我一直在尝试获取以下代码的地址范围,我是 VBA 新手,因此将不胜感激。
  哈尔
  地址的json访问路径不同
  review("address") 给出字典
  
  您需要按键访问各个行,或者像我一样,连接字典的所有项目以为完整地址创建一个空格分隔的字符串。
  VBA:
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", "https://www.yellowpages.com/at ... ot%3B & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
Set ws = ThisWorkbook.Worksheets(sheetName)
ws.Cells.ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = Replace$(Join$(review("address").items, " "), "PostalAddress ", vbNullString) 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function 查看全部

  vba xmlhttp 抓取网页(MFaizanFarooqExcel工作表中的地址字段变为空白结果(r,4)
)
  M费赞法鲁克
  Excel 工作表中的地址字段变为空白
  结果(r, 4) = comment("街道地址")
  在网页抓取期间;我正在从 网站 导入字段并相应地导入数据,请指导我。
  表 A1 =
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", Sheet1.Range("A1") & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
ThisWorkbook.Worksheets(sheetName).ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = review("streetAddress") 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .Test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
  我一直在尝试获取以下代码的地址范围,我是 VBA 新手,因此将不胜感激。
  哈尔
  地址的json访问路径不同
  review("address") 给出字典
  
  您需要按键访问各个行,或者像我一样,连接字典的所有项目以为完整地址创建一个空格分隔的字符串。
  VBA:
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", "https://www.yellowpages.com/at ... ot%3B & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
Set ws = ThisWorkbook.Worksheets(sheetName)
ws.Cells.ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = Replace$(Join$(review("address").items, " "), "PostalAddress ", vbNullString) 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function

vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)

网站优化优采云 发表了文章 • 0 个评论 • 132 次浏览 • 2022-03-30 21:03 • 来自相关话题

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 &#39;row
For j = 0 To tb(H).Cells.Length - 1 &#39;cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
&#39;创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
&#39;发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
&#39;等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
&#39;得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。 查看全部

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 &#39;row
For j = 0 To tb(H).Cells.Length - 1 &#39;cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
&#39;创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
&#39;发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
&#39;等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
&#39;得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。

vba xmlhttp 抓取网页( 我的代码:PublicSubRoupa() )

网站优化优采云 发表了文章 • 0 个评论 • 108 次浏览 • 2022-03-16 01:07 • 来自相关话题

  vba xmlhttp 抓取网页(
我的代码:PublicSubRoupa()
)
  Excel VBA 跨多个网页抓取
  excelvbaweb-scraping
  Excel VBA 跨多个网页数据抓取,效果很好。我现在的“问题”是我需要为多个网页运行代码,因为我正在抓取的 网站 有一个分页脚本。一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。我的代码:Public Sub Roupa()Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
  所以我有以下代码从 网站 中删除数据,它工作正常。
  我现在的“问题”是我需要为多个页面运行代码,因为我正在抓取的 网站 有一个分页脚本。
  一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。
  我的代码:
  Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.worten.pt/grandes- ... ot%3B, False
.send
html.body.innerHTML = .responseText
End With
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
  Public子组a()
Dim数据作为对象,i作为长,html作为HTMLDocument,r作为长,c作为长,item作为对象,div作为对象
设置html=New HTMLDocument'Tools>References>Microsoft html对象库
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://www.worten.pt/grandes- ... 3D100”“错
邮寄
html.body.innerHTML=.responseText

Set data=html.getElementsByClassName(“w-product\u内容”)
对于数据中的每个项目
r=r+1:c=1
对于item.getElementsByTagName(“div”)中的每个div
使用此工作簿。工作表(“组A”)
.Cells(r,c)=div.innerText

c=c+1
下一个
下一个
表格(“A”)。范围(“A:A,C:C,F:F,G:G,H:H,I:I”)。全部删除
端接头
  更新
  我尝试过使用
  的
  在 n=1 到 2 之前添加这个
  ,但我需要知道确切的页数,这样就没有什么帮助了。通过将结果计数除以每页的结果来计算出有多少页。然后执行一个循环,将适当的页码连接到url上</p>
Option Explicit
Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
Const RESULTS_PER_PAGE As Long = 48
Const START_URL As String = "https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", START_URL, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
Dim numPages As Long, numResults As Long, arr() As String
arr = Split(html.querySelector(".w-filters__element").innerText, Chr$(32))
numResults = arr(UBound(arr))
numPages = 1
If numResults > RESULTS_PER_PAGE Then
numPages = Application.RoundUp(numResults / RESULTS_PER_PAGE, 0)
End If
For i = 1 To numPages
If i > 1 Then
.Open "GET", Replace$("https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1", "page=1", "page=" & i), False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
End If
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Next
End With
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
</p>
  如果您尝试在 URL 中更改它-
  每页=100
  说
  每页=100000
  ?我试过了,实际上页面只加载了48条记录
  每页=100
  @QHarr 已经提供了我的尝试
  w-filters\uu元素
  导出页数的好方法。但是,另一种方法(我通常使用的)是循环(增加页数)直到分页之后
  列表元素的
  在内部文本中查找下一个页码(在这种情况下,
  分页文本中心
  或 Div 类
  w-pagination-block
  ) 该死的你是个天才! !你有好的课程吗?我想了解更多! !和
  numPages = html.querySelectorAll("[data-page]").Length 查看全部

  vba xmlhttp 抓取网页(
我的代码:PublicSubRoupa()
)
  Excel VBA 跨多个网页抓取
  excelvbaweb-scraping
  Excel VBA 跨多个网页数据抓取,效果很好。我现在的“问题”是我需要为多个网页运行代码,因为我正在抓取的 网站 有一个分页脚本。一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。我的代码:Public Sub Roupa()Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
  所以我有以下代码从 网站 中删除数据,它工作正常。
  我现在的“问题”是我需要为多个页面运行代码,因为我正在抓取的 网站 有一个分页脚本。
  一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。
  我的代码:
  Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.worten.pt/grandes- ... ot%3B, False
.send
html.body.innerHTML = .responseText
End With
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
  Public子组a()
Dim数据作为对象,i作为长,html作为HTMLDocument,r作为长,c作为长,item作为对象,div作为对象
设置html=New HTMLDocument'Tools>References>Microsoft html对象库
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://www.worten.pt/grandes- ... 3D100”“错
邮寄
html.body.innerHTML=.responseText

Set data=html.getElementsByClassName(“w-product\u内容”)
对于数据中的每个项目
r=r+1:c=1
对于item.getElementsByTagName(“div”)中的每个div
使用此工作簿。工作表(“组A”)
.Cells(r,c)=div.innerText

c=c+1
下一个
下一个
表格(“A”)。范围(“A:A,C:C,F:F,G:G,H:H,I:I”)。全部删除
端接头
  更新
  我尝试过使用
  的
  在 n=1 到 2 之前添加这个
  ,但我需要知道确切的页数,这样就没有什么帮助了。通过将结果计数除以每页的结果来计算出有多少页。然后执行一个循环,将适当的页码连接到url上</p>
Option Explicit
Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
Const RESULTS_PER_PAGE As Long = 48
Const START_URL As String = "https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", START_URL, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
Dim numPages As Long, numResults As Long, arr() As String
arr = Split(html.querySelector(".w-filters__element").innerText, Chr$(32))
numResults = arr(UBound(arr))
numPages = 1
If numResults > RESULTS_PER_PAGE Then
numPages = Application.RoundUp(numResults / RESULTS_PER_PAGE, 0)
End If
For i = 1 To numPages
If i > 1 Then
.Open "GET", Replace$("https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1", "page=1", "page=" & i), False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
End If
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Next
End With
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
</p>
  如果您尝试在 URL 中更改它-
  每页=100
  说
  每页=100000
  ?我试过了,实际上页面只加载了48条记录
  每页=100
  @QHarr 已经提供了我的尝试
  w-filters\uu元素
  导出页数的好方法。但是,另一种方法(我通常使用的)是循环(增加页数)直到分页之后
  列表元素的
  在内部文本中查找下一个页码(在这种情况下,
  分页文本中心
  或 Div 类
  w-pagination-block
  ) 该死的你是个天才! !你有好的课程吗?我想了解更多! !和
  numPages = html.querySelectorAll("[data-page]").Length

vba xmlhttp 抓取网页(VBA编程中常用“积木”过程代码(288期))

网站优化优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-03-06 11:24 • 来自相关话题

  vba xmlhttp 抓取网页(VBA编程中常用“积木”过程代码(288期))
  天涯海角,风景如画,别蜷缩在世界的一小块以为是天堂的地方。当你处于暮年时,你会满足于欺骗自己和他人。你必须努力提高自己。学习是一件非常困难的事情。拥有一颗充满活力的心,把握当下,这就是进步。机会总是在等待,越有意义的事情,困难就越多。意愿决定一切,智慧决定成败。找到内心的平静;无论遇到什么,都是一道风景。善良,行善。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。让浮躁的心平静下来,感受实时,静下心来,多学习,积福。保持快乐的心态,坚定而执着。学习有用的知识,管理好自己,而不是每天乱七八糟,过日子。为后疫情时代储备知识。在未来更严重的杀股世界中,为自己的生存储备知识,尤其是新知识。
  在取代OFFICE的新办公软件出现之前,谁的数据处理能力最好,谁就是王者。技巧的巅峰莫过于VBA!
  今天继续给大家分享VBA编程中常用的“积木”流程代码。这个内容大部分是我的经历的记录,来源于我多年的经验。最近大部分代码来自《VBA数组和字典解决方案》教程。有朋友反映分享的内容看不懂。大家可以参考这套教材的内容进行学习。今天的分享是第288期。
  
  VBA程序代码288:使用工作表函数将字典的键值按大小排序,并给出对应的键
  子 MyNZ ()
  昏暗的奔跑
  表(“60”)。选择
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  TT = 单元格(Rows.Count,1).End(xlUp).Row
  For Each run In Sheets("60").Range("a2:a" &amp; Cells(Rows.Count, 1).End(xlUp).Row)
  如果运行.Value "" 那么
  If Not mydic.exists(ran.Value) Then
  mydic.Add ran.Value, 1 '需要注意的是这里要加上VALUE
  别的
  mydic(ran.Value) = mydic(ran.Value) + 1
  万一
  万一
  下一个
  '注意这里取出字典的键和键值
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 1) = Application.Large(K, i) '将数据按照最大值的顺序放入数组中
  X(i, 2) = mydic(X(i, 1)) '提取对应的key值
  下一个
  我的计数 = i - 1
  设置 mydic = 无
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  对于 i = 1 到 MYCOUNT
  mydic(X(i, 1)) = X(i, 2)
  下一个
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 2) = Application.Max(T)
  '找到钥匙的位置
  W = Application.Match(X(i, 2), T, 0) - 1
  ' 提取密钥
  X(i, 1) = K(W)
  '对应键值变空使用MAX函数
  T(W) = ""
  下一个
  [e:f].清除
  [E1] = "排序": [f1] = "重复次数"
  Sheets("60").[E2].Resize(mydic.Count, 2) = X
  设置 mydic = 无
  结束子
  代码分析:上述过程实现了将数据加载到字典mydic中,将值放入字典的key中,将出现次数放入key值中,然后将key和key值放入分别是数组 K 和 T。请注意,它是一维的。数组,然后对值进行排序,使用大函数,排序完成后,再次加载字典,取出key和key值,这里处理的目的是得到一维数组,或者其他处理方式可以使用,然后对key值进行排序,使用MAX函数,最后形成对value出现次数排序再对value排序的结果,放入数组X中,最后回填数据.
  
  VBA是使用Office实现自己的小型办公自动化的一种有效方式。基于我20多年的VBA实践经验,我现在已经推出了四期VBA学习教程,这也是我“积木式编程”思想的具体体现。
  第一:VBA代码解法是对VBA中各个知识点的讲解。本教程可以涵盖大部分知识点;
  第二:VBA数据库解决方案是数据处理的专业工具。详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作。
  第三:VBA数组和字典解决方案,讲解VBA中数组和字典的使用。字典是提高VBA代码水平的一种手段,值得深入研究。
  第四:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。
  以上教程的学习顺序,1、3、2或4、3、2逐渐加深对VBA的理解,掌握VBA。目前正集中精力写第五篇教程:VBA中类的解释与利用。在所有平台上认识所有人。
  使用VBA实现小型个人办公自动化,非常值得学习。希望每个人都能掌握这个工具,用这个工具让自己的工作变得轻松、高效、快乐。我的“积木式编程”理念也值得借鉴。这个想法让大家从代码中解放出来,以模块的形式构建自己的应用程序,提高了他们的编程效率。根据我提供的经验,花时间了解更多信息。 查看全部

  vba xmlhttp 抓取网页(VBA编程中常用“积木”过程代码(288期))
  天涯海角,风景如画,别蜷缩在世界的一小块以为是天堂的地方。当你处于暮年时,你会满足于欺骗自己和他人。你必须努力提高自己。学习是一件非常困难的事情。拥有一颗充满活力的心,把握当下,这就是进步。机会总是在等待,越有意义的事情,困难就越多。意愿决定一切,智慧决定成败。找到内心的平静;无论遇到什么,都是一道风景。善良,行善。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。让浮躁的心平静下来,感受实时,静下心来,多学习,积福。保持快乐的心态,坚定而执着。学习有用的知识,管理好自己,而不是每天乱七八糟,过日子。为后疫情时代储备知识。在未来更严重的杀股世界中,为自己的生存储备知识,尤其是新知识。
  在取代OFFICE的新办公软件出现之前,谁的数据处理能力最好,谁就是王者。技巧的巅峰莫过于VBA!
  今天继续给大家分享VBA编程中常用的“积木”流程代码。这个内容大部分是我的经历的记录,来源于我多年的经验。最近大部分代码来自《VBA数组和字典解决方案》教程。有朋友反映分享的内容看不懂。大家可以参考这套教材的内容进行学习。今天的分享是第288期。
  
  VBA程序代码288:使用工作表函数将字典的键值按大小排序,并给出对应的键
  子 MyNZ ()
  昏暗的奔跑
  表(“60”)。选择
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  TT = 单元格(Rows.Count,1).End(xlUp).Row
  For Each run In Sheets("60").Range("a2:a" &amp; Cells(Rows.Count, 1).End(xlUp).Row)
  如果运行.Value "" 那么
  If Not mydic.exists(ran.Value) Then
  mydic.Add ran.Value, 1 '需要注意的是这里要加上VALUE
  别的
  mydic(ran.Value) = mydic(ran.Value) + 1
  万一
  万一
  下一个
  '注意这里取出字典的键和键值
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 1) = Application.Large(K, i) '将数据按照最大值的顺序放入数组中
  X(i, 2) = mydic(X(i, 1)) '提取对应的key值
  下一个
  我的计数 = i - 1
  设置 mydic = 无
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  对于 i = 1 到 MYCOUNT
  mydic(X(i, 1)) = X(i, 2)
  下一个
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 2) = Application.Max(T)
  '找到钥匙的位置
  W = Application.Match(X(i, 2), T, 0) - 1
  ' 提取密钥
  X(i, 1) = K(W)
  '对应键值变空使用MAX函数
  T(W) = ""
  下一个
  [e:f].清除
  [E1] = "排序": [f1] = "重复次数"
  Sheets("60").[E2].Resize(mydic.Count, 2) = X
  设置 mydic = 无
  结束子
  代码分析:上述过程实现了将数据加载到字典mydic中,将值放入字典的key中,将出现次数放入key值中,然后将key和key值放入分别是数组 K 和 T。请注意,它是一维的。数组,然后对值进行排序,使用大函数,排序完成后,再次加载字典,取出key和key值,这里处理的目的是得到一维数组,或者其他处理方式可以使用,然后对key值进行排序,使用MAX函数,最后形成对value出现次数排序再对value排序的结果,放入数组X中,最后回填数据.
  
  VBA是使用Office实现自己的小型办公自动化的一种有效方式。基于我20多年的VBA实践经验,我现在已经推出了四期VBA学习教程,这也是我“积木式编程”思想的具体体现。
  第一:VBA代码解法是对VBA中各个知识点的讲解。本教程可以涵盖大部分知识点;
  第二:VBA数据库解决方案是数据处理的专业工具。详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作。
  第三:VBA数组和字典解决方案,讲解VBA中数组和字典的使用。字典是提高VBA代码水平的一种手段,值得深入研究。
  第四:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。
  以上教程的学习顺序,1、3、2或4、3、2逐渐加深对VBA的理解,掌握VBA。目前正集中精力写第五篇教程:VBA中类的解释与利用。在所有平台上认识所有人。
  使用VBA实现小型个人办公自动化,非常值得学习。希望每个人都能掌握这个工具,用这个工具让自己的工作变得轻松、高效、快乐。我的“积木式编程”理念也值得借鉴。这个想法让大家从代码中解放出来,以模块的形式构建自己的应用程序,提高了他们的编程效率。根据我提供的经验,花时间了解更多信息。

vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2022-03-03 08:02 • 来自相关话题

  vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)
  《VBA信息获取与处理》教程第八题“VBA与HTML文档”第七节“HTML DOM的对象事件与关联”太无聊了。希望想掌握这方面知识的朋友可以参考我的教程。. 今天我们开始学习“使用IE捕获网络数据”的第九个话题。
  在我们的网页抓取部分,在讲解了XMLHTTP方法之后,我们利用两个题目的进度,讲解了一些与VBA不太相关的网络知识。这两个话题对于我们重新认识网络抓取数据具有重要意义。,虽然我的解释不能包罗万象,但是对于我经常提倡的VBA定位来说已经足够了。此外,学习是一个不断积累和进步的过程。你需要掌握的是一些基本的理论,然后把它们应用到自己身上。在实践中,这是关键。从这个话题开始,我们继续我们对网络爬虫的研究。本主题是使用IE爬取网络数据。其实就是使用控件来完成我们的工作。
  第一部分使用IE方法提取网页数据的基础
  为了获取网页的数据,我们可以创建IE控件或者webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
  该方法可以模拟大多数浏览器操作。浏览器能看到的数据可以通过代码获取,但是有个致命的缺点:除了烦人的弹窗,兼容性确实是个很烦人的问题。在我自己的实践中,感觉这种方法不是很稳定(只是感觉)。
  1 IE模型的创建
  我们在实际工作中遇到网站和网页相关的问题,比如:如何下载网页数据?网页之间的通信是如何实现的,是否可以控制等等。如果你是用VB/VBA/脚本或者其他支持自动化对象(AUTOMATION)的语言编程,一个值得知道的方法是掌握对象模型:把网页当作对象来控制,这个方法需要了解自动化对象IE (InternetExplorer.Application) 或 IE 控件 (Microsoft Internet Controls) 以及标准的文档对象模型 (Document)。前两个题目我已经讲解了很多相关知识,这里就不详细讲解了。
  我给出以下代码:
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate "about:blank" '创建一个空白页面
  以上几行代码的作用是创建一个IE应用对象,打开一个空白网页。这个网页独立于VBA应用程序(WORD或EXCEL),其实你得自己关闭,或者使用ie.Quit命令退出——注意,简单关闭VBA或者SET ie=nothing不会退出这个页面. 我们经常使用的是把第 3 行的字符串替换成 网站 的名字,或者你主机中的文档名,或者图片名,这样都可以。它与通过在 IE 地址栏中键入名称来浏览这些文档具有相同的效果。
  如果只是创建一个空模型没有任何使用价值,我们需要一个真实的网页,那么我们需要在VBA应用程序之外打开一个完整的网页,直到网页完全加载。下面继续。
  2 IE网页加载
  让我们修复上面打开一个空网页的代码:
  子 mynz()
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate " " '创建一个空白页面
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  结束子
  在上面的代码中添加了几行:
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  这几行代码可以保证网页的加载完成,根据ie.ReadyState的返回值来判断。
  readyState 中有 5 个状态:
  状态含义描述
  0 未初始化对象已创建,但尚未初始化(尚未调用open方法)
  1 初始化对象已经建立,send方法还没有被调用
  2 发送数据的send()方法已经调用,但当前状态和http头未知
  3 数据传输中已经收到了一些数据,由于response和http header不完整,那么通过responseBody和responseText获取一些数据时会报错
  4 收到数据后,可以通过responseBody和responseText获取完整的响应数据
  通过上面的分析可以看出,只有当.ReadyState = 4时,网页的数据才是有效数据。
  3 获取IE页面数据
  当网页加载完毕后,剩下的工作就是从网页中抓取数据。数据抓取主要是利用控件对象的属性和方法。
  1)使用Set doc = ie.Document 获取网页的文档对象
  从表示网页内容的文档对象(Document)扩展而来的对象模型与之前的IE应用程序不是一个系统。
  Documnet(文档)是一个文档对象模型,相当于OFFICE对象中的APPLICATION。获取到Document之后,无论是修改网页,读取还是写入网页,还是触发事件,一切都好说,每一个URL对应一个Documnet(这就是如果某一个Navigate to的成功导航那个URL是完整的,所以需要先判断IE对象READSTATE才能判断该URL对应的Document是否打开)
  2) 在Documnet下可以获得documentElement和body这两个节点。
  您可以使用以下语句:
  set xbody=doc.Body '获取正文对象
  set xDoc=doc.documentElement '获取根节点
  前面说过,body相当于被标记的对象,根节点相当于网页中被标记的元素对象。在 MHTML 类型库定义中,它们都属于 HTMLHtmlElement 类型的对象。我将这种类型的对象称为“节点”,但请注意,文档对象不是节点对象,它是 HTMLDocument 类型。根节点和正文节点的区别在于,根节点包括整个网页。在 HTML 的文档对象模型中,这种类型的对象有几个属性来获取内容:
  object.innerHtml '对象内的 HTML 文本
  Object.OuterHtml '对象中的 HTML 文本,包括对象本身的 HTML 标记
  Object.innerText '对象内部的TEXT,不包括HTML标签
  Object.OuterText '同上,包括对象本身的文本
  所以,如果我们想抓取某个网站的所有HTML内容,代码可以这样写:
  设置 doc=ie.Document
  set xDoc=doc.documentElement '获取根节点
  strX=xDoc.OuterHtml '获取所有HTML内容
  3) 每个标签节点对象下,都有一个名为 ChildNodes 的集合,其中收录“该节点下的标签”,就像一个文件目录,根目录下的一个子目录。
  我们可以看到:HTML标签是文档的根节点,是Document的Childnodes集合的成员(Document不是节点,它是另一种类型的对象,上层文档,但它可以有下层节点集合,就像一个磁盘可以有一个从属目录,但它本身不是一个目录),BODY是根节点的ChildNodes集合的成员,DIV和P节点是ChildNodes集合的两个成员BODY,也有自己的 Childnoes 系列。
  我们要注意:在文档对象模型中,集合不同于OFFICE的集合。集合从 0 开始计数,count 属性是 Length 而不是 Count。
  4)除了 ChildNodes 集合之外,Web 文档对象中最常见的集合是 All 集合,这是“最混乱”的集合。各级文档和节点都有这个集合。集合,顾名思义,是非分层的,但使用起来也很方便:
  设置 doc=ie.Document
  Set xCols=doc.All '获取文档中的所有节点集
  Set xbCols=doc.body.All '获取body节点下的所有节点集
  尽管任何标记的节点都有一个 ALL 集合,但我们仍然喜欢使用 DOCUMENT 的 ALL,没有其他原因。文档最大,一锅ALL最适合找。所有查找都是有条件的:如果标签没有 ID,则无法查找其名称。
  但是,ALL 集合有一个非常方便的特性:可以将 ID 附加到 ALL 集合:
  strX=doc.All.mytag.innerhtml
  5)要获取文档对象的getElementsByName集合,可以使用以下方法:
  set mydivs=doc.getElementsByName("div") '获取所有DIV标签,注意采集
  6) 文档对象的FORMS集合,因为大部分网页数据提交都是通过FORM标签提交的:
  Set myForms=doc.Forms '获取所有FORM标签
  设置 frmX=myForms.item(0) '第一个 FORM
  FORM标签节点所代表的对象是很多朋友关心的内容——在网页对象中,它可以向服务器发送数据,使服务器刷新网页(实际上服务器按照一个一定的格式协议),我们可以向网页发送数据。FORM被视为远程函数调用接口。FORM标签中ACTION指向的URL地址就是函数入口,FORM标签中的每个INPUT标签节点都是函数的参数。发出 FORM.Submit 方法时,将远程调用该函数。现在,在服务器端,比如ASP,PHP就是老老实实的找FORM的参数,不管你用GET还是POST:
  frmX.submit '相当于用户在页面按下FORM的发送按钮
  上面我列出了获取网页数据的一般方法,使用上没有特殊要求。您可以根据自己的习惯使用它们。本题后面的内容就是灵活运用这些知识点解决实际问题。
  
  回到本节的知识点:
  如何提交表格?如何下载图片的地址?如何获取表的数据?
  
  块编程思想的内涵:
  在我的系列书中,我一直在强调“积木”的编程思想,这也是学习使用VBA的主要方法,尤其是对于专业人士来说,采用这种方案是很有必要的。其主要内涵:
  1 不要自己输入所有代码。你要做的就是把块放在正确的地方,然后修复代码,一定要复制它,从你的构建块库中复制它,然后修复代码并利用时间来有效地思考。
  2 建立自己的“块库”。平时在学习的过程中,把自己觉得有用的代码放在一起,多积累,随时用。您在构建块库中拥有的信息越多,您的编程思想就会越广泛。
  
  VBA的应用定义
  VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对 VBA 的应用程序定义。在取代OFFICE的新办公软件出现之前,谁能在数据处理上做到极致,谁就是王者。技巧的巅峰莫过于VBA!
  记得20年前第一次学VBA的时候,当时资料很少,只能看源码搞清楚,真的很难。20年过去了,为了不让学VBA的朋友重复我之前的经历,我结合自己多年的VBA实践经验,推出了六篇VBA专题教程:
  第一组:VBA代码解法是对VBA中各个知识点的讲解。总共147课,涵盖了初学者必备的大部分VBA知识点;
  第二套:VBA数据库解决方案 数据库是专业的数据处理工具。教程中详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作,适合中级学习。
  第三套:VBA数组和字典解决方案数组和字典是VBA的精髓,字典是提高VBA代码水平的有效手段,值得深入研究,是初级和中级人员学习的一种手段改进代码。
  第四套:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。这套教程是第一套教程的视频讲解,听元音比较容易。
  第五套:VBA中类的解释与利用这是一门进阶课程,讲解类的虚无和肉身的程度。虽然类的使用较少,但认真学习可以促进自身VBA理论的提高。对这套课程的领悟,主要是读者的领悟,对一种佛教哲学的领悟。
  第六套教程:《VBA信息获取与处理》,这是一个高级教程,涵盖范围更广,实用性更强,面向中高级人员。教程共有20个主题,包括:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO的使用对象,获取工作表和文件夹信息,获取图形信息,自定义工作表信息等功能。
  您可以按照1→3→2→6→5或4→3→2→6→5的顺序根据以上信息逐步深入学习。教程提供讲解并提供大量积木,如有需要可以微信:NZ9668
  
  学习VBA是一个过程,也需要体验一下枯燥的感觉
  如太白诗云:百鸟高飞,孤云独闲。相见不厌,唯有敬亭山。学习的过程也是修心的过程,修心平和。在码字的世界里,心静,心情好,身体自然就好。当心平静时,它是正义的。心中没有那么多的邪见邪见,也没有那么多的妄想。利益他人就是利益自己。这些教程也是为了帮助你起航,帮助我。我上面的教程是我经验的传递。
  “水无争,万物皆好。” 学习也是如此,知道自己需要什么,不蜷缩在世界的一小块认为自己是天堂的地方,以及自欺欺人的言论直到年老。努力提高自己,以充满活力的精神把握现在,这就是进步。越有意义的事情,就越难。意愿决定一切,智慧决定成败。无论遇到什么,都是风景。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。感受真实的时间,静下心来,多了解,积福报。与其天天闹着玩,不如天天过日子。在杀鸡更严重的后疫情世界,储备知识,尤其是新知识,为自己生存。学习时是渺小而无声的,使用时是巨大而汹涌的。
  每一次收获都是成长的记录。怎么可能没有证据?正是这种执着,让晨曦绽放出灿烂的光芒。最后,给致力于VBA学习的朋友一句话,让大家感受一下枯燥而执着的学习过程:
  乌云掠过,暗语无声,
  只有微风,惊动了梦中的莺。
  看星星,疏散北斗七星,
  钦奈将与过去的鹅一起去。
  陌生人,昏暗的灯光,
  忍着长亭。
  多少VBA人,
  在漆黑的夜里,静静地寻找梦想,期待黎明。
  多么不合理!
  回到学习和使用VBA的经历,很感慨。我想用这些话与大家分享我多年实际工作经验的成果。我想把这些有用的东西分享给真正需要使用 VBA 的旅友。 查看全部

  vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)
  《VBA信息获取与处理》教程第八题“VBA与HTML文档”第七节“HTML DOM的对象事件与关联”太无聊了。希望想掌握这方面知识的朋友可以参考我的教程。. 今天我们开始学习“使用IE捕获网络数据”的第九个话题。
  在我们的网页抓取部分,在讲解了XMLHTTP方法之后,我们利用两个题目的进度,讲解了一些与VBA不太相关的网络知识。这两个话题对于我们重新认识网络抓取数据具有重要意义。,虽然我的解释不能包罗万象,但是对于我经常提倡的VBA定位来说已经足够了。此外,学习是一个不断积累和进步的过程。你需要掌握的是一些基本的理论,然后把它们应用到自己身上。在实践中,这是关键。从这个话题开始,我们继续我们对网络爬虫的研究。本主题是使用IE爬取网络数据。其实就是使用控件来完成我们的工作。
  第一部分使用IE方法提取网页数据的基础
  为了获取网页的数据,我们可以创建IE控件或者webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
  该方法可以模拟大多数浏览器操作。浏览器能看到的数据可以通过代码获取,但是有个致命的缺点:除了烦人的弹窗,兼容性确实是个很烦人的问题。在我自己的实践中,感觉这种方法不是很稳定(只是感觉)。
  1 IE模型的创建
  我们在实际工作中遇到网站和网页相关的问题,比如:如何下载网页数据?网页之间的通信是如何实现的,是否可以控制等等。如果你是用VB/VBA/脚本或者其他支持自动化对象(AUTOMATION)的语言编程,一个值得知道的方法是掌握对象模型:把网页当作对象来控制,这个方法需要了解自动化对象IE (InternetExplorer.Application) 或 IE 控件 (Microsoft Internet Controls) 以及标准的文档对象模型 (Document)。前两个题目我已经讲解了很多相关知识,这里就不详细讲解了。
  我给出以下代码:
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate "about:blank" '创建一个空白页面
  以上几行代码的作用是创建一个IE应用对象,打开一个空白网页。这个网页独立于VBA应用程序(WORD或EXCEL),其实你得自己关闭,或者使用ie.Quit命令退出——注意,简单关闭VBA或者SET ie=nothing不会退出这个页面. 我们经常使用的是把第 3 行的字符串替换成 网站 的名字,或者你主机中的文档名,或者图片名,这样都可以。它与通过在 IE 地址栏中键入名称来浏览这些文档具有相同的效果。
  如果只是创建一个空模型没有任何使用价值,我们需要一个真实的网页,那么我们需要在VBA应用程序之外打开一个完整的网页,直到网页完全加载。下面继续。
  2 IE网页加载
  让我们修复上面打开一个空网页的代码:
  子 mynz()
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate " " '创建一个空白页面
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  结束子
  在上面的代码中添加了几行:
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  这几行代码可以保证网页的加载完成,根据ie.ReadyState的返回值来判断。
  readyState 中有 5 个状态:
  状态含义描述
  0 未初始化对象已创建,但尚未初始化(尚未调用open方法)
  1 初始化对象已经建立,send方法还没有被调用
  2 发送数据的send()方法已经调用,但当前状态和http头未知
  3 数据传输中已经收到了一些数据,由于response和http header不完整,那么通过responseBody和responseText获取一些数据时会报错
  4 收到数据后,可以通过responseBody和responseText获取完整的响应数据
  通过上面的分析可以看出,只有当.ReadyState = 4时,网页的数据才是有效数据。
  3 获取IE页面数据
  当网页加载完毕后,剩下的工作就是从网页中抓取数据。数据抓取主要是利用控件对象的属性和方法。
  1)使用Set doc = ie.Document 获取网页的文档对象
  从表示网页内容的文档对象(Document)扩展而来的对象模型与之前的IE应用程序不是一个系统。
  Documnet(文档)是一个文档对象模型,相当于OFFICE对象中的APPLICATION。获取到Document之后,无论是修改网页,读取还是写入网页,还是触发事件,一切都好说,每一个URL对应一个Documnet(这就是如果某一个Navigate to的成功导航那个URL是完整的,所以需要先判断IE对象READSTATE才能判断该URL对应的Document是否打开)
  2) 在Documnet下可以获得documentElement和body这两个节点。
  您可以使用以下语句:
  set xbody=doc.Body '获取正文对象
  set xDoc=doc.documentElement '获取根节点
  前面说过,body相当于被标记的对象,根节点相当于网页中被标记的元素对象。在 MHTML 类型库定义中,它们都属于 HTMLHtmlElement 类型的对象。我将这种类型的对象称为“节点”,但请注意,文档对象不是节点对象,它是 HTMLDocument 类型。根节点和正文节点的区别在于,根节点包括整个网页。在 HTML 的文档对象模型中,这种类型的对象有几个属性来获取内容:
  object.innerHtml '对象内的 HTML 文本
  Object.OuterHtml '对象中的 HTML 文本,包括对象本身的 HTML 标记
  Object.innerText '对象内部的TEXT,不包括HTML标签
  Object.OuterText '同上,包括对象本身的文本
  所以,如果我们想抓取某个网站的所有HTML内容,代码可以这样写:
  设置 doc=ie.Document
  set xDoc=doc.documentElement '获取根节点
  strX=xDoc.OuterHtml '获取所有HTML内容
  3) 每个标签节点对象下,都有一个名为 ChildNodes 的集合,其中收录“该节点下的标签”,就像一个文件目录,根目录下的一个子目录。
  我们可以看到:HTML标签是文档的根节点,是Document的Childnodes集合的成员(Document不是节点,它是另一种类型的对象,上层文档,但它可以有下层节点集合,就像一个磁盘可以有一个从属目录,但它本身不是一个目录),BODY是根节点的ChildNodes集合的成员,DIV和P节点是ChildNodes集合的两个成员BODY,也有自己的 Childnoes 系列。
  我们要注意:在文档对象模型中,集合不同于OFFICE的集合。集合从 0 开始计数,count 属性是 Length 而不是 Count。
  4)除了 ChildNodes 集合之外,Web 文档对象中最常见的集合是 All 集合,这是“最混乱”的集合。各级文档和节点都有这个集合。集合,顾名思义,是非分层的,但使用起来也很方便:
  设置 doc=ie.Document
  Set xCols=doc.All '获取文档中的所有节点集
  Set xbCols=doc.body.All '获取body节点下的所有节点集
  尽管任何标记的节点都有一个 ALL 集合,但我们仍然喜欢使用 DOCUMENT 的 ALL,没有其他原因。文档最大,一锅ALL最适合找。所有查找都是有条件的:如果标签没有 ID,则无法查找其名称。
  但是,ALL 集合有一个非常方便的特性:可以将 ID 附加到 ALL 集合:
  strX=doc.All.mytag.innerhtml
  5)要获取文档对象的getElementsByName集合,可以使用以下方法:
  set mydivs=doc.getElementsByName("div") '获取所有DIV标签,注意采集
  6) 文档对象的FORMS集合,因为大部分网页数据提交都是通过FORM标签提交的:
  Set myForms=doc.Forms '获取所有FORM标签
  设置 frmX=myForms.item(0) '第一个 FORM
  FORM标签节点所代表的对象是很多朋友关心的内容——在网页对象中,它可以向服务器发送数据,使服务器刷新网页(实际上服务器按照一个一定的格式协议),我们可以向网页发送数据。FORM被视为远程函数调用接口。FORM标签中ACTION指向的URL地址就是函数入口,FORM标签中的每个INPUT标签节点都是函数的参数。发出 FORM.Submit 方法时,将远程调用该函数。现在,在服务器端,比如ASP,PHP就是老老实实的找FORM的参数,不管你用GET还是POST:
  frmX.submit '相当于用户在页面按下FORM的发送按钮
  上面我列出了获取网页数据的一般方法,使用上没有特殊要求。您可以根据自己的习惯使用它们。本题后面的内容就是灵活运用这些知识点解决实际问题。
  
  回到本节的知识点:
  如何提交表格?如何下载图片的地址?如何获取表的数据?
  
  块编程思想的内涵:
  在我的系列书中,我一直在强调“积木”的编程思想,这也是学习使用VBA的主要方法,尤其是对于专业人士来说,采用这种方案是很有必要的。其主要内涵:
  1 不要自己输入所有代码。你要做的就是把块放在正确的地方,然后修复代码,一定要复制它,从你的构建块库中复制它,然后修复代码并利用时间来有效地思考。
  2 建立自己的“块库”。平时在学习的过程中,把自己觉得有用的代码放在一起,多积累,随时用。您在构建块库中拥有的信息越多,您的编程思想就会越广泛。
  
  VBA的应用定义
  VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对 VBA 的应用程序定义。在取代OFFICE的新办公软件出现之前,谁能在数据处理上做到极致,谁就是王者。技巧的巅峰莫过于VBA!
  记得20年前第一次学VBA的时候,当时资料很少,只能看源码搞清楚,真的很难。20年过去了,为了不让学VBA的朋友重复我之前的经历,我结合自己多年的VBA实践经验,推出了六篇VBA专题教程:
  第一组:VBA代码解法是对VBA中各个知识点的讲解。总共147课,涵盖了初学者必备的大部分VBA知识点;
  第二套:VBA数据库解决方案 数据库是专业的数据处理工具。教程中详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作,适合中级学习。
  第三套:VBA数组和字典解决方案数组和字典是VBA的精髓,字典是提高VBA代码水平的有效手段,值得深入研究,是初级和中级人员学习的一种手段改进代码。
  第四套:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。这套教程是第一套教程的视频讲解,听元音比较容易。
  第五套:VBA中类的解释与利用这是一门进阶课程,讲解类的虚无和肉身的程度。虽然类的使用较少,但认真学习可以促进自身VBA理论的提高。对这套课程的领悟,主要是读者的领悟,对一种佛教哲学的领悟。
  第六套教程:《VBA信息获取与处理》,这是一个高级教程,涵盖范围更广,实用性更强,面向中高级人员。教程共有20个主题,包括:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO的使用对象,获取工作表和文件夹信息,获取图形信息,自定义工作表信息等功能。
  您可以按照1→3→2→6→5或4→3→2→6→5的顺序根据以上信息逐步深入学习。教程提供讲解并提供大量积木,如有需要可以微信:NZ9668
  
  学习VBA是一个过程,也需要体验一下枯燥的感觉
  如太白诗云:百鸟高飞,孤云独闲。相见不厌,唯有敬亭山。学习的过程也是修心的过程,修心平和。在码字的世界里,心静,心情好,身体自然就好。当心平静时,它是正义的。心中没有那么多的邪见邪见,也没有那么多的妄想。利益他人就是利益自己。这些教程也是为了帮助你起航,帮助我。我上面的教程是我经验的传递。
  “水无争,万物皆好。” 学习也是如此,知道自己需要什么,不蜷缩在世界的一小块认为自己是天堂的地方,以及自欺欺人的言论直到年老。努力提高自己,以充满活力的精神把握现在,这就是进步。越有意义的事情,就越难。意愿决定一切,智慧决定成败。无论遇到什么,都是风景。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。感受真实的时间,静下心来,多了解,积福报。与其天天闹着玩,不如天天过日子。在杀鸡更严重的后疫情世界,储备知识,尤其是新知识,为自己生存。学习时是渺小而无声的,使用时是巨大而汹涌的。
  每一次收获都是成长的记录。怎么可能没有证据?正是这种执着,让晨曦绽放出灿烂的光芒。最后,给致力于VBA学习的朋友一句话,让大家感受一下枯燥而执着的学习过程:
  乌云掠过,暗语无声,
  只有微风,惊动了梦中的莺。
  看星星,疏散北斗七星,
  钦奈将与过去的鹅一起去。
  陌生人,昏暗的灯光,
  忍着长亭。
  多少VBA人,
  在漆黑的夜里,静静地寻找梦想,期待黎明。
  多么不合理!
  回到学习和使用VBA的经历,很感慨。我想用这些话与大家分享我多年实际工作经验的成果。我想把这些有用的东西分享给真正需要使用 VBA 的旅友。

vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)

网站优化优采云 发表了文章 • 0 个评论 • 96 次浏览 • 2022-01-30 01:16 • 来自相关话题

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索中的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 'row
For j = 0 To tb(H).Cells.Length - 1 'cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
'发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。如果要使用多段内容,只能将内容提取出来,然后进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。 查看全部

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索中的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 'row
For j = 0 To tb(H).Cells.Length - 1 'cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
'发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。如果要使用多段内容,只能将内容提取出来,然后进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。

vba xmlhttp 抓取网页(:-日报第2期)

网站优化优采云 发表了文章 • 0 个评论 • 98 次浏览 • 2022-01-22 22:10 • 来自相关话题

  vba xmlhttp 抓取网页(:-日报第2期)
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '网址读取
  使用 CreateObject("InternetExplorer.Application") '调用互联网
  .可见=真
  .navigate preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  dmt.all.tags("select")(10).Value = "山东"
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 1) = t
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  -------------------------------------------------- -------------------------------------------------- --------分割线---------------------------------------- -------------------------------------------------- ---------- 我的目标:将2008-2012年山东各学校和专业B栏(最低分、最高分、平均分)的招生情况记录到各自的工作表中去。
  工作经历和想法:
  首先我去指定的网站()看看。查询该校各专业的招生情况,需要经过条件搜索,点击三下链接,才能到达最终结果页面,(... t_2012_shandong .htm)。我分析了这个结果页面,发现schoolpoint之后的参数都可以修改得到对应的结果。我现在需要找到的是参数/539/,它是来自学校对这个网站 ID 编码的。
  然后,我回过头去看了一路跳过的网页的源代码。在第一次搜索的结果网页中,有一个“A”,其NameProp值为school539.htm,其对应的文字正是搜索结果中的学校名称。也就是说,如果我找到这个NameProp,我就可以得到学校的id。
  接下来,我去初始页面()寻找进入搜索结果页面的方法。
  第一阶段,通过合成 urL? 输入字段后,但是输入后,搜索框是乱码,结果是默认的“北大”,无法合成。
  第二阶段,尝试搜索后,发现重定向结果页的UrL不是明码。我尝试将搜索字段转码为UTF-8并再次合成搜索结果页面的URL,但还是不行。仔细对比后发现,系统的地址和我上一段合成的一模一样,只是最后多了一个“&amp;x=3&amp;y=22”之类的字段。在同一个搜索字段中反复试验,发现x和y都是随机的。是的,我猜是防盗链(其实我也不知道防盗链是什么)。因为无法获取正确的地址,所以决定放弃XmlHttp,改用IE。
  第三阶段,IE尝试进入搜索结果页正常,但是结果页完成后,读取新页面的目标数据,发现上一页的值还是上一页的值. 方法清除缓存,但结果还是不行,还是上一页的值。所以很郁闷,卡在这里。
  以下是添加清除缓存功能后的代码,因为DeleteUrlCacheEntry功能不是很懂,请大家指导。
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '读
  使用 CreateObject("internetExplorer.Application")
  .可见=真
  .导航 preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  s = dmt.all.tags("a")(129)
  dmt.all.tags("select")(10).Value = eprovince
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  DeleteUrlCacheEntry dmt.all '清除缓存
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 2) = t
  ThisWorkbook.Sheets(2).Cells(1, 1) = s
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  
  此帖已经同步到谁道天涯-江波的微博 查看全部

  vba xmlhttp 抓取网页(:-日报第2期)
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '网址读取
  使用 CreateObject("InternetExplorer.Application") '调用互联网
  .可见=真
  .navigate preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  dmt.all.tags("select")(10).Value = "山东"
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 1) = t
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  -------------------------------------------------- -------------------------------------------------- --------分割线---------------------------------------- -------------------------------------------------- ---------- 我的目标:将2008-2012年山东各学校和专业B栏(最低分、最高分、平均分)的招生情况记录到各自的工作表中去。
  工作经历和想法:
  首先我去指定的网站()看看。查询该校各专业的招生情况,需要经过条件搜索,点击三下链接,才能到达最终结果页面,(... t_2012_shandong .htm)。我分析了这个结果页面,发现schoolpoint之后的参数都可以修改得到对应的结果。我现在需要找到的是参数/539/,它是来自学校对这个网站 ID 编码的。
  然后,我回过头去看了一路跳过的网页的源代码。在第一次搜索的结果网页中,有一个“A”,其NameProp值为school539.htm,其对应的文字正是搜索结果中的学校名称。也就是说,如果我找到这个NameProp,我就可以得到学校的id。
  接下来,我去初始页面()寻找进入搜索结果页面的方法。
  第一阶段,通过合成 urL? 输入字段后,但是输入后,搜索框是乱码,结果是默认的“北大”,无法合成。
  第二阶段,尝试搜索后,发现重定向结果页的UrL不是明码。我尝试将搜索字段转码为UTF-8并再次合成搜索结果页面的URL,但还是不行。仔细对比后发现,系统的地址和我上一段合成的一模一样,只是最后多了一个“&amp;x=3&amp;y=22”之类的字段。在同一个搜索字段中反复试验,发现x和y都是随机的。是的,我猜是防盗链(其实我也不知道防盗链是什么)。因为无法获取正确的地址,所以决定放弃XmlHttp,改用IE。
  第三阶段,IE尝试进入搜索结果页正常,但是结果页完成后,读取新页面的目标数据,发现上一页的值还是上一页的值. 方法清除缓存,但结果还是不行,还是上一页的值。所以很郁闷,卡在这里。
  以下是添加清除缓存功能后的代码,因为DeleteUrlCacheEntry功能不是很懂,请大家指导。
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '读
  使用 CreateObject("internetExplorer.Application")
  .可见=真
  .导航 preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  s = dmt.all.tags("a")(129)
  dmt.all.tags("select")(10).Value = eprovince
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  DeleteUrlCacheEntry dmt.all '清除缓存
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 2) = t
  ThisWorkbook.Sheets(2).Cells(1, 1) = s
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  
  此帖已经同步到谁道天涯-江波的微博

vba xmlhttp 抓取网页(【分享成果,随喜正能量】《VBA之Word应用》)

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-01-03 23:05 • 来自相关话题

  vba xmlhttp 抓取网页(【分享成果,随喜正能量】《VBA之Word应用》)
  【分享成果,正能量庆生】生活不能靠心情,而是靠心态。感觉像六月的天气,多云变幻莫测。如果一个人的生活取决于他的心情,他一定是善变的。他的人生将像断了线的风筝,随风摇曳,无法自拔。生活中的强者会及时调整心态,让心情始终保持积极向上,充满阳光。受情绪影响的人常迷茫,控制心态的人常快乐。
  “VBA Word 应用程序”是我的第八套教程。本教程专门讲解VBA在Word中的应用。它侧重于“面向对象编程”。首先让大家了解VBA在Word中的对象,以及该对象的Properties、方法,然后通过实例让大家感受一下Word VBA的美。本套教程共三卷十六章。今天的内容是第三章“文档集合的文档对象和文档对象”,第三节:打开文档,将文档赋值给变量。
  
  第 3 节 打开文档并将文档赋值给变量
  在上一节中,我们解释了使用 Documents 的 Open 方法打开指定文档的方法。在这个方法中,我们使用的语句是 Documents.Open myFile。这种方法是直接打开一个文档,但是,打开文档进行操作,在后续的文档操作中,我们需要捕获打开文档的对象,然后完成后续的操作。
  VBA是面向对象的编程,所有的操作也是面向对象的操作,所以我们可以在打开文档后直接将文档赋值给一个变量,以利用后续的操作。
  1 打开文档并将文档赋值给变量的思路解析
  在《VBA Excel 应用程序》中,我们谈到了变量的赋值。一般情况下,赋值直接使用“a variable=value”,但是给对象变量赋值时,需要使用Set语句。这里我们可以使用 Set 语句给文档对象变量赋值。在赋值的同时,我们可以用Documents.Open myFile同时打开指定的文件。
  赋值后,我们可以通过变量与文档进行交互。这个操作的代码很简单,给后面的操作留了足够的接口来使用我们后续的文档操作。让我们可以随时轻松参考文档。
  2 打开文档,给变量赋值
  我们来看下面的代码。此代码将打开指定的文件并在打开的文档中写入一些文本。我们先看代码:
  子 mynzB()
  将 myFile 淡化为字符串
  将 myDoc 淡化为文档
  myFile = ThisDocument.Path & "\" & "Example 03.docx"
  If Dir(myFile) "" Then
  设置 myDoc = Documents.Open(myFile)
  其他
  MsgBox myFile & "不存在!":END
  如果结束
  myDoc.Range(0, 0).Text = ""VBA Word 应用程序""
  ActiveDocument.Save
  '文档(myDoc).保存
  'ActiveDocument.Close wdSaveChanges
  'Documents(myDoc).Close wdSaveChanges
  ActiveDocument.Close wdDoNotSaveChanges
  'Documents(myDoc).Close wdDoNotSaveChanges
  结束子
  代码截图:
  
  3 代码的解释和操作
  我们来看看代码的解释:
  1)Dim myFile As String 这行代码将定义一个变量作为文件名
  2)Dim myDoc As Document 这行代码将定义一个文档对象变量
  3)myFile = ThisDocument.Path & "\" & "Example 03.docx" 这行代码给文件名变量赋值
  4)If Dir(myFile) "" 那么这行代码判断文件是否存在
  5) Set myDoc = Documents.Open(myFile) 打开一个文件并将这个文件赋值给对象变量。大家应该注意,这行代码有两个意思,一是打开变量myFile代表的文件,二是把这个文件赋值给变量myDoc。写的简单明了,同时在后面的代码中,我们可以使用这个变量,可以直接使用myDoc变量进行相关操作。如果不使用这个变量处理,那么我们需要进行ActiveDocument等代码处理。
  6) MsgBox myFile & "does not exist!": 这行代码的意思是如果文件不存在,会提示用户并终止代码运行
  7) myDoc.Range(0, 0).Text = ""VBA Word Application"" 这行代码的意思是在开头写""VBA Word Application"文档“
  8) ActiveDocument.Save 这行代码的意思就是保存活动文档
  9)'Documents(myDoc).Save这行代码的意思是关闭名为myDoc的变量所代表的文件
  10)'ActiveDocument.Close wdSaveChanges 这行代码的意思就是关闭当前活动的文档并保存。
  11)'Documents(myDoc).Close wdSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档并保存。
  12) ActiveDocument.Close wdDoNotSaveChanges 这行代码的意思就是关闭当前活动的文档,不保存。
  13)'Documents(myDoc).Close wdDoNotSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档,不保存。
  最后看一下代码的运行状态:文档开头已经添加了“VBA Word Application”的字符串:
  
  今日内容转帖:
  1 如何使用文档变量来存储打开的文档?
  2 本讲讲解的方案和上一节的方案有什么区别?
  3 你理解本课最后一部分给出的句子吗?
  
  本讲内容参考程序文件:Doc 003 document.docm
  ① 7→1→3→2→6→5 或 7→4→3→2→6→5 ② 7→8 查看全部

  vba xmlhttp 抓取网页(【分享成果,随喜正能量】《VBA之Word应用》)
  【分享成果,正能量庆生】生活不能靠心情,而是靠心态。感觉像六月的天气,多云变幻莫测。如果一个人的生活取决于他的心情,他一定是善变的。他的人生将像断了线的风筝,随风摇曳,无法自拔。生活中的强者会及时调整心态,让心情始终保持积极向上,充满阳光。受情绪影响的人常迷茫,控制心态的人常快乐。
  “VBA Word 应用程序”是我的第八套教程。本教程专门讲解VBA在Word中的应用。它侧重于“面向对象编程”。首先让大家了解VBA在Word中的对象,以及该对象的Properties、方法,然后通过实例让大家感受一下Word VBA的美。本套教程共三卷十六章。今天的内容是第三章“文档集合的文档对象和文档对象”,第三节:打开文档,将文档赋值给变量。
  
  第 3 节 打开文档并将文档赋值给变量
  在上一节中,我们解释了使用 Documents 的 Open 方法打开指定文档的方法。在这个方法中,我们使用的语句是 Documents.Open myFile。这种方法是直接打开一个文档,但是,打开文档进行操作,在后续的文档操作中,我们需要捕获打开文档的对象,然后完成后续的操作。
  VBA是面向对象的编程,所有的操作也是面向对象的操作,所以我们可以在打开文档后直接将文档赋值给一个变量,以利用后续的操作。
  1 打开文档并将文档赋值给变量的思路解析
  在《VBA Excel 应用程序》中,我们谈到了变量的赋值。一般情况下,赋值直接使用“a variable=value”,但是给对象变量赋值时,需要使用Set语句。这里我们可以使用 Set 语句给文档对象变量赋值。在赋值的同时,我们可以用Documents.Open myFile同时打开指定的文件。
  赋值后,我们可以通过变量与文档进行交互。这个操作的代码很简单,给后面的操作留了足够的接口来使用我们后续的文档操作。让我们可以随时轻松参考文档。
  2 打开文档,给变量赋值
  我们来看下面的代码。此代码将打开指定的文件并在打开的文档中写入一些文本。我们先看代码:
  子 mynzB()
  将 myFile 淡化为字符串
  将 myDoc 淡化为文档
  myFile = ThisDocument.Path & "\" & "Example 03.docx"
  If Dir(myFile) "" Then
  设置 myDoc = Documents.Open(myFile)
  其他
  MsgBox myFile & "不存在!":END
  如果结束
  myDoc.Range(0, 0).Text = ""VBA Word 应用程序""
  ActiveDocument.Save
  '文档(myDoc).保存
  'ActiveDocument.Close wdSaveChanges
  'Documents(myDoc).Close wdSaveChanges
  ActiveDocument.Close wdDoNotSaveChanges
  'Documents(myDoc).Close wdDoNotSaveChanges
  结束子
  代码截图:
  
  3 代码的解释和操作
  我们来看看代码的解释:
  1)Dim myFile As String 这行代码将定义一个变量作为文件名
  2)Dim myDoc As Document 这行代码将定义一个文档对象变量
  3)myFile = ThisDocument.Path & "\" & "Example 03.docx" 这行代码给文件名变量赋值
  4)If Dir(myFile) "" 那么这行代码判断文件是否存在
  5) Set myDoc = Documents.Open(myFile) 打开一个文件并将这个文件赋值给对象变量。大家应该注意,这行代码有两个意思,一是打开变量myFile代表的文件,二是把这个文件赋值给变量myDoc。写的简单明了,同时在后面的代码中,我们可以使用这个变量,可以直接使用myDoc变量进行相关操作。如果不使用这个变量处理,那么我们需要进行ActiveDocument等代码处理。
  6) MsgBox myFile & "does not exist!": 这行代码的意思是如果文件不存在,会提示用户并终止代码运行
  7) myDoc.Range(0, 0).Text = ""VBA Word Application"" 这行代码的意思是在开头写""VBA Word Application"文档“
  8) ActiveDocument.Save 这行代码的意思就是保存活动文档
  9)'Documents(myDoc).Save这行代码的意思是关闭名为myDoc的变量所代表的文件
  10)'ActiveDocument.Close wdSaveChanges 这行代码的意思就是关闭当前活动的文档并保存。
  11)'Documents(myDoc).Close wdSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档并保存。
  12) ActiveDocument.Close wdDoNotSaveChanges 这行代码的意思就是关闭当前活动的文档,不保存。
  13)'Documents(myDoc).Close wdDoNotSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档,不保存。
  最后看一下代码的运行状态:文档开头已经添加了“VBA Word Application”的字符串:
  
  今日内容转帖:
  1 如何使用文档变量来存储打开的文档?
  2 本讲讲解的方案和上一节的方案有什么区别?
  3 你理解本课最后一部分给出的句子吗?
  
  本讲内容参考程序文件:Doc 003 document.docm
  ① 7→1→3→2→6→5 或 7→4→3→2→6→5 ② 7→8

vba xmlhttp 抓取网页(我想从单个网站页面(带有XMLHTTP请求)中抓取一个)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-12-26 07:12 • 来自相关话题

  vba xmlhttp 抓取网页(我想从单个网站页面(带有XMLHTTP请求)中抓取一个)
  我想从单个网站页面(使用 XML HTTP 请求)抓取网站(以提取产品价格)。但在运行此脚本之前,我需要首先选择正确的商店(存储在浏览器 cookie 变量中,或者如果可能,以任何其他方式/请求包括在内),因为价格因商店而异。
  我已经创建了一个有效的代码,但是需要很长时间才能运行,所以我认为必须有一种更快更干净的方法:)。我还需要收录
应用程序以等待网站执行这些步骤。
  我当前的 VBA 代码:
  选择正确的存储(并将其保存在浏览器 cookie 中)
   Sub SetStore()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLSearchbox As MSHTML.IHTMLElement
Dim HTMLSearchboxes As MSHTML.IHTMLElementCollection
Dim HTMLButton As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection
Dim HTMLSearchButton As MSHTML.IHTMLElement
Dim HTMLSearchButtons As MSHTML.IHTMLElementCollection
Dim HTMLStoreID As MSHTML.IHTMLElement
Dim HTMLStoreIDs As MSHTML.IHTMLElementCollection
Dim HTMLSaveStore As MSHTML.IHTMLElement
Dim HTMLSaveStores As MSHTML.IHTMLElementCollection
'set on False to hide IE screen
IE.Visible = True
'navigate to url with limited content
IE.navigate "https://www.jumbo.com/content/ ... ot%3B
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLButton In HTMLButtons
If HTMLButton.getAttribute("data-jum-action") = "openHomeStoreFinder" Then
HTMLButton.Click
Exit For
End If
Next HTMLButton
Application.Wait Now + #12:00:02 AM#
Set HTMLSearchboxes = HTMLDoc.getElementsByTagName("input")
For Each HTMLSearchbox In HTMLSearchboxes
If HTMLSearchbox.getAttribute("id") = "searchTerm__DkKYx4XylsAAAFJktpb2Guy" Then
'input field store name/location to show search results
HTMLSearchbox.Value = "Oosterhout"
Application.Wait Now + #12:00:03 AM#
HTMLSearchbox.Click
Exit For
End If
Next HTMLSearchbox
Set HTMLSearchButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLSearchButton In HTMLSearchButtons
If HTMLSearchButton.getAttribute("data-jum-filter") = "search" Then
HTMLSearchButton.Click
Exit For
End If
Next HTMLSearchButton
Application.Wait Now + #12:00:05 AM#
Set HTMLStoreIDs = HTMLDoc.getElementsByTagName("li")
For Each HTMLStoreID In HTMLStoreIDs
'oosterhout = YC8KYx4XB88AAAFIDcIYwKxJ
'nieuwegein = 84IKYx4XziUAAAFInSYYwKrH
'vaassen = JYYKYx4XC1oAAAFItvcYwKxJ
'brielle = OG8KYx4XP4wAAAFIlsEYwKxK
If HTMLStoreID.getAttribute("data-jum-store-id") = "YC8KYx4XB88AAAFIDcIYwKxJ" Then
HTMLStoreID.Click
Application.Wait Now + #12:00:03 AM#
Exit For
End If
Next HTMLStoreID
Set HTMLSaveStores = HTMLDoc.getElementsByTagName("button")
For Each HTMLSaveStore In HTMLSaveStores
If HTMLSaveStore.getAttribute("data-jum-action") = "saveHomeStore" Then
HTMLSaveStore.Click
Exit For
End If
Next HTMLSaveStore
'IE.Quit
End Sub
  从产品页面中提取数据(IE HTTP请求,使用cookie存储值)
  Sub GetJumboPriceIE()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
IE.Visible = False
IE.navigate SKU_url
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
IE.Quit
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  上面的代码有效,但我希望使用以下 XML HTTP 请求代码(但使用正确的存储)。价格是 1,39。
  从产品页面提取数据(使用 XML HTTP 请求),但不使用 cookie 值
  Sub GetJumboPriceXML()
Dim XMLReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
XMLReq.Open "GET", SKU_url, False
XMLReq.send
If XMLReq.Status 200 Then
MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLReq.responseText
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  代码没有使用正确的商店并输出我不想要的价格(打印的价格是1.48)。
  综上所述:
  如果未选择商店(未设置 cookie),则以下 URL 现在的费用为 1.48 欧元。
  我希望 VB 脚本将商店设置为“Jumbo Oosterhout Nieuwe Bouwlingstraat”,然后在产品列表中抓取预定义的产品 URL 并提取价格(上面的 URL 是 €1,39)。
  然后将商店设置为另一个本地商店“Jumbo Brielle Thoelaverweg”并抓取相同的产品 URL 列表。上面的 URL 是 1.48 欧元。
  您可以通过单击页面右上角的位置图钉图标来选择其他商店。
  非常感谢您的帮助 查看全部

  vba xmlhttp 抓取网页(我想从单个网站页面(带有XMLHTTP请求)中抓取一个)
  我想从单个网站页面(使用 XML HTTP 请求)抓取网站(以提取产品价格)。但在运行此脚本之前,我需要首先选择正确的商店(存储在浏览器 cookie 变量中,或者如果可能,以任何其他方式/请求包括在内),因为价格因商店而异。
  我已经创建了一个有效的代码,但是需要很长时间才能运行,所以我认为必须有一种更快更干净的方法:)。我还需要收录
应用程序以等待网站执行这些步骤。
  我当前的 VBA 代码:
  选择正确的存储(并将其保存在浏览器 cookie 中)
   Sub SetStore()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLSearchbox As MSHTML.IHTMLElement
Dim HTMLSearchboxes As MSHTML.IHTMLElementCollection
Dim HTMLButton As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection
Dim HTMLSearchButton As MSHTML.IHTMLElement
Dim HTMLSearchButtons As MSHTML.IHTMLElementCollection
Dim HTMLStoreID As MSHTML.IHTMLElement
Dim HTMLStoreIDs As MSHTML.IHTMLElementCollection
Dim HTMLSaveStore As MSHTML.IHTMLElement
Dim HTMLSaveStores As MSHTML.IHTMLElementCollection
'set on False to hide IE screen
IE.Visible = True
'navigate to url with limited content
IE.navigate "https://www.jumbo.com/content/ ... ot%3B
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLButton In HTMLButtons
If HTMLButton.getAttribute("data-jum-action") = "openHomeStoreFinder" Then
HTMLButton.Click
Exit For
End If
Next HTMLButton
Application.Wait Now + #12:00:02 AM#
Set HTMLSearchboxes = HTMLDoc.getElementsByTagName("input")
For Each HTMLSearchbox In HTMLSearchboxes
If HTMLSearchbox.getAttribute("id") = "searchTerm__DkKYx4XylsAAAFJktpb2Guy" Then
'input field store name/location to show search results
HTMLSearchbox.Value = "Oosterhout"
Application.Wait Now + #12:00:03 AM#
HTMLSearchbox.Click
Exit For
End If
Next HTMLSearchbox
Set HTMLSearchButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLSearchButton In HTMLSearchButtons
If HTMLSearchButton.getAttribute("data-jum-filter") = "search" Then
HTMLSearchButton.Click
Exit For
End If
Next HTMLSearchButton
Application.Wait Now + #12:00:05 AM#
Set HTMLStoreIDs = HTMLDoc.getElementsByTagName("li")
For Each HTMLStoreID In HTMLStoreIDs
'oosterhout = YC8KYx4XB88AAAFIDcIYwKxJ
'nieuwegein = 84IKYx4XziUAAAFInSYYwKrH
'vaassen = JYYKYx4XC1oAAAFItvcYwKxJ
'brielle = OG8KYx4XP4wAAAFIlsEYwKxK
If HTMLStoreID.getAttribute("data-jum-store-id") = "YC8KYx4XB88AAAFIDcIYwKxJ" Then
HTMLStoreID.Click
Application.Wait Now + #12:00:03 AM#
Exit For
End If
Next HTMLStoreID
Set HTMLSaveStores = HTMLDoc.getElementsByTagName("button")
For Each HTMLSaveStore In HTMLSaveStores
If HTMLSaveStore.getAttribute("data-jum-action") = "saveHomeStore" Then
HTMLSaveStore.Click
Exit For
End If
Next HTMLSaveStore
'IE.Quit
End Sub
  从产品页面中提取数据(IE HTTP请求,使用cookie存储值)
  Sub GetJumboPriceIE()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
IE.Visible = False
IE.navigate SKU_url
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
IE.Quit
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  上面的代码有效,但我希望使用以下 XML HTTP 请求代码(但使用正确的存储)。价格是 1,39。
  从产品页面提取数据(使用 XML HTTP 请求),但不使用 cookie 值
  Sub GetJumboPriceXML()
Dim XMLReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
XMLReq.Open "GET", SKU_url, False
XMLReq.send
If XMLReq.Status 200 Then
MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLReq.responseText
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  代码没有使用正确的商店并输出我不想要的价格(打印的价格是1.48)。
  综上所述:
  如果未选择商店(未设置 cookie),则以下 URL 现在的费用为 1.48 欧元。
  我希望 VB 脚本将商店设置为“Jumbo Oosterhout Nieuwe Bouwlingstraat”,然后在产品列表中抓取预定义的产品 URL 并提取价格(上面的 URL 是 €1,39)。
  然后将商店设置为另一个本地商店“Jumbo Brielle Thoelaverweg”并抓取相同的产品 URL 列表。上面的 URL 是 1.48 欧元。
  您可以通过单击页面右上角的位置图钉图标来选择其他商店。
  非常感谢您的帮助

vba xmlhttp 抓取网页(Usage:ExampleUsage:用法示例:Example)

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-12-23 23:02 • 来自相关话题

  vba xmlhttp 抓取网页(Usage:ExampleUsage:用法示例:Example)
  如果有理由需要使用 VBA 执行此操作,也可以执行此操作,尽管需要以某种方式进行一些额外的工作。做一些额外的工作,但也可以做到。
  为了从任何站点加载 JSON 或 HTML,我使用此函数:为了从任何站点加载 JSON 或 HTML,我使用此函数:
  Public Function getHTTP(ByVal sReq As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", sReq, False
.Send
getHTTP = StrConv(.responseBody, vbUnicode)
End With
End Function
  示例用法:示例用法:
  由于我不确定您从何处获取 JSON 数据,这里有一个使用 Stack Exchange API 显示 Stack Overflow 站点状态的示例:由于我不确定从何处获取 JSON 数据,以下是示例使用 Stack Exchange API 显示 Stack Overflow 站点的状态:
  Sub GetSiteInfo()
Const url = "https://api.stackexchange.com/ ... ot%3B
Dim json As String
json = getHTTP(url) 'get JSON response
If InStr(json, """error_id""") > 0 Or json = "" Then 'check for error
MsgBox "There was a problem." & vbLf & vbLf & json, vbCritical
Exit Sub
End If
json = Mid(json, InStr(json, "[{""") + 3) 'tidy response with string functions
json = Left(json, InStr(json, "}],") - 1)
json = Replace(Replace(Replace(json, Chr(34), ""), ",", vbNewLine), "_", " ")
json = Replace(StrConv(Replace(json, ":", " :" & vbTab & vbTab _
& vbTab), vbProperCase), " Per ", "/")
MsgBox json, vbInformation, "Site Statistics" 'display response
End Sub
  注意如何使用基本的字符串函数来管理像这样的简单响应的提取。
  使用基本字符串函数提取值使用基本字符串函数提取值
  再举一个例子,使用问题顶部的 JSON 数据,如果字符串在一个名为 json 的变量中,并且您想提取 bestBuy 的值,一种方法(几种可能的方法)是这样的:再举一个例子,使用问题顶部的JSON数据,如果字符串在一个名为json的变量中,并且您想提取bestBuy的值,则一种方法(几种可能的方法)如下:
  Sub jsonExtract_Demo()
Const json = "aaaaaaa""bestBuy"": ""6.04"",." 'for demo
Dim pStart As Long, pStop As Long, bestBuy As Single
Dim prefix As String, suffix As String
prefix = "bestBuy"": """ 'equivalent to: "bestBuy": "
suffix = """" 'equivalent to a single "
pStart = InStr(json, prefix) + Len(prefix) 'find beginning of value
pStop = InStr(pStart, json, suffix) 'find end of value
bestBuy = CSng(Mid(json, pStart, pStop - pStart)) 'extract & convert value
MsgBox "The value for 'bestBuy` is : " & bestBuy, vbInformation
End Sub
  WEBSERVICE 工作表功能 WEBSERVICE 工作表功能
  我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,它适用于大多数纯文本响应(例如这个 JSON 示例):我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,适用于大多数纯文本响应(例如这个 JSON 示例):
  输入工作表单元格:输入工作表单元格:
  =WEBSERVICE("https://raw.githubusercontent. ... 6quot;)
  ...您将立即看到原创文本结果,准备好根据需要使用工作表函数进行操作...。在 XML 响应的情况下,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段,这对于基本的抓取需求非常方便。对于 XML 响应,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段。非常方便的基本抓取需求。
  以上链接中的更多信息。上面收录的链接中有更多信息。 查看全部

  vba xmlhttp 抓取网页(Usage:ExampleUsage:用法示例:Example)
  如果有理由需要使用 VBA 执行此操作,也可以执行此操作,尽管需要以某种方式进行一些额外的工作。做一些额外的工作,但也可以做到。
  为了从任何站点加载 JSON 或 HTML,我使用此函数:为了从任何站点加载 JSON 或 HTML,我使用此函数:
  Public Function getHTTP(ByVal sReq As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", sReq, False
.Send
getHTTP = StrConv(.responseBody, vbUnicode)
End With
End Function
  示例用法:示例用法:
  由于我不确定您从何处获取 JSON 数据,这里有一个使用 Stack Exchange API 显示 Stack Overflow 站点状态的示例:由于我不确定从何处获取 JSON 数据,以下是示例使用 Stack Exchange API 显示 Stack Overflow 站点的状态:
  Sub GetSiteInfo()
Const url = "https://api.stackexchange.com/ ... ot%3B
Dim json As String
json = getHTTP(url) 'get JSON response
If InStr(json, """error_id""") > 0 Or json = "" Then 'check for error
MsgBox "There was a problem." & vbLf & vbLf & json, vbCritical
Exit Sub
End If
json = Mid(json, InStr(json, "[{""") + 3) 'tidy response with string functions
json = Left(json, InStr(json, "}],") - 1)
json = Replace(Replace(Replace(json, Chr(34), ""), ",", vbNewLine), "_", " ")
json = Replace(StrConv(Replace(json, ":", " :" & vbTab & vbTab _
& vbTab), vbProperCase), " Per ", "/")
MsgBox json, vbInformation, "Site Statistics" 'display response
End Sub
  注意如何使用基本的字符串函数来管理像这样的简单响应的提取。
  使用基本字符串函数提取值使用基本字符串函数提取值
  再举一个例子,使用问题顶部的 JSON 数据,如果字符串在一个名为 json 的变量中,并且您想提取 bestBuy 的值,一种方法(几种可能的方法)是这样的:再举一个例子,使用问题顶部的JSON数据,如果字符串在一个名为json的变量中,并且您想提取bestBuy的值,则一种方法(几种可能的方法)如下:
  Sub jsonExtract_Demo()
Const json = "aaaaaaa""bestBuy"": ""6.04"",." 'for demo
Dim pStart As Long, pStop As Long, bestBuy As Single
Dim prefix As String, suffix As String
prefix = "bestBuy"": """ 'equivalent to: "bestBuy": "
suffix = """" 'equivalent to a single "
pStart = InStr(json, prefix) + Len(prefix) 'find beginning of value
pStop = InStr(pStart, json, suffix) 'find end of value
bestBuy = CSng(Mid(json, pStart, pStop - pStart)) 'extract & convert value
MsgBox "The value for 'bestBuy` is : " & bestBuy, vbInformation
End Sub
  WEBSERVICE 工作表功能 WEBSERVICE 工作表功能
  我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,它适用于大多数纯文本响应(例如这个 JSON 示例):我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,适用于大多数纯文本响应(例如这个 JSON 示例):
  输入工作表单元格:输入工作表单元格:
  =WEBSERVICE("https://raw.githubusercontent. ... 6quot;)
  ...您将立即看到原创文本结果,准备好根据需要使用工作表函数进行操作...。在 XML 响应的情况下,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段,这对于基本的抓取需求非常方便。对于 XML 响应,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段。非常方便的基本抓取需求。
  以上链接中的更多信息。上面收录的链接中有更多信息。

vba xmlhttp 抓取网页( 高手讲讲实现的基本流程吧..很多代码没有注释 )

网站优化优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2021-11-27 16:05 • 来自相关话题

  vba xmlhttp 抓取网页(
高手讲讲实现的基本流程吧..很多代码没有注释
)
  VB抓取网页某处内容【求取过程】
  作为标题...
  高手说说实现的基本过程。
  很多代码没有注释,看起来很累。
  真心学习!--------------------编程问答--------------------从xmlhttp中获取数据object 转换编码完成!--------------------编程问答--------------------
      'ServerXMLHTTP 获取函数<br />
    Function GetBody(Weburl)<br />
       On Error Resume Next<br />
       Dim xmlHttp<br />
       'Set xmlHttp=createobject("Msxml2.XMLHTTP.4.0")<br />
       'set xmlHttp=createobject("Microsoft.XMLHTTP")<br />
       Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP")<br />
       xmlHttp.setTimeouts 4000, 4000, 4000, 8000<br />
       xmlHttp.Open "GET", Weburl, False<br />
       xmlHttp.send<br />
       If xmlHttp.readystate = 4 Then<br />
       'if xmlHttp.status=200 then<br />
        GetBody = xmlHttp.responsebody<br />
       'end if<br />
        Else<br />
        GetBody = ""<br />
       End If<br />
      Dim sError<br />
       If Err.Number  0 Then<br />
       sError = Err.Number<br />
       Err.Clear<br />
       Else<br />
       sError = ""<br />
       End If<br />
       Set xmlHttp = Nothing<br />
    End Function<br />
    '远程获取网页编码格式转换<br />
    Function BytesToBstr(body, charset) '转换成需要的编码格式<br />
        Dim objstream<br />
        Set objstream = CreateObject("adodb.stream")<br />
        objstream.Type = 1<br />
        objstream.Mode = 3<br />
        objstream.Open<br />
        On Error Resume Next<br />
        objstream.Write body<br />
        objstream.Position = 0<br />
        objstream.Type = 2<br />
        objstream.charset = charset<br />
        BytesToBstr = objstream.ReadText<br />
        objstream.Close<br />
        Set objstream = Nothing<br />
    End Function
  --------------------编程问答--------------------msgboxBytesToBstr(GetBody("" ), "gb2312")
  补充:VB , 网络编程 查看全部

  vba xmlhttp 抓取网页(
高手讲讲实现的基本流程吧..很多代码没有注释
)
  VB抓取网页某处内容【求取过程】
  作为标题...
  高手说说实现的基本过程。
  很多代码没有注释,看起来很累。
  真心学习!--------------------编程问答--------------------从xmlhttp中获取数据object 转换编码完成!--------------------编程问答--------------------
      'ServerXMLHTTP 获取函数<br />
    Function GetBody(Weburl)<br />
       On Error Resume Next<br />
       Dim xmlHttp<br />
       'Set xmlHttp=createobject("Msxml2.XMLHTTP.4.0")<br />
       'set xmlHttp=createobject("Microsoft.XMLHTTP")<br />
       Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP")<br />
       xmlHttp.setTimeouts 4000, 4000, 4000, 8000<br />
       xmlHttp.Open "GET", Weburl, False<br />
       xmlHttp.send<br />
       If xmlHttp.readystate = 4 Then<br />
       'if xmlHttp.status=200 then<br />
        GetBody = xmlHttp.responsebody<br />
       'end if<br />
        Else<br />
        GetBody = ""<br />
       End If<br />
      Dim sError<br />
       If Err.Number  0 Then<br />
       sError = Err.Number<br />
       Err.Clear<br />
       Else<br />
       sError = ""<br />
       End If<br />
       Set xmlHttp = Nothing<br />
    End Function<br />
    '远程获取网页编码格式转换<br />
    Function BytesToBstr(body, charset) '转换成需要的编码格式<br />
        Dim objstream<br />
        Set objstream = CreateObject("adodb.stream")<br />
        objstream.Type = 1<br />
        objstream.Mode = 3<br />
        objstream.Open<br />
        On Error Resume Next<br />
        objstream.Write body<br />
        objstream.Position = 0<br />
        objstream.Type = 2<br />
        objstream.charset = charset<br />
        BytesToBstr = objstream.ReadText<br />
        objstream.Close<br />
        Set objstream = Nothing<br />
    End Function
  --------------------编程问答--------------------msgboxBytesToBstr(GetBody("" ), "gb2312")
  补充:VB , 网络编程

vba xmlhttp 抓取网页(我需要从价格比较网站(2015年03月23日) )

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-11-21 21:06 • 来自相关话题

  vba xmlhttp 抓取网页(我需要从价格比较网站(2015年03月23日)
)
  我需要比较 网站 的价格(产品链接:.toppreise.ch/prod_488002.html)。我不能挠。查看我要捕获的图像中突出显示的价格:
  
  请帮助我如何抓取此页面。
  PS:很多国家/地区都无法访问toppreise.ch,请使用VPN
  我正在使用以下代码:
  Private Sub SiteInfo_Click()
Dim strhtml
On Error Resume Next
ThisWorkbook.Sheets("Data Mining").Activate
Sheets("Data Mining").Range("B1").Select
Set xmlHttp = Nothing
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
StrUrl = ""
StrUrl = Sheets("Data Mining").Range("B1").Value
xmlHttp.Open "GET", StrUrl, False
xmlHttp.Send
strhtml =xmlHttp.responseText
END Sub
  当我运行上面的代码时,我只在下面的响应文本下得到一个提示。它没有给出整个页面。(您可以通过产品链接查看源代码,或者在这里查看 %20code.txt?dl =0)
  




...
  解决方案
  此代码有效,谢谢 SIM
  Sub Get_Price()
Dim HTTP As New XMLHTTP60, HTML As New HTMLDocument
Dim post As HTMLDivElement
With HTTP
.Open "GET", "https://www.toppreise.ch/index.php?a=488002", False
.send
HTML.body.innerHTML = .responseText
End With
For Each post In HTML.getElementsByClassName("altLinesOdd")
With post.getElementsByTagName("a")
If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
End With
With post.getElementsByClassName("spaceVert nobreak")
If .Length Then Cells(R, 2) = .Item(0).innerText
End With
Next post
End Sub 查看全部

  vba xmlhttp 抓取网页(我需要从价格比较网站(2015年03月23日)
)
  我需要比较 网站 的价格(产品链接:.toppreise.ch/prod_488002.html)。我不能挠。查看我要捕获的图像中突出显示的价格:
  
  请帮助我如何抓取此页面。
  PS:很多国家/地区都无法访问toppreise.ch,请使用VPN
  我正在使用以下代码:
  Private Sub SiteInfo_Click()
Dim strhtml
On Error Resume Next
ThisWorkbook.Sheets("Data Mining").Activate
Sheets("Data Mining").Range("B1").Select
Set xmlHttp = Nothing
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
StrUrl = ""
StrUrl = Sheets("Data Mining").Range("B1").Value
xmlHttp.Open "GET", StrUrl, False
xmlHttp.Send
strhtml =xmlHttp.responseText
END Sub
  当我运行上面的代码时,我只在下面的响应文本下得到一个提示。它没有给出整个页面。(您可以通过产品链接查看源代码,或者在这里查看 %20code.txt?dl =0)
  




...
  解决方案
  此代码有效,谢谢 SIM
  Sub Get_Price()
Dim HTTP As New XMLHTTP60, HTML As New HTMLDocument
Dim post As HTMLDivElement
With HTTP
.Open "GET", "https://www.toppreise.ch/index.php?a=488002", False
.send
HTML.body.innerHTML = .responseText
End With
For Each post In HTML.getElementsByClassName("altLinesOdd")
With post.getElementsByTagName("a")
If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
End With
With post.getElementsByClassName("spaceVert nobreak")
If .Length Then Cells(R, 2) = .Item(0).innerText
End With
Next post
End Sub

vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-11-09 18:09 • 来自相关话题

  vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())
  网页数据下载与控制
  一、概述和感谢
  网页控制需要用到的方面可以大致总结如下:
  1、 程序中需要嵌入一个网页,比如天气预报。
  2、 需要从网上下载数据写入本地数据库。
  二、傲游的使用
  不管什么应用,第一件事就是找到网址(可能是废话)。
  以Winland的天气预报为例。如果我的程序需要这样的东西,我该怎么做:
  1、打开
  2、点击“天气预报”打开:/tianqi
  3、 尝试查看一个城市,此时找到了结果,但是URL并没有改变。
  4、点击Maxthon的viewpage。
  5、在“Frame”中,找到一个“Inline Frame”,点击打开。原来天气预报的网址是:
  /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c
  6、接下来我们就可以在自己的程序中使用这个URL直接查询了。
  综上所述,通过傲游,我们可以轻松找到自己需要的真实网站。
  viewpage里面还有一个“form”,里面清楚的显示了Name、method和Action。我知道这个 Action 是“结果页面”的 URL 的后半部分(对吗?)。
  (在网页形式中,Action为目标地址,即对提交内容进行处理的服务器端脚本,如果Action为空,则为当前文件。)
  三、 网页关键词解读(输入、按钮、数据)
  ASP 脚本片段的开始和结束。标签之间的脚本代码将在主页传递到用户浏览器之前在服务器上执行。
  并标记网页的开头,标记网页的结尾。
  并且网页上的文字应该放在这些标记之间
  以及表的开头和结尾
  表格边框参数指定表格边框的宽度
  并将表格标题放在这些标签之间
  和
  标记表中新行的开始。表中的每一行都以
  标记结束。
  和
  使用这些标签来标识表格单元格。每个单元格以
  马克开头
  标记结束。表格单元格可以收录任何内容,包括另一个表格。
  我们需要关注的是:和,和
  也
  和
  .
  文本框:有些省略TYPE、VALUE和SIZE,但应该有关键字INPUT和NAME。
  选择框:
  单选按钮:升序'当前选择
  降序
  多选按钮:
  '当前选择
  五菱LZW6400CV3客车(批次#F9)
  中顺SZS6503E1轻型客车(批次#F9)
  按下按键:
  名称=获取事件&gt;
  四、POST、GET 和 NAME、VALUE
  为了从网页中获取数据,参数需要明确。要在 Web 查询中将参数发送到 Web 服务器,您需要在验证特定 Web 服务器使用哪种方法后使用 POST 或 GET 方法。
  打开源代码并搜索“POST”。如果使用 POST 方法向 Web 服务器发送参数,则应显示文本 POST。如果Web服务器使用GET方式接收参数,可以在浏览器地址栏中看到参数名称和值。例如:/dist_sch/sch/searchresult/asp?boro=Manhattan &amp;flag= schoolInfo2
  (第一个参数前面加一个问号,参数之间用与号隔开,参数顺序不重要)
  搜索“名称”。在单词名称之后,可以看到括号中的一些文字,这是第一个参数的名称。在“value=”这个词之后,是参数的当前值。例如:
  在上面的 HTML 语句中,“Amount”这个词是参数名称,“1”是参数的当前值。参数值也可以是 HTML 标签中的选项之一。例如:
  Post和Get的区别:
  1、Get用于从服务器获取数据,Post用于向服务器传输数据。
  2、Get将表单中的数据以variable=value的形式添加到action指向的URL中,两者用“?”连接,变量用“&amp;”连接;Post是将表单中的数据放在表单的数据体中,以变量和值对应的方式传递给action指向的URL。
  3、Get 是不安全的,因为在传输过程中,数据是放在请求的 URL 中的,很多现有的服务器、代理服务器或者用户代理都会将请求的 URL 记录在日志文件中,然后放入日志文件。在某个地方,一些隐私信息可能会被第三方看到。此外,用户还可以直接在浏览器上看到提交的数据,一些内部系统消息会显示在用户面前。Post的所有操作对用户都是不可见的。
  4、Get传输的数据量很小。这主要是由于URL长度的限制,只能传输1024字节左右;而Post可以传输大量数据,最大2M,所以上传文件时只能使用Post。
  5、Get 限制Form的数据集的值为ASCII字符;和 Post 支持整个 ISO10646 字符集。
  6、Get 是 Form 的默认方法。
  五、使用网页浏览器
  要使用 WebBrowser,您需要添加“Microsoft Web 浏览器”(VBA) 或“Microsoft Internet 控件”(VB)。
  1、WebBrowser的简单使用方法:
  '开店前
  Urlstr=" /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c"
  F_tqyb.WebBrowser1.导航Urlstr
  F_tqyb.Show'当这句话被屏蔽时,WebBrowser也打开了网页,但在桌面上不显示
  Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)
  如果 WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'页面调用是否完成...
  结束子
  2、我们想要的网页内容:
  一般来说,我们想要的网页内容在WebBrowser1.document.body.innerhtml 和WebBrowser1.document.body.innertext 中,通过替换和分析,可以得到我们想要的数据。
  Innerhtml 中的内容是网页的源代码。
  innertext 中的内容是网页上显示的内容。(此内容是我们将网页保存为文本时的内容) 个人认为使用Innerhtml更方便。
  当您拥有 html 源代码时,您可以使用搜索和替换功能来删除您需要的数据。另外,可以将源代码写入文本文件,将文本文件的扩展名修改为htm,然后使用Excel的“导入外部数据”-“导入数据”功能将数据读入Excel。(通过这个方法,导入时选择具体的表,可以参考需要导入的表号WebTables)
  3、在程序中使用WebBrowser显示网页
  ⑴. 如果您需要的网页的 URL 收录怎么办?,而且取值规则很明确,很方便,直接把参数和取值写到URL中即可,如上例(显示宜昌天气),只需注意:第一个参数前面是一个问号,参数用与号分隔。参数的顺序并不重要。
  如果该值收录非英文和数字,则需要进行转换。(应用Winland的程序)
  示例:City=Escape("宜昌")
  公共函数转义(ByVal strText As String)作为字符串
  Dim JS 作为 ScriptControl
  设置 JS = 新建 MSScriptControl.ScriptControl
  nguage = "JavaScript"
  Escape = JS.Eval("encodeURI('" &amp; Replace(strText, "'", "\'") &amp; "');")
  结束函数
  ⑵. 如果您需要的网页的 URL 收录怎么办?,但价值规则不明确。例如,如果将其替换为一长串值,则需要从上层开始。我们估计并称之为“查询网页”和“结果网页”。
  通过程序分析“查询网页”,自动进入、选择、点击,或用户在使用时输入、选择、点击,打开“结果网页”。
  但是此时出现了一个问题:“结果网页”在新窗口中打开,在WebBrowser1中没有显示!这一刻,
  我们从以下方法中找到适合自己的:(详情见下文)
  ①、“遍历打开的IE窗口”,找到“结果网页”,读取网页,关闭网页,用EXCEL的“获取外部数据”将网页内容读入EXCEL。
  ②、“遍历打开的IE窗口”,找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴进去优秀。
  ③、“遍历打开的IE窗口”,找到“结果网页”,恢复对IE的控制,读取innerhtml,分析innerhtml。
  ④. 强制在 WebBrowser1 中显示新窗口,而无需打开 IE 或 Maxthon。阅读innerhtml并分析innerhtml。
  ⑤使用POST方式(winland提供)。
  ⑥. 使用EXCEL 的POST 方法。
  ⑶. 如果您需要的网址不包括在内怎么办?, 无论您的查询条件是什么,“结果页”的网址都保持不变。这时候如果直接在IE中输入地址,就什么也得不到。对于此类网页,只能从上层查看,同上。
  (我刚完成的程序属于这一类,用winland提供的POST方法不行,最后用EXCEL的POST方法完成)
  六、使用IE
  1、如果不想用WebBrowser,想用IE浏览器,或者“结果网页”是新窗口,被“强制”使用,控制起来也比较方便。
  将 IEPL 调暗为对象
  Set IEPL = CreateObject("InternetExplorer.Application")
  IEPL.Visible = False'Hide
  '打开网页
  URLstr=""
  IEPL.Navigate URLstr
  '和 webbrowser 一样,当页面被调用时,DocumentComplete 事件就会发生。
  '读取内部html
  ...
  IEPL.退出关闭
  或者:
  Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")
  遍历打开的IE窗口,通过窗口标题找到刚刚打开的IE(或“结果页”的新窗口),恢复对IE的控制。
  '遍历打开的IE窗口
  Dim dWinFolder 作为新的 ShellWindows
  Dim objIE 作为对象
  Dim Czpmxurl As String, Czpmxname As String
  对于 dWinFolder 中的每个 objIE
  Czpmxname = objIE.LocationName'Title
  If InStr(Czpmxname, "Query Results") Then
  Zdurl = 真
  万一
  下一个
  如果 Zdurl then'found
  objIE.application.Visible = False'隐藏
  czpmxurl = objIE.LocationURL'URL
  '读取内部html
  ...
  万一
  objIE.application.Quit'Close
  2、如果“结果网页”的新窗口不是IE,而是傲游,会比较麻烦。上述隐藏和关闭方法对傲游无效且无错误,但其他控制方法相同。此时要关闭傲游,必须使用sendkey Alt+F4 方法。
  当然,您也可以通过修改注册表将IE设置为默认。
  七、查询结果是新建弹窗的控件
  当查询结果是新的弹窗时,IE控件前面已经讨论过了,这里有两种方法:
  1、示例:通过窗口标题找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴在 EXCEL 中。
  '定义API函数
  声明函数 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  声明 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  声明函数 SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
  声明函数 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  类型 POINTAPI
  x只要
  y 只要
  结束类型
  声明函数 GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
  公共常量 SM_CXSCREEN = 0
  公共常量 SM_CYSCREEN = 1
  声明 Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  Public Const MOUSEEVENTF_MOVE = &amp;H1 '鼠标移动
  Public Const MOUSEEVENTF_LEFTDOWN = &amp;H2 '左键按下
  Public Const MOUSEEVENTF_LEFTUP = &amp;H4 '左键向上
  Public Const MOUSEEVENTF_RIGHTDOWN = &amp;H8 '右键按下
  Public Const MOUSEEVENTF_RIGHTUP = &amp;H10 '右键向上
  Public Const MOUSEEVENTF_MIDDLEDOWN = &amp;H20 '中键按下
  Public Const MOUSEEVENTF_MIDDLEUP = &amp;H40 '中间按钮向上
  Public Const MOUSEEVENTF_ABSOLUTE = &amp;H8000 '绝对移动
  '定义
  Dim Czpmxhwnd 只要
  czpmxhwnd = FindWindow(vbNullString, "-Query result-Microsoft Internet Explorer")'根据窗口标题搜索,找到时返回句柄
  If Czpmxhwnd = 0 Then Czpmxhwnd = FindWindow(vbNullString, "Query Results-Microsoft Internet Explorer")
  如果 Czpmxhwnd = 0 那么
  MsgBox "未找到", vbOKOnly, "提示"
  退出子
  万一
  aa = SetForegroundWindow(Czpmxhwnd)'将网页置于前台
  睡眠 100
  mouse_event MOUSEEVENTF_RIGHTDOWN 或 MOUSEEVENTF_RIGHTUP, 0&amp;, 0&amp;, 0, 0' 模拟鼠标点击,设置焦点
  睡眠 100
  SendKeys "^a", True'Ctrl+A 全选
  睡眠 100
  SendKeys "^c", True'Ctrl+C 复制
  睡眠 100
  SendKeys "%{F4}", True'Alt+F4 关闭
  '打开EXCEL,粘贴
  ...
  2、强制在WebBrowser1中显示新窗口,无需打开IE或Maxthon
  使用这种方法,无论是通过程序“自动点击”“提交”按钮,还是用户点击“提交”按钮,新窗口都被强制显示在WebBrowser1中,无需打开IE或Maxthon。
  从 1 创建一个新窗口,并在窗口中放置一个 WebBrowser1。
  私有子 Form_Load()
  Dim Strurl 作为字符串
  Strurl="……"'网址
  WebBrowser1.导航strurl
  结束子
  Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  '当有新的弹出窗口时触发
  将新窗口调暗为 Form1
  设置 NewWindow = New Form1
  新窗口.显示
  设置 ppDisp = NewWindow.WebBrowser1.Object
  '上面VBA中的命令错误需要改成:
  '设置 ppDisp = NewWindow.WebBrowser1
  结束子
  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  '网页下载'时触发
  Dim I As Single, J As Single
  如果WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'Open all web pages' 根据窗口标题或其他属性,判断是完成“查询网页”还是“结果网页”
  '根据不同的需求,编写相应的命令
  ...
  结束子
  八、使用POST方式(winland提供)
  要使用这种方法,首先必须根据“查询页面”中的内容编写要提交的查询字符串。当然,如果有非英文和数字,还必须使用上面的转义函数进行转换。
  strQuery="year_start=%202007&amp;month_start=%205&amp;date_start=%2012&amp;" &amp; _
  "hour_start=%200" &amp; _
  "&amp;year_end=%202007&amp;month_end=%205&amp;date_end=%2013&amp;hour_end=%200" &amp; _
  "&amp;substation%5B%5D=00&amp;R1=sortall&amp;order=1&amp;desckey="
  '上句表示开始年月日为:2007-5-12 0:00(%20为空格),结束时间:2007-5-13 0:00,单位为00( %5B%5D 为 []),所有内容,升序,无关键字。
  '没有“提交”按钮内容
  调用 QueryStr(strQuery)
  Public Sub QueryStr(strQuery As String) 查看全部

  vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())
  网页数据下载与控制
  一、概述和感谢
  网页控制需要用到的方面可以大致总结如下:
  1、 程序中需要嵌入一个网页,比如天气预报。
  2、 需要从网上下载数据写入本地数据库。
  二、傲游的使用
  不管什么应用,第一件事就是找到网址(可能是废话)。
  以Winland的天气预报为例。如果我的程序需要这样的东西,我该怎么做:
  1、打开
  2、点击“天气预报”打开:/tianqi
  3、 尝试查看一个城市,此时找到了结果,但是URL并没有改变。
  4、点击Maxthon的viewpage。
  5、在“Frame”中,找到一个“Inline Frame”,点击打开。原来天气预报的网址是:
  /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c
  6、接下来我们就可以在自己的程序中使用这个URL直接查询了。
  综上所述,通过傲游,我们可以轻松找到自己需要的真实网站。
  viewpage里面还有一个“form”,里面清楚的显示了Name、method和Action。我知道这个 Action 是“结果页面”的 URL 的后半部分(对吗?)。
  (在网页形式中,Action为目标地址,即对提交内容进行处理的服务器端脚本,如果Action为空,则为当前文件。)
  三、 网页关键词解读(输入、按钮、数据)
  ASP 脚本片段的开始和结束。标签之间的脚本代码将在主页传递到用户浏览器之前在服务器上执行。
  并标记网页的开头,标记网页的结尾。
  并且网页上的文字应该放在这些标记之间
  以及表的开头和结尾
  表格边框参数指定表格边框的宽度
  并将表格标题放在这些标签之间
  和
  标记表中新行的开始。表中的每一行都以
  标记结束。
  和
  使用这些标签来标识表格单元格。每个单元格以
  马克开头
  标记结束。表格单元格可以收录任何内容,包括另一个表格。
  我们需要关注的是:和,和
  也
  和
  .
  文本框:有些省略TYPE、VALUE和SIZE,但应该有关键字INPUT和NAME。
  选择框:
  单选按钮:升序'当前选择
  降序
  多选按钮:
  '当前选择
  五菱LZW6400CV3客车(批次#F9)
  中顺SZS6503E1轻型客车(批次#F9)
  按下按键:
  名称=获取事件&gt;
  四、POST、GET 和 NAME、VALUE
  为了从网页中获取数据,参数需要明确。要在 Web 查询中将参数发送到 Web 服务器,您需要在验证特定 Web 服务器使用哪种方法后使用 POST 或 GET 方法。
  打开源代码并搜索“POST”。如果使用 POST 方法向 Web 服务器发送参数,则应显示文本 POST。如果Web服务器使用GET方式接收参数,可以在浏览器地址栏中看到参数名称和值。例如:/dist_sch/sch/searchresult/asp?boro=Manhattan &amp;flag= schoolInfo2
  (第一个参数前面加一个问号,参数之间用与号隔开,参数顺序不重要)
  搜索“名称”。在单词名称之后,可以看到括号中的一些文字,这是第一个参数的名称。在“value=”这个词之后,是参数的当前值。例如:
  在上面的 HTML 语句中,“Amount”这个词是参数名称,“1”是参数的当前值。参数值也可以是 HTML 标签中的选项之一。例如:
  Post和Get的区别:
  1、Get用于从服务器获取数据,Post用于向服务器传输数据。
  2、Get将表单中的数据以variable=value的形式添加到action指向的URL中,两者用“?”连接,变量用“&amp;”连接;Post是将表单中的数据放在表单的数据体中,以变量和值对应的方式传递给action指向的URL。
  3、Get 是不安全的,因为在传输过程中,数据是放在请求的 URL 中的,很多现有的服务器、代理服务器或者用户代理都会将请求的 URL 记录在日志文件中,然后放入日志文件。在某个地方,一些隐私信息可能会被第三方看到。此外,用户还可以直接在浏览器上看到提交的数据,一些内部系统消息会显示在用户面前。Post的所有操作对用户都是不可见的。
  4、Get传输的数据量很小。这主要是由于URL长度的限制,只能传输1024字节左右;而Post可以传输大量数据,最大2M,所以上传文件时只能使用Post。
  5、Get 限制Form的数据集的值为ASCII字符;和 Post 支持整个 ISO10646 字符集。
  6、Get 是 Form 的默认方法。
  五、使用网页浏览器
  要使用 WebBrowser,您需要添加“Microsoft Web 浏览器”(VBA) 或“Microsoft Internet 控件”(VB)。
  1、WebBrowser的简单使用方法:
  '开店前
  Urlstr=" /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c"
  F_tqyb.WebBrowser1.导航Urlstr
  F_tqyb.Show'当这句话被屏蔽时,WebBrowser也打开了网页,但在桌面上不显示
  Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)
  如果 WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'页面调用是否完成...
  结束子
  2、我们想要的网页内容:
  一般来说,我们想要的网页内容在WebBrowser1.document.body.innerhtml 和WebBrowser1.document.body.innertext 中,通过替换和分析,可以得到我们想要的数据。
  Innerhtml 中的内容是网页的源代码。
  innertext 中的内容是网页上显示的内容。(此内容是我们将网页保存为文本时的内容) 个人认为使用Innerhtml更方便。
  当您拥有 html 源代码时,您可以使用搜索和替换功能来删除您需要的数据。另外,可以将源代码写入文本文件,将文本文件的扩展名修改为htm,然后使用Excel的“导入外部数据”-“导入数据”功能将数据读入Excel。(通过这个方法,导入时选择具体的表,可以参考需要导入的表号WebTables)
  3、在程序中使用WebBrowser显示网页
  ⑴. 如果您需要的网页的 URL 收录怎么办?,而且取值规则很明确,很方便,直接把参数和取值写到URL中即可,如上例(显示宜昌天气),只需注意:第一个参数前面是一个问号,参数用与号分隔。参数的顺序并不重要。
  如果该值收录非英文和数字,则需要进行转换。(应用Winland的程序)
  示例:City=Escape("宜昌")
  公共函数转义(ByVal strText As String)作为字符串
  Dim JS 作为 ScriptControl
  设置 JS = 新建 MSScriptControl.ScriptControl
  nguage = "JavaScript"
  Escape = JS.Eval("encodeURI('" &amp; Replace(strText, "'", "\'") &amp; "');")
  结束函数
  ⑵. 如果您需要的网页的 URL 收录怎么办?,但价值规则不明确。例如,如果将其替换为一长串值,则需要从上层开始。我们估计并称之为“查询网页”和“结果网页”。
  通过程序分析“查询网页”,自动进入、选择、点击,或用户在使用时输入、选择、点击,打开“结果网页”。
  但是此时出现了一个问题:“结果网页”在新窗口中打开,在WebBrowser1中没有显示!这一刻,
  我们从以下方法中找到适合自己的:(详情见下文)
  ①、“遍历打开的IE窗口”,找到“结果网页”,读取网页,关闭网页,用EXCEL的“获取外部数据”将网页内容读入EXCEL。
  ②、“遍历打开的IE窗口”,找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴进去优秀。
  ③、“遍历打开的IE窗口”,找到“结果网页”,恢复对IE的控制,读取innerhtml,分析innerhtml。
  ④. 强制在 WebBrowser1 中显示新窗口,而无需打开 IE 或 Maxthon。阅读innerhtml并分析innerhtml。
  ⑤使用POST方式(winland提供)。
  ⑥. 使用EXCEL 的POST 方法。
  ⑶. 如果您需要的网址不包括在内怎么办?, 无论您的查询条件是什么,“结果页”的网址都保持不变。这时候如果直接在IE中输入地址,就什么也得不到。对于此类网页,只能从上层查看,同上。
  (我刚完成的程序属于这一类,用winland提供的POST方法不行,最后用EXCEL的POST方法完成)
  六、使用IE
  1、如果不想用WebBrowser,想用IE浏览器,或者“结果网页”是新窗口,被“强制”使用,控制起来也比较方便。
  将 IEPL 调暗为对象
  Set IEPL = CreateObject("InternetExplorer.Application")
  IEPL.Visible = False'Hide
  '打开网页
  URLstr=""
  IEPL.Navigate URLstr
  '和 webbrowser 一样,当页面被调用时,DocumentComplete 事件就会发生。
  '读取内部html
  ...
  IEPL.退出关闭
  或者:
  Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")
  遍历打开的IE窗口,通过窗口标题找到刚刚打开的IE(或“结果页”的新窗口),恢复对IE的控制。
  '遍历打开的IE窗口
  Dim dWinFolder 作为新的 ShellWindows
  Dim objIE 作为对象
  Dim Czpmxurl As String, Czpmxname As String
  对于 dWinFolder 中的每个 objIE
  Czpmxname = objIE.LocationName'Title
  If InStr(Czpmxname, "Query Results") Then
  Zdurl = 真
  万一
  下一个
  如果 Zdurl then'found
  objIE.application.Visible = False'隐藏
  czpmxurl = objIE.LocationURL'URL
  '读取内部html
  ...
  万一
  objIE.application.Quit'Close
  2、如果“结果网页”的新窗口不是IE,而是傲游,会比较麻烦。上述隐藏和关闭方法对傲游无效且无错误,但其他控制方法相同。此时要关闭傲游,必须使用sendkey Alt+F4 方法。
  当然,您也可以通过修改注册表将IE设置为默认。
  七、查询结果是新建弹窗的控件
  当查询结果是新的弹窗时,IE控件前面已经讨论过了,这里有两种方法:
  1、示例:通过窗口标题找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴在 EXCEL 中。
  '定义API函数
  声明函数 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  声明 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  声明函数 SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
  声明函数 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  类型 POINTAPI
  x只要
  y 只要
  结束类型
  声明函数 GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
  公共常量 SM_CXSCREEN = 0
  公共常量 SM_CYSCREEN = 1
  声明 Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  Public Const MOUSEEVENTF_MOVE = &amp;H1 '鼠标移动
  Public Const MOUSEEVENTF_LEFTDOWN = &amp;H2 '左键按下
  Public Const MOUSEEVENTF_LEFTUP = &amp;H4 '左键向上
  Public Const MOUSEEVENTF_RIGHTDOWN = &amp;H8 '右键按下
  Public Const MOUSEEVENTF_RIGHTUP = &amp;H10 '右键向上
  Public Const MOUSEEVENTF_MIDDLEDOWN = &amp;H20 '中键按下
  Public Const MOUSEEVENTF_MIDDLEUP = &amp;H40 '中间按钮向上
  Public Const MOUSEEVENTF_ABSOLUTE = &amp;H8000 '绝对移动
  '定义
  Dim Czpmxhwnd 只要
  czpmxhwnd = FindWindow(vbNullString, "-Query result-Microsoft Internet Explorer")'根据窗口标题搜索,找到时返回句柄
  If Czpmxhwnd = 0 Then Czpmxhwnd = FindWindow(vbNullString, "Query Results-Microsoft Internet Explorer")
  如果 Czpmxhwnd = 0 那么
  MsgBox "未找到", vbOKOnly, "提示"
  退出子
  万一
  aa = SetForegroundWindow(Czpmxhwnd)'将网页置于前台
  睡眠 100
  mouse_event MOUSEEVENTF_RIGHTDOWN 或 MOUSEEVENTF_RIGHTUP, 0&amp;, 0&amp;, 0, 0' 模拟鼠标点击,设置焦点
  睡眠 100
  SendKeys "^a", True'Ctrl+A 全选
  睡眠 100
  SendKeys "^c", True'Ctrl+C 复制
  睡眠 100
  SendKeys "%{F4}", True'Alt+F4 关闭
  '打开EXCEL,粘贴
  ...
  2、强制在WebBrowser1中显示新窗口,无需打开IE或Maxthon
  使用这种方法,无论是通过程序“自动点击”“提交”按钮,还是用户点击“提交”按钮,新窗口都被强制显示在WebBrowser1中,无需打开IE或Maxthon。
  从 1 创建一个新窗口,并在窗口中放置一个 WebBrowser1。
  私有子 Form_Load()
  Dim Strurl 作为字符串
  Strurl="……"'网址
  WebBrowser1.导航strurl
  结束子
  Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  '当有新的弹出窗口时触发
  将新窗口调暗为 Form1
  设置 NewWindow = New Form1
  新窗口.显示
  设置 ppDisp = NewWindow.WebBrowser1.Object
  '上面VBA中的命令错误需要改成:
  '设置 ppDisp = NewWindow.WebBrowser1
  结束子
  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  '网页下载'时触发
  Dim I As Single, J As Single
  如果WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'Open all web pages' 根据窗口标题或其他属性,判断是完成“查询网页”还是“结果网页”
  '根据不同的需求,编写相应的命令
  ...
  结束子
  八、使用POST方式(winland提供)
  要使用这种方法,首先必须根据“查询页面”中的内容编写要提交的查询字符串。当然,如果有非英文和数字,还必须使用上面的转义函数进行转换。
  strQuery="year_start=%202007&amp;month_start=%205&amp;date_start=%2012&amp;" &amp; _
  "hour_start=%200" &amp; _
  "&amp;year_end=%202007&amp;month_end=%205&amp;date_end=%2013&amp;hour_end=%200" &amp; _
  "&amp;substation%5B%5D=00&amp;R1=sortall&amp;order=1&amp;desckey="
  '上句表示开始年月日为:2007-5-12 0:00(%20为空格),结束时间:2007-5-13 0:00,单位为00( %5B%5D 为 []),所有内容,升序,无关键字。
  '没有“提交”按钮内容
  调用 QueryStr(strQuery)
  Public Sub QueryStr(strQuery As String)

vba xmlhttp 抓取网页(写原生Ajax的方法:原生的Ajax是什么样呢?)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-11-02 18:15 • 来自相关话题

  vba xmlhttp 抓取网页(写原生Ajax的方法:原生的Ajax是什么样呢?)
  编写原生Ajax的方法:首先创建XMLHttpRequest对象;然后写回调函数onreadystatechange;然后配置请求信息;最后发送请求。
  
  Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的Web开发技术,对于提升用户体验和页面性能非常有帮助。
  简单来说,Ajax 不需要刷新页面,通过异步请求加载后台数据并呈现在网页上。常见的应用场景包括表单验证登录是否成功、百度搜索下拉框提示、快递单号查询等。
  想对Ajax有一个全面的了解,这里可以去Js教程进行全面的了解。
  现在Ajax经过各种优化已经变得很方便了。比如使用Jquery只需要一行就可以使用Ajax。
  
  那么什么是原生 Ajax?
  让我们来看看。
  
function ajax(url){
//创建XMLHttpRequest对象,新版本的浏览器可以直接创建XMLHttpRequest对象,IE5或IE6没有
//XMLHttpRequest对象,而是用的ActiveXObject对象
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")
xhr.open("get",url,true);
xhr.send();//发送请求
xhr.onreadysattechange = () =>{
if(xhr.readystate == 4){//返回存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
if(xhr.status == 200){//返回状态码
var data = xhr.responseTEXT;
return data;
}
}
}
}
  就绪状态: 查看全部

  vba xmlhttp 抓取网页(写原生Ajax的方法:原生的Ajax是什么样呢?)
  编写原生Ajax的方法:首先创建XMLHttpRequest对象;然后写回调函数onreadystatechange;然后配置请求信息;最后发送请求。
  
  Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的Web开发技术,对于提升用户体验和页面性能非常有帮助。
  简单来说,Ajax 不需要刷新页面,通过异步请求加载后台数据并呈现在网页上。常见的应用场景包括表单验证登录是否成功、百度搜索下拉框提示、快递单号查询等。
  想对Ajax有一个全面的了解,这里可以去Js教程进行全面的了解。
  现在Ajax经过各种优化已经变得很方便了。比如使用Jquery只需要一行就可以使用Ajax。
  
  那么什么是原生 Ajax?
  让我们来看看。
  
function ajax(url){
//创建XMLHttpRequest对象,新版本的浏览器可以直接创建XMLHttpRequest对象,IE5或IE6没有
//XMLHttpRequest对象,而是用的ActiveXObject对象
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")
xhr.open("get",url,true);
xhr.send();//发送请求
xhr.onreadysattechange = () =>{
if(xhr.readystate == 4){//返回存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
if(xhr.status == 200){//返回状态码
var data = xhr.responseTEXT;
return data;
}
}
}
}
  就绪状态:

vba xmlhttp 抓取网页(几种常用的方法(图)笔记介绍(组图))

网站优化优采云 发表了文章 • 0 个评论 • 127 次浏览 • 2021-10-20 19:25 • 来自相关话题

  vba xmlhttp 抓取网页(几种常用的方法(图)笔记介绍(组图))
  微知笔记的前身是网页文字快拍,所以微知笔记继承了网页文字快拍的很多功能,可以快速抓取网页内容并保存到微知笔记。下面介绍几种常用的方法:
  使用浏览器剪辑器插件
  微知笔记支持多种浏览器的网页编辑器插件,快速保存网页内容。网页保存方法包括保存整个页面、保存文本、保存选择、保存到本地等方法。如图:
  
  常见浏览器分类:
  IE内核浏览器
  Webkit内核浏览器
  浏览器中多种模式共存(不同模式使用不同工具)
  我们为一些主流浏览器提供了特殊的编辑器插件,例如:
  Chrome 浏览器
  火狐浏览器
  搜狗高速浏览器
  点击此处查看更多浏览器编辑器插件下载地址
  使用浏览器的右键菜单“Save to Wiz Notes”
  安装本地客户端或浏览器编辑插件后,浏览器右键菜单显示“保存到Wiznote”选项。点击该选项会调用Wiznote客户端进行本地保存。
  这时候也可以直接使用快捷键“Windows+S”来保存选中的内容
  
  PS:这个热键可以修改,直接在Windows客户端“Menu-&gt;Options-&gt;Webpage Clipper”中,如下图:
  
  使用浮动工具栏爬虫将网页保存到本地
  微智笔记支持在点击浮动工具栏中的保存按钮时自动抓取当前页面的选定部分进行快速保存。当前页面可以是网页、记事本、办公室等。
  
  在IE浏览器中,如果不选择任何内容进行保存,则默认保存整个界面。
  在其他非IE内核浏览器中,需要先选择需要保存的部分,然后再进行保存操作进行保存。如果不选择任何内容使用此方法保存,会提示“剪贴板抓取失败”且无法保存。
  注:浮动工具栏的调用方法:在Windows客户端点击“菜单-&gt;工具-&gt;浮动工具栏” 查看全部

  vba xmlhttp 抓取网页(几种常用的方法(图)笔记介绍(组图))
  微知笔记的前身是网页文字快拍,所以微知笔记继承了网页文字快拍的很多功能,可以快速抓取网页内容并保存到微知笔记。下面介绍几种常用的方法:
  使用浏览器剪辑器插件
  微知笔记支持多种浏览器的网页编辑器插件,快速保存网页内容。网页保存方法包括保存整个页面、保存文本、保存选择、保存到本地等方法。如图:
  
  常见浏览器分类:
  IE内核浏览器
  Webkit内核浏览器
  浏览器中多种模式共存(不同模式使用不同工具)
  我们为一些主流浏览器提供了特殊的编辑器插件,例如:
  Chrome 浏览器
  火狐浏览器
  搜狗高速浏览器
  点击此处查看更多浏览器编辑器插件下载地址
  使用浏览器的右键菜单“Save to Wiz Notes”
  安装本地客户端或浏览器编辑插件后,浏览器右键菜单显示“保存到Wiznote”选项。点击该选项会调用Wiznote客户端进行本地保存。
  这时候也可以直接使用快捷键“Windows+S”来保存选中的内容
  
  PS:这个热键可以修改,直接在Windows客户端“Menu-&gt;Options-&gt;Webpage Clipper”中,如下图:
  
  使用浮动工具栏爬虫将网页保存到本地
  微智笔记支持在点击浮动工具栏中的保存按钮时自动抓取当前页面的选定部分进行快速保存。当前页面可以是网页、记事本、办公室等。
  
  在IE浏览器中,如果不选择任何内容进行保存,则默认保存整个界面。
  在其他非IE内核浏览器中,需要先选择需要保存的部分,然后再进行保存操作进行保存。如果不选择任何内容使用此方法保存,会提示“剪贴板抓取失败”且无法保存。
  注:浮动工具栏的调用方法:在Windows客户端点击“菜单-&gt;工具-&gt;浮动工具栏”

vba xmlhttp 抓取网页(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程)

网站优化优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2021-10-13 00:11 • 来自相关话题

  vba xmlhttp 抓取网页(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程)
  示例 1
  
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for all new browsers
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = OK
// ...our code here...
}
else
{
alert("Problem retrieving XML data");
}
}
}
  自己试试
  注意:onreadystatechange 是一个事件处理程序。它的值(state_Change)是一个函数的名字,当 XMLHttpRequest 对象的状态改变时会触发这个函数。状态从 0(未初始化)变为 4(完成)。只有当状态为 4 时,我们才执行代码。
  为什么使用 Async=true?
  我们的示例在 open() 的第三个参数中使用了“true”。
  此参数指定是否异步处理请求。
  True 表示脚本将在 send() 方法之后继续执行,而无需等待服务器的响应。
  onreadystatechange 事件使代码复杂化。但这是防止代码在没有服务器响应的情况下停止的最安全方法。
  通过将此参数设置为“false”,可以省略额外的 onreadystatechange 代码。如果在请求失败时是否执行其余代码无关紧要,则可以使用此参数。
  自己试试 查看全部

  vba xmlhttp 抓取网页(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程)
  示例 1
  
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for all new browsers
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = OK
// ...our code here...
}
else
{
alert("Problem retrieving XML data");
}
}
}
  自己试试
  注意:onreadystatechange 是一个事件处理程序。它的值(state_Change)是一个函数的名字,当 XMLHttpRequest 对象的状态改变时会触发这个函数。状态从 0(未初始化)变为 4(完成)。只有当状态为 4 时,我们才执行代码。
  为什么使用 Async=true?
  我们的示例在 open() 的第三个参数中使用了“true”。
  此参数指定是否异步处理请求。
  True 表示脚本将在 send() 方法之后继续执行,而无需等待服务器的响应。
  onreadystatechange 事件使代码复杂化。但这是防止代码在没有服务器响应的情况下停止的最安全方法。
  通过将此参数设置为“false”,可以省略额外的 onreadystatechange 代码。如果在请求失败时是否执行其余代码无关紧要,则可以使用此参数。
  自己试试

vba xmlhttp 抓取网页(AJAX1.实现方式原生的JS实现 )

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-04-17 21:37 • 来自相关话题

  vba xmlhttp 抓取网页(AJAX1.实现方式原生的JS实现
)
  文章目录
  一、AJAX 1.概念
  Ajax 是一种无需重新加载整个网页即可更新部分网页的技术。它是异步 JavaScript 和 XML。
   通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某
部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
  异步:
  客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作
  同步:
  客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作
  2.实现方式Native JS实现方式
  
//定义方法
function fun() {
//发送异步请求
//1、创建核心对象
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//2、建立连接
/*
参数:
1、请求方式:GET、POST
get方式,请求参数在URL后边拼接,send方法为空参
post方式,请求参数在send中定义
2、请求的URL
3、同步或异步请求:true(异步)或false(同步)
*/
xmlhttp.open("GET", "ajaxServlet?username=tom", true);
//3、发送请求
xmlhttp.send();
//4、接收并处理来着服务的响应结果
//获取方式:xmlhttp.responseText
//当服务器响应成功后再获取
//当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange
xmlhttp.onreadystatechange = function () {
//判断readyState就绪状态是否为4,判断事件status响应状态码是否为200
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
//获取服务器的响应结果
var responseText = xmlhttp.responseText;
alert(responseText);
// document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
}

  JQeury实现方法
  1、$.ajax()
  语法:
  $,ajax({键值对});
  示例代码:
  
//定义方法
function fun() {
//使用$.ajax()发送异步请求
$.ajax({
url: "ajaxServlet",//请求路径
type: "POST",//请求方式
data: "username=jack&age=23",//请求参数方式一
data: {"usernsme": "jack", "age": 23},//方式二
success: function (data) {
alert(data);
},//响应成功后的回调函数
error: function () {
alert("出错了");
},//如果请求响应出现错误会执行的回调函数
dataType: "text",//设置接收到的响应数据的格式
});
}

  2、$.get()
  语法:
  $.get(url, [data], [callback], [type])
url:请求路径
data:请求参数
callback:回调函数
type:响应结果的类型
  示例代码:
  

//定义方法
function fun() {
$.get("ajaxServlet", {username: "rose"}, function (data) {
alert(data);
}, "text");
}

  3、$.post()
  语法:
  $.post(url, [data], [callback], [type])
  示例代码:
  二、JSON 1.概念
  JSON 是一种 JavaScript 对象表示法,现在主要用于存储和交换文本信息以及用于数据传输。 JSON 比 XML 更小、更快且更易于解析。
  2.语法基本规则
  数据在名称/值对中:json数据是由键值对构成的
键用引号(单双都行)引起来,也可以不使用引号
值的取值类型:
1. 数字(整数或浮点数)
2. 字符串(在双引号中)
3. 逻辑值(true 或 false)
4. 数组(在方括号中) {"persons":[{},{}]}
5. 对象(在花括号中) {"address":{"province":"XX"....}}
6. null
数据由逗号分隔:多个键值对由逗号分隔
花括号保存对象:使用{}定义json 格式
方括号保存数组:[]
  示例代码:
  
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//1、获取name的值
// var name = parson.name;
var name = parson["name"];
// alert(name);
// alert(parson);
//2、嵌套格式{}---->[]
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
]
};
//获取王五值
var name1 = persons.persons[2].name;
// alert(name1);
// alert(persons);
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//获取李四值
alert(ps[1].name);
// alert(ps);

  获取数据
   1. json对象.键名
2. json对象["键名"]
3. 数组对象[索引]
4. 遍历
  循环值示例:
<p>
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//获取person对象中所有的键和值
//for in循环
/* for (var key in parson) {
//获取不出来,因为相当于person."name"
// alert(key+":"+parson.key);
alert(key + ":" + parson[key]);
}*/
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//通过双层for循环获取ps的所有值
for (var i = 0; i 查看全部

  vba xmlhttp 抓取网页(AJAX1.实现方式原生的JS实现
)
  文章目录
  一、AJAX 1.概念
  Ajax 是一种无需重新加载整个网页即可更新部分网页的技术。它是异步 JavaScript 和 XML。
   通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某
部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
  异步:
  客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作
  同步:
  客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作
  2.实现方式Native JS实现方式
  
//定义方法
function fun() {
//发送异步请求
//1、创建核心对象
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//2、建立连接
/*
参数:
1、请求方式:GET、POST
get方式,请求参数在URL后边拼接,send方法为空参
post方式,请求参数在send中定义
2、请求的URL
3、同步或异步请求:true(异步)或false(同步)
*/
xmlhttp.open("GET", "ajaxServlet?username=tom", true);
//3、发送请求
xmlhttp.send();
//4、接收并处理来着服务的响应结果
//获取方式:xmlhttp.responseText
//当服务器响应成功后再获取
//当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange
xmlhttp.onreadystatechange = function () {
//判断readyState就绪状态是否为4,判断事件status响应状态码是否为200
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
//获取服务器的响应结果
var responseText = xmlhttp.responseText;
alert(responseText);
// document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
}

  JQeury实现方法
  1、$.ajax()
  语法:
  $,ajax({键值对});
  示例代码:
  
//定义方法
function fun() {
//使用$.ajax()发送异步请求
$.ajax({
url: "ajaxServlet",//请求路径
type: "POST",//请求方式
data: "username=jack&age=23",//请求参数方式一
data: {"usernsme": "jack", "age": 23},//方式二
success: function (data) {
alert(data);
},//响应成功后的回调函数
error: function () {
alert("出错了");
},//如果请求响应出现错误会执行的回调函数
dataType: "text",//设置接收到的响应数据的格式
});
}

  2、$.get()
  语法:
  $.get(url, [data], [callback], [type])
url:请求路径
data:请求参数
callback:回调函数
type:响应结果的类型
  示例代码:
  

//定义方法
function fun() {
$.get("ajaxServlet", {username: "rose"}, function (data) {
alert(data);
}, "text");
}

  3、$.post()
  语法:
  $.post(url, [data], [callback], [type])
  示例代码:
  二、JSON 1.概念
  JSON 是一种 JavaScript 对象表示法,现在主要用于存储和交换文本信息以及用于数据传输。 JSON 比 XML 更小、更快且更易于解析。
  2.语法基本规则
  数据在名称/值对中:json数据是由键值对构成的
键用引号(单双都行)引起来,也可以不使用引号
值的取值类型:
1. 数字(整数或浮点数)
2. 字符串(在双引号中)
3. 逻辑值(true 或 false)
4. 数组(在方括号中) {"persons":[{},{}]}
5. 对象(在花括号中) {"address":{"province":"XX"....}}
6. null
数据由逗号分隔:多个键值对由逗号分隔
花括号保存对象:使用{}定义json 格式
方括号保存数组:[]
  示例代码:
  
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//1、获取name的值
// var name = parson.name;
var name = parson["name"];
// alert(name);
// alert(parson);
//2、嵌套格式{}---->[]
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
]
};
//获取王五值
var name1 = persons.persons[2].name;
// alert(name1);
// alert(persons);
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//获取李四值
alert(ps[1].name);
// alert(ps);

  获取数据
   1. json对象.键名
2. json对象["键名"]
3. 数组对象[索引]
4. 遍历
  循环值示例:
<p>
//定义基本格式
var parson = {"name": "张三", age: 23, &#39;gender&#39;: true};
//获取person对象中所有的键和值
//for in循环
/* for (var key in parson) {
//获取不出来,因为相当于person."name"
// alert(key+":"+parson.key);
alert(key + ":" + parson[key]);
}*/
//2、嵌套格式[]---->{}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 13, "gender": true},
{"name": "王五", "age": 45, "gender": false}
];
//通过双层for循环获取ps的所有值
for (var i = 0; i

vba xmlhttp 抓取网页(集搜客GooSeeker网络爬虫如何在数据时自动抓取数据相关内容)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-04-13 12:19 • 来自相关话题

  vba xmlhttp 抓取网页(集搜客GooSeeker网络爬虫如何在数据时自动抓取数据相关内容)
  (°ο°) 互联网不断涌现出新的信息、新的设计模式和海量的数据。将这些数据组织到一个独特的库中并非易事。但是,有很多优秀的网络抓取工具可用。ProxyCrawl 使用Proxy Crawl API,可以找到关于python不打开页面抓取数据的相关内容,包括python不打开页面抓取数据相关文档代码介绍,相关教程视频课程,以及相关python不打开页面抓取数据打开页面爬取数据问答内容。为您解决当前阶段。
  爬取网页数据的方法如上所述。爬取数据只是一小步。如何分析数据是大学的问题。欢迎讨论。上面不清楚的是,我们在爬取数据时,通常不会只爬取网页当前页面的数据,而是经常在翻页后继续爬取数据。本文将向大家介绍GooSeeker网络爬虫是如何在爬取时自动爬取数据的。
  站长之家注:在大数据时代,如何有效获取数据已成为驱动业务决策的关键技能。分析市场趋势、监控竞争对手等都需要数据采集。网页抓取是数据采集的主要方法之一。在这篇文章中,Chris是如何从网页的源代码中抓取到他想要的数据,但是在源代码中还是有很多数据是看不到的。显示的金额是25000。如上图,我想得到红框中“保本”的金额,但是通过查看网页的源代码,发现保证金的金额在源代码。
  Web Scraper 插件允许您以“所见即所得”的方式选择要提取的网页数据形成模板,以后可以随时执行,执行结果可以导出为 CSV 格式。网页爬虫对比类可以获取数据但是不能在页面上渲染问题描述:我获取到了所有的数据,js写的console.log(音乐)数据打印正确,但是页面上不显示。多次对数。
  我是按照你的方法修改的,不知道是不是网页结构的原因。爬取的数据有空白是因为怕爬虫爬不到介绍。本期文章主要介绍了“必须知道”的14条采集数据网站,解决工作中90%以上的问题!以及相关的经验技巧,文章约2725字,278浏览量,6个赞,值得推荐!在日常生活中。 查看全部

  vba xmlhttp 抓取网页(集搜客GooSeeker网络爬虫如何在数据时自动抓取数据相关内容)
  (°ο°) 互联网不断涌现出新的信息、新的设计模式和海量的数据。将这些数据组织到一个独特的库中并非易事。但是,有很多优秀的网络抓取工具可用。ProxyCrawl 使用Proxy Crawl API,可以找到关于python不打开页面抓取数据的相关内容,包括python不打开页面抓取数据相关文档代码介绍,相关教程视频课程,以及相关python不打开页面抓取数据打开页面爬取数据问答内容。为您解决当前阶段。
  爬取网页数据的方法如上所述。爬取数据只是一小步。如何分析数据是大学的问题。欢迎讨论。上面不清楚的是,我们在爬取数据时,通常不会只爬取网页当前页面的数据,而是经常在翻页后继续爬取数据。本文将向大家介绍GooSeeker网络爬虫是如何在爬取时自动爬取数据的。
  站长之家注:在大数据时代,如何有效获取数据已成为驱动业务决策的关键技能。分析市场趋势、监控竞争对手等都需要数据采集。网页抓取是数据采集的主要方法之一。在这篇文章中,Chris是如何从网页的源代码中抓取到他想要的数据,但是在源代码中还是有很多数据是看不到的。显示的金额是25000。如上图,我想得到红框中“保本”的金额,但是通过查看网页的源代码,发现保证金的金额在源代码。
  Web Scraper 插件允许您以“所见即所得”的方式选择要提取的网页数据形成模板,以后可以随时执行,执行结果可以导出为 CSV 格式。网页爬虫对比类可以获取数据但是不能在页面上渲染问题描述:我获取到了所有的数据,js写的console.log(音乐)数据打印正确,但是页面上不显示。多次对数。
  我是按照你的方法修改的,不知道是不是网页结构的原因。爬取的数据有空白是因为怕爬虫爬不到介绍。本期文章主要介绍了“必须知道”的14条采集数据网站,解决工作中90%以上的问题!以及相关的经验技巧,文章约2725字,278浏览量,6个赞,值得推荐!在日常生活中。

vba xmlhttp 抓取网页(我对Google表格抓取了解不多我无法正确获取数据(图) )

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2022-04-11 18:14 • 来自相关话题

  vba xmlhttp 抓取网页(我对Google表格抓取了解不多我无法正确获取数据(图)
)
  用户名
  我应该如何抓取这个页面,具体需要表中提到的ROE数?
  我在 Excel 中使用了以下代码。我对 Google 表格抓取了解不多
   Sub FetchData()
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;https://www.bseindia.com/stock ... ot%3B, Destination:=Range( _
"$A$1"))
.Name = "www"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
  我无法正确获取数据。
  有什么建议/帮助吗? ROE图是必须的,其余的不需要。
  QHarr
  使用页面可以更快地使用其 API。您可以使用 powerquery 来处理 json 响应、json 解析器或只是拆分。如果您想在按钮按下时刷新,请将代码放在标准模块中并链接到按钮。
  Option Explicit
Public Sub GetInfo()
Dim s As String, ids(), i As Long
ids = Array(500820, 500312, 500325, 532540)
With CreateObject("MSXML2.XMLHTTP")
For i = LBound(ids) To UBound(ids)
.Open "GET", "https://api.bseindia.com/BseIn ... ot%3B & ids(i) & "&seriesid=", False
.send
s = .responseText
ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0)
Next
End With
End Sub 查看全部

  vba xmlhttp 抓取网页(我对Google表格抓取了解不多我无法正确获取数据(图)
)
  用户名
  我应该如何抓取这个页面,具体需要表中提到的ROE数?
  我在 Excel 中使用了以下代码。我对 Google 表格抓取了解不多
   Sub FetchData()
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;https://www.bseindia.com/stock ... ot%3B, Destination:=Range( _
"$A$1"))
.Name = "www"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
  我无法正确获取数据。
  有什么建议/帮助吗? ROE图是必须的,其余的不需要。
  QHarr
  使用页面可以更快地使用其 API。您可以使用 powerquery 来处理 json 响应、json 解析器或只是拆分。如果您想在按钮按下时刷新,请将代码放在标准模块中并链接到按钮。
  Option Explicit
Public Sub GetInfo()
Dim s As String, ids(), i As Long
ids = Array(500820, 500312, 500325, 532540)
With CreateObject("MSXML2.XMLHTTP")
For i = LBound(ids) To UBound(ids)
.Open "GET", "https://api.bseindia.com/BseIn ... ot%3B & ids(i) & "&seriesid=", False
.send
s = .responseText
ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0)
Next
End With
End Sub

vba xmlhttp 抓取网页(《VBA信息获取与处理》教程之HTML与HTML)

网站优化优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-04-11 12:00 • 来自相关话题

  vba xmlhttp 抓取网页(《VBA信息获取与处理》教程之HTML与HTML)
  【分享成果,为正能量而欢欣鼓舞】“人情如纸,世界如一盘棋”,对外界叠加期待,简直是在骚扰自己。世事跌宕起伏,学会放弃依赖,降低期望,控制敏感,多一些冷漠,顺其自然,更容易得到意想不到的快乐。
  《VBA信息获取与处理》教程是我推出的第六套教程,目前是第一次改版。这套教程定位在最高级的水平。这是针对初学者和中级的教程。本教程将为大家讲解:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO对象的使用、获取工作表和文件夹信息、图形信息获取、自定义工作表信息功能等。程序文件在32位和64位OFFICE系统上测试。非常抽象,更有研究价值。
  本课程由两卷八十四讲组成。今天的内容是话题八《VBA与HTML文档》:文档访问端口DOM
  
  第 5 节 HTML 文档访问端口 DOM(文档对象模型)
  大家好,我们继续研究HTML文档。在前面的部分中,我们了解了 Web 文档中的各种元素,那么我们如何访问它们,以及如何实现它们呢?实际上,HTML 文档提供了访问其元素的端口,即 HTML DOM,它定义了一组标准的机制,用于访问或操作 HTML 文档中的对象。 HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换句话说,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。
  1 HTML DOM(文档对象模型)对象集合
  加载到浏览器中的每个 HTML 文档都成为一个 Document 对象。 Document 对象使我们能够从脚本访问 HTML 页面中的所有元素。 Document 对象是 HTML 文档的根节点。
  特别说明:Document对象是Window对象的一部分,可以通过window.document属性访问。
  集合说明
  all[] 提供对文档中所有 HTML 元素的访问。
  anchors[] 返回对文档中所有 Anchor 对象的引用。
  applet 返回对文档中所有 Applet 对象的引用。
  forms[] 返回对文档中所有 Form 对象的引用。
  images[] 返回对文档中所有 Image 对象的引用。
  links[] 返回对文档中所有 Area 和 Link 对象的引用。
  VBA 直接支持有限数量的对象调用,如下:
  对象描述
  Document代表整个HTML文档,可以用来访问页面中的所有元素
  锚点代表元素的集合
  body代表元素
  表单代表元素的集合
  框架表示元素或元素的集合
  图片代表
  元素的集合
  链接代表元素的集合
  Options表示元素的集合(可以直接在select元素中使用)
  Cells表示元素的集合(可以直接用在表格元素中)
  Rows表示元素的集合(可以直接用在表格元素中)
  提供对文档中所有 HTML 元素的访问的所有对象的集合。
  上面的VBA支持直接调用对象的元素,调用起来很方便。可以通过序号调用,比如forms(0),也可以通过name/ID调用,比如forms("name/ID")。其他不能直接调用对象的元素可以间接调用元素或者DOM对象对应的元素来自一般的所有对象集合。
  (待续)
  本节知识点介绍:
  HTML DOM 文档的属性有哪些,常用的属性有哪些。
  本节参考:008 Worksheet.xlsm
  
  我 20 多年的 VBA 实践经验全部浓缩为以下教程,按顺序排列:
  
  【分享成果,快乐正能量】只要身体健康平安,人生就是最充实的人生,人生就是最美好的一天。 查看全部

  vba xmlhttp 抓取网页(《VBA信息获取与处理》教程之HTML与HTML)
  【分享成果,为正能量而欢欣鼓舞】“人情如纸,世界如一盘棋”,对外界叠加期待,简直是在骚扰自己。世事跌宕起伏,学会放弃依赖,降低期望,控制敏感,多一些冷漠,顺其自然,更容易得到意想不到的快乐。
  《VBA信息获取与处理》教程是我推出的第六套教程,目前是第一次改版。这套教程定位在最高级的水平。这是针对初学者和中级的教程。本教程将为大家讲解:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO对象的使用、获取工作表和文件夹信息、图形信息获取、自定义工作表信息功能等。程序文件在32位和64位OFFICE系统上测试。非常抽象,更有研究价值。
  本课程由两卷八十四讲组成。今天的内容是话题八《VBA与HTML文档》:文档访问端口DOM
  
  第 5 节 HTML 文档访问端口 DOM(文档对象模型)
  大家好,我们继续研究HTML文档。在前面的部分中,我们了解了 Web 文档中的各种元素,那么我们如何访问它们,以及如何实现它们呢?实际上,HTML 文档提供了访问其元素的端口,即 HTML DOM,它定义了一组标准的机制,用于访问或操作 HTML 文档中的对象。 HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换句话说,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。
  1 HTML DOM(文档对象模型)对象集合
  加载到浏览器中的每个 HTML 文档都成为一个 Document 对象。 Document 对象使我们能够从脚本访问 HTML 页面中的所有元素。 Document 对象是 HTML 文档的根节点。
  特别说明:Document对象是Window对象的一部分,可以通过window.document属性访问。
  集合说明
  all[] 提供对文档中所有 HTML 元素的访问。
  anchors[] 返回对文档中所有 Anchor 对象的引用。
  applet 返回对文档中所有 Applet 对象的引用。
  forms[] 返回对文档中所有 Form 对象的引用。
  images[] 返回对文档中所有 Image 对象的引用。
  links[] 返回对文档中所有 Area 和 Link 对象的引用。
  VBA 直接支持有限数量的对象调用,如下:
  对象描述
  Document代表整个HTML文档,可以用来访问页面中的所有元素
  锚点代表元素的集合
  body代表元素
  表单代表元素的集合
  框架表示元素或元素的集合
  图片代表
  元素的集合
  链接代表元素的集合
  Options表示元素的集合(可以直接在select元素中使用)
  Cells表示元素的集合(可以直接用在表格元素中)
  Rows表示元素的集合(可以直接用在表格元素中)
  提供对文档中所有 HTML 元素的访问的所有对象的集合。
  上面的VBA支持直接调用对象的元素,调用起来很方便。可以通过序号调用,比如forms(0),也可以通过name/ID调用,比如forms("name/ID")。其他不能直接调用对象的元素可以间接调用元素或者DOM对象对应的元素来自一般的所有对象集合。
  (待续)
  本节知识点介绍:
  HTML DOM 文档的属性有哪些,常用的属性有哪些。
  本节参考:008 Worksheet.xlsm
  
  我 20 多年的 VBA 实践经验全部浓缩为以下教程,按顺序排列:
  
  【分享成果,快乐正能量】只要身体健康平安,人生就是最充实的人生,人生就是最美好的一天。

vba xmlhttp 抓取网页(MFaizanFarooqExcel工作表中的地址字段变为空白结果(r,4) )

网站优化优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2022-04-08 05:17 • 来自相关话题

  vba xmlhttp 抓取网页(MFaizanFarooqExcel工作表中的地址字段变为空白结果(r,4)
)
  M费赞法鲁克
  Excel 工作表中的地址字段变为空白
  结果(r, 4) = comment("街道地址")
  在网页抓取期间;我正在从 网站 导入字段并相应地导入数据,请指导我。
  表 A1 =
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", Sheet1.Range("A1") & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
ThisWorkbook.Worksheets(sheetName).ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = review("streetAddress") 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .Test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
  我一直在尝试获取以下代码的地址范围,我是 VBA 新手,因此将不胜感激。
  哈尔
  地址的json访问路径不同
  review("address") 给出字典
  
  您需要按键访问各个行,或者像我一样,连接字典的所有项目以为完整地址创建一个空格分隔的字符串。
  VBA:
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", "https://www.yellowpages.com/at ... ot%3B & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
Set ws = ThisWorkbook.Worksheets(sheetName)
ws.Cells.ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = Replace$(Join$(review("address").items, " "), "PostalAddress ", vbNullString) 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function 查看全部

  vba xmlhttp 抓取网页(MFaizanFarooqExcel工作表中的地址字段变为空白结果(r,4)
)
  M费赞法鲁克
  Excel 工作表中的地址字段变为空白
  结果(r, 4) = comment("街道地址")
  在网页抓取期间;我正在从 网站 导入字段并相应地导入数据,请指导我。
  表 A1 =
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", Sheet1.Range("A1") & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
ThisWorkbook.Worksheets(sheetName).ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = review("streetAddress") 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .Test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
  我一直在尝试获取以下代码的地址范围,我是 VBA 新手,因此将不胜感激。
  哈尔
  地址的json访问路径不同
  review("address") 给出字典
  
  您需要按键访问各个行,或者像我一样,连接字典的所有项目以为完整地址创建一个空格分隔的字符串。
  VBA:
  Option Explicit
Public Sub GetRestuarantInfo()
Dim s As String, re As Object, p As String, page As Long, r As String, json As Object 'Variable Definations
Const START_PAGE As Long = 2
Const END_PAGE As Long = 4
Const RESULTS_PER_PAGE As Long = 40
p = "\[{""@context"".*?\]"
Set re = CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
With CreateObject("MSXML2.XMLHTTP")
For page = START_PAGE To END_PAGE ' Run for loop for defined Page numbers
.Open "GET", "https://www.yellowpages.com/at ... ot%3B & page, False
.send
If .Status = 200 Then
s = .responseText
r = GetValue(re, s, p)
If r "Not Found" Then
Set json = JsonConverter.ParseJson(r)
WriteOutResults page, RESULTS_PER_PAGE, json
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Public Sub WriteOutResults(ByVal page As Long, ByVal RESULTS_PER_PAGE As Long, ByVal json As Object)
Dim sheetName As String, results(), r As Long, headers(), ws As Worksheet
ReDim results(1 To RESULTS_PER_PAGE, 1 To 4)
sheetName = "page" & page ' This module is just to write results pagewise which is not needed in your case
headers = Array("Name", "Website", "Tel", "Address") 'Defination of headers
If Not WorksheetExists(sheetName) Then ' Creation of sheets
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
Else
Set ws = ThisWorkbook.Worksheets(sheetName)
ws.Cells.ClearContents
End If
With ws
Dim review As Object
For Each review In json ' Bringing results from Json to excel sheet
r = r + 1
results(r, 1) = review("name") 'write results of name field
results(r, 2) = review("url") 'write results of url field
results(r, 3) = review("telephone") 'write results of telephone field
results(r, 4) = Replace$(Join$(review("address").items, " "), "PostalAddress ", vbNullString) 'write results of telephone field
Next
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End Sub
Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
With re
.Global = True
.MultiLine = True
.IgnoreCase = False 'Use case-insensitive matching.
.pattern = pattern 'The pattern (written in Regex) which you want to match against (e.g. “(.*)”)
'Test (string) – returns True if the pattern can be matched agaist the provided string
'Web Link: https://analystcave.com/excel-regex-tutorial/
If .test(inputString) Then
GetValue = .Execute(inputString)(0)
Else
GetValue = "Not found"
End If
End With
End Function
Public Function WorksheetExists(ByVal sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function

vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)

网站优化优采云 发表了文章 • 0 个评论 • 132 次浏览 • 2022-03-30 21:03 • 来自相关话题

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 &#39;row
For j = 0 To tb(H).Cells.Length - 1 &#39;cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
&#39;创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
&#39;发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
&#39;等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
&#39;得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。 查看全部

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 &#39;row
For j = 0 To tb(H).Cells.Length - 1 &#39;cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
&#39;创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
&#39;发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
&#39;等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
&#39;得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。

vba xmlhttp 抓取网页( 我的代码:PublicSubRoupa() )

网站优化优采云 发表了文章 • 0 个评论 • 108 次浏览 • 2022-03-16 01:07 • 来自相关话题

  vba xmlhttp 抓取网页(
我的代码:PublicSubRoupa()
)
  Excel VBA 跨多个网页抓取
  excelvbaweb-scraping
  Excel VBA 跨多个网页数据抓取,效果很好。我现在的“问题”是我需要为多个网页运行代码,因为我正在抓取的 网站 有一个分页脚本。一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。我的代码:Public Sub Roupa()Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
  所以我有以下代码从 网站 中删除数据,它工作正常。
  我现在的“问题”是我需要为多个页面运行代码,因为我正在抓取的 网站 有一个分页脚本。
  一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。
  我的代码:
  Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.worten.pt/grandes- ... ot%3B, False
.send
html.body.innerHTML = .responseText
End With
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
  Public子组a()
Dim数据作为对象,i作为长,html作为HTMLDocument,r作为长,c作为长,item作为对象,div作为对象
设置html=New HTMLDocument'Tools>References>Microsoft html对象库
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://www.worten.pt/grandes- ... 3D100”“错
邮寄
html.body.innerHTML=.responseText

Set data=html.getElementsByClassName(“w-product\u内容”)
对于数据中的每个项目
r=r+1:c=1
对于item.getElementsByTagName(“div”)中的每个div
使用此工作簿。工作表(“组A”)
.Cells(r,c)=div.innerText

c=c+1
下一个
下一个
表格(“A”)。范围(“A:A,C:C,F:F,G:G,H:H,I:I”)。全部删除
端接头
  更新
  我尝试过使用
  的
  在 n=1 到 2 之前添加这个
  ,但我需要知道确切的页数,这样就没有什么帮助了。通过将结果计数除以每页的结果来计算出有多少页。然后执行一个循环,将适当的页码连接到url上</p>
Option Explicit
Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
Const RESULTS_PER_PAGE As Long = 48
Const START_URL As String = "https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", START_URL, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
Dim numPages As Long, numResults As Long, arr() As String
arr = Split(html.querySelector(".w-filters__element").innerText, Chr$(32))
numResults = arr(UBound(arr))
numPages = 1
If numResults > RESULTS_PER_PAGE Then
numPages = Application.RoundUp(numResults / RESULTS_PER_PAGE, 0)
End If
For i = 1 To numPages
If i > 1 Then
.Open "GET", Replace$("https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1", "page=1", "page=" & i), False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
End If
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Next
End With
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
</p>
  如果您尝试在 URL 中更改它-
  每页=100
  说
  每页=100000
  ?我试过了,实际上页面只加载了48条记录
  每页=100
  @QHarr 已经提供了我的尝试
  w-filters\uu元素
  导出页数的好方法。但是,另一种方法(我通常使用的)是循环(增加页数)直到分页之后
  列表元素的
  在内部文本中查找下一个页码(在这种情况下,
  分页文本中心
  或 Div 类
  w-pagination-block
  ) 该死的你是个天才! !你有好的课程吗?我想了解更多! !和
  numPages = html.querySelectorAll("[data-page]").Length 查看全部

  vba xmlhttp 抓取网页(
我的代码:PublicSubRoupa()
)
  Excel VBA 跨多个网页抓取
  excelvbaweb-scraping
  Excel VBA 跨多个网页数据抓取,效果很好。我现在的“问题”是我需要为多个网页运行代码,因为我正在抓取的 网站 有一个分页脚本。一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。我的代码:Public Sub Roupa()Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
  所以我有以下代码从 网站 中删除数据,它工作正常。
  我现在的“问题”是我需要为多个页面运行代码,因为我正在抓取的 网站 有一个分页脚本。
  一个页面有48条记录,但大多数情况下,页面有200多条记录,但又分为3/4页。
  我的代码:
  Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.worten.pt/grandes- ... ot%3B, False
.send
html.body.innerHTML = .responseText
End With
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
  Public子组a()
Dim数据作为对象,i作为长,html作为HTMLDocument,r作为长,c作为长,item作为对象,div作为对象
设置html=New HTMLDocument'Tools>References>Microsoft html对象库
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://www.worten.pt/grandes- ... 3D100”“错
邮寄
html.body.innerHTML=.responseText

Set data=html.getElementsByClassName(“w-product\u内容”)
对于数据中的每个项目
r=r+1:c=1
对于item.getElementsByTagName(“div”)中的每个div
使用此工作簿。工作表(“组A”)
.Cells(r,c)=div.innerText

c=c+1
下一个
下一个
表格(“A”)。范围(“A:A,C:C,F:F,G:G,H:H,I:I”)。全部删除
端接头
  更新
  我尝试过使用
  的
  在 n=1 到 2 之前添加这个
  ,但我需要知道确切的页数,这样就没有什么帮助了。通过将结果计数除以每页的结果来计算出有多少页。然后执行一个循环,将适当的页码连接到url上</p>
Option Explicit
Public Sub Roupa()
Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
Set html = New HTMLDocument ' Tools > References > Microsoft HTML Object Library
Const RESULTS_PER_PAGE As Long = 48
Const START_URL As String = "https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", START_URL, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
Dim numPages As Long, numResults As Long, arr() As String
arr = Split(html.querySelector(".w-filters__element").innerText, Chr$(32))
numResults = arr(UBound(arr))
numPages = 1
If numResults > RESULTS_PER_PAGE Then
numPages = Application.RoundUp(numResults / RESULTS_PER_PAGE, 0)
End If
For i = 1 To numPages
If i > 1 Then
.Open "GET", Replace$("https://www.worten.pt/grandes- ... ot%3B & RESULTS_PER_PAGE & "&page=1", "page=1", "page=" & i), False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
End If
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Next
End With
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
</p>
  如果您尝试在 URL 中更改它-
  每页=100
  说
  每页=100000
  ?我试过了,实际上页面只加载了48条记录
  每页=100
  @QHarr 已经提供了我的尝试
  w-filters\uu元素
  导出页数的好方法。但是,另一种方法(我通常使用的)是循环(增加页数)直到分页之后
  列表元素的
  在内部文本中查找下一个页码(在这种情况下,
  分页文本中心
  或 Div 类
  w-pagination-block
  ) 该死的你是个天才! !你有好的课程吗?我想了解更多! !和
  numPages = html.querySelectorAll("[data-page]").Length

vba xmlhttp 抓取网页(VBA编程中常用“积木”过程代码(288期))

网站优化优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-03-06 11:24 • 来自相关话题

  vba xmlhttp 抓取网页(VBA编程中常用“积木”过程代码(288期))
  天涯海角,风景如画,别蜷缩在世界的一小块以为是天堂的地方。当你处于暮年时,你会满足于欺骗自己和他人。你必须努力提高自己。学习是一件非常困难的事情。拥有一颗充满活力的心,把握当下,这就是进步。机会总是在等待,越有意义的事情,困难就越多。意愿决定一切,智慧决定成败。找到内心的平静;无论遇到什么,都是一道风景。善良,行善。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。让浮躁的心平静下来,感受实时,静下心来,多学习,积福。保持快乐的心态,坚定而执着。学习有用的知识,管理好自己,而不是每天乱七八糟,过日子。为后疫情时代储备知识。在未来更严重的杀股世界中,为自己的生存储备知识,尤其是新知识。
  在取代OFFICE的新办公软件出现之前,谁的数据处理能力最好,谁就是王者。技巧的巅峰莫过于VBA!
  今天继续给大家分享VBA编程中常用的“积木”流程代码。这个内容大部分是我的经历的记录,来源于我多年的经验。最近大部分代码来自《VBA数组和字典解决方案》教程。有朋友反映分享的内容看不懂。大家可以参考这套教材的内容进行学习。今天的分享是第288期。
  
  VBA程序代码288:使用工作表函数将字典的键值按大小排序,并给出对应的键
  子 MyNZ ()
  昏暗的奔跑
  表(“60”)。选择
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  TT = 单元格(Rows.Count,1).End(xlUp).Row
  For Each run In Sheets("60").Range("a2:a" &amp; Cells(Rows.Count, 1).End(xlUp).Row)
  如果运行.Value "" 那么
  If Not mydic.exists(ran.Value) Then
  mydic.Add ran.Value, 1 '需要注意的是这里要加上VALUE
  别的
  mydic(ran.Value) = mydic(ran.Value) + 1
  万一
  万一
  下一个
  '注意这里取出字典的键和键值
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 1) = Application.Large(K, i) '将数据按照最大值的顺序放入数组中
  X(i, 2) = mydic(X(i, 1)) '提取对应的key值
  下一个
  我的计数 = i - 1
  设置 mydic = 无
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  对于 i = 1 到 MYCOUNT
  mydic(X(i, 1)) = X(i, 2)
  下一个
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 2) = Application.Max(T)
  '找到钥匙的位置
  W = Application.Match(X(i, 2), T, 0) - 1
  ' 提取密钥
  X(i, 1) = K(W)
  '对应键值变空使用MAX函数
  T(W) = ""
  下一个
  [e:f].清除
  [E1] = "排序": [f1] = "重复次数"
  Sheets("60").[E2].Resize(mydic.Count, 2) = X
  设置 mydic = 无
  结束子
  代码分析:上述过程实现了将数据加载到字典mydic中,将值放入字典的key中,将出现次数放入key值中,然后将key和key值放入分别是数组 K 和 T。请注意,它是一维的。数组,然后对值进行排序,使用大函数,排序完成后,再次加载字典,取出key和key值,这里处理的目的是得到一维数组,或者其他处理方式可以使用,然后对key值进行排序,使用MAX函数,最后形成对value出现次数排序再对value排序的结果,放入数组X中,最后回填数据.
  
  VBA是使用Office实现自己的小型办公自动化的一种有效方式。基于我20多年的VBA实践经验,我现在已经推出了四期VBA学习教程,这也是我“积木式编程”思想的具体体现。
  第一:VBA代码解法是对VBA中各个知识点的讲解。本教程可以涵盖大部分知识点;
  第二:VBA数据库解决方案是数据处理的专业工具。详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作。
  第三:VBA数组和字典解决方案,讲解VBA中数组和字典的使用。字典是提高VBA代码水平的一种手段,值得深入研究。
  第四:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。
  以上教程的学习顺序,1、3、2或4、3、2逐渐加深对VBA的理解,掌握VBA。目前正集中精力写第五篇教程:VBA中类的解释与利用。在所有平台上认识所有人。
  使用VBA实现小型个人办公自动化,非常值得学习。希望每个人都能掌握这个工具,用这个工具让自己的工作变得轻松、高效、快乐。我的“积木式编程”理念也值得借鉴。这个想法让大家从代码中解放出来,以模块的形式构建自己的应用程序,提高了他们的编程效率。根据我提供的经验,花时间了解更多信息。 查看全部

  vba xmlhttp 抓取网页(VBA编程中常用“积木”过程代码(288期))
  天涯海角,风景如画,别蜷缩在世界的一小块以为是天堂的地方。当你处于暮年时,你会满足于欺骗自己和他人。你必须努力提高自己。学习是一件非常困难的事情。拥有一颗充满活力的心,把握当下,这就是进步。机会总是在等待,越有意义的事情,困难就越多。意愿决定一切,智慧决定成败。找到内心的平静;无论遇到什么,都是一道风景。善良,行善。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。让浮躁的心平静下来,感受实时,静下心来,多学习,积福。保持快乐的心态,坚定而执着。学习有用的知识,管理好自己,而不是每天乱七八糟,过日子。为后疫情时代储备知识。在未来更严重的杀股世界中,为自己的生存储备知识,尤其是新知识。
  在取代OFFICE的新办公软件出现之前,谁的数据处理能力最好,谁就是王者。技巧的巅峰莫过于VBA!
  今天继续给大家分享VBA编程中常用的“积木”流程代码。这个内容大部分是我的经历的记录,来源于我多年的经验。最近大部分代码来自《VBA数组和字典解决方案》教程。有朋友反映分享的内容看不懂。大家可以参考这套教材的内容进行学习。今天的分享是第288期。
  
  VBA程序代码288:使用工作表函数将字典的键值按大小排序,并给出对应的键
  子 MyNZ ()
  昏暗的奔跑
  表(“60”)。选择
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  TT = 单元格(Rows.Count,1).End(xlUp).Row
  For Each run In Sheets("60").Range("a2:a" &amp; Cells(Rows.Count, 1).End(xlUp).Row)
  如果运行.Value "" 那么
  If Not mydic.exists(ran.Value) Then
  mydic.Add ran.Value, 1 '需要注意的是这里要加上VALUE
  别的
  mydic(ran.Value) = mydic(ran.Value) + 1
  万一
  万一
  下一个
  '注意这里取出字典的键和键值
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 1) = Application.Large(K, i) '将数据按照最大值的顺序放入数组中
  X(i, 2) = mydic(X(i, 1)) '提取对应的key值
  下一个
  我的计数 = i - 1
  设置 mydic = 无
  设置 mydic = CreateObject("Scripting.Dictionary") '字典
  对于 i = 1 到 MYCOUNT
  mydic(X(i, 1)) = X(i, 2)
  下一个
  K = mydic.keys:T = mydic.items
  ReDim X(1 To mydic.Count, 1 To 2)
  对于 i = 1 到 mydic.Count
  X(i, 2) = Application.Max(T)
  '找到钥匙的位置
  W = Application.Match(X(i, 2), T, 0) - 1
  ' 提取密钥
  X(i, 1) = K(W)
  '对应键值变空使用MAX函数
  T(W) = ""
  下一个
  [e:f].清除
  [E1] = "排序": [f1] = "重复次数"
  Sheets("60").[E2].Resize(mydic.Count, 2) = X
  设置 mydic = 无
  结束子
  代码分析:上述过程实现了将数据加载到字典mydic中,将值放入字典的key中,将出现次数放入key值中,然后将key和key值放入分别是数组 K 和 T。请注意,它是一维的。数组,然后对值进行排序,使用大函数,排序完成后,再次加载字典,取出key和key值,这里处理的目的是得到一维数组,或者其他处理方式可以使用,然后对key值进行排序,使用MAX函数,最后形成对value出现次数排序再对value排序的结果,放入数组X中,最后回填数据.
  
  VBA是使用Office实现自己的小型办公自动化的一种有效方式。基于我20多年的VBA实践经验,我现在已经推出了四期VBA学习教程,这也是我“积木式编程”思想的具体体现。
  第一:VBA代码解法是对VBA中各个知识点的讲解。本教程可以涵盖大部分知识点;
  第二:VBA数据库解决方案是数据处理的专业工具。详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作。
  第三:VBA数组和字典解决方案,讲解VBA中数组和字典的使用。字典是提高VBA代码水平的一种手段,值得深入研究。
  第四:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。
  以上教程的学习顺序,1、3、2或4、3、2逐渐加深对VBA的理解,掌握VBA。目前正集中精力写第五篇教程:VBA中类的解释与利用。在所有平台上认识所有人。
  使用VBA实现小型个人办公自动化,非常值得学习。希望每个人都能掌握这个工具,用这个工具让自己的工作变得轻松、高效、快乐。我的“积木式编程”理念也值得借鉴。这个想法让大家从代码中解放出来,以模块的形式构建自己的应用程序,提高了他们的编程效率。根据我提供的经验,花时间了解更多信息。

vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2022-03-03 08:02 • 来自相关话题

  vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)
  《VBA信息获取与处理》教程第八题“VBA与HTML文档”第七节“HTML DOM的对象事件与关联”太无聊了。希望想掌握这方面知识的朋友可以参考我的教程。. 今天我们开始学习“使用IE捕获网络数据”的第九个话题。
  在我们的网页抓取部分,在讲解了XMLHTTP方法之后,我们利用两个题目的进度,讲解了一些与VBA不太相关的网络知识。这两个话题对于我们重新认识网络抓取数据具有重要意义。,虽然我的解释不能包罗万象,但是对于我经常提倡的VBA定位来说已经足够了。此外,学习是一个不断积累和进步的过程。你需要掌握的是一些基本的理论,然后把它们应用到自己身上。在实践中,这是关键。从这个话题开始,我们继续我们对网络爬虫的研究。本主题是使用IE爬取网络数据。其实就是使用控件来完成我们的工作。
  第一部分使用IE方法提取网页数据的基础
  为了获取网页的数据,我们可以创建IE控件或者webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
  该方法可以模拟大多数浏览器操作。浏览器能看到的数据可以通过代码获取,但是有个致命的缺点:除了烦人的弹窗,兼容性确实是个很烦人的问题。在我自己的实践中,感觉这种方法不是很稳定(只是感觉)。
  1 IE模型的创建
  我们在实际工作中遇到网站和网页相关的问题,比如:如何下载网页数据?网页之间的通信是如何实现的,是否可以控制等等。如果你是用VB/VBA/脚本或者其他支持自动化对象(AUTOMATION)的语言编程,一个值得知道的方法是掌握对象模型:把网页当作对象来控制,这个方法需要了解自动化对象IE (InternetExplorer.Application) 或 IE 控件 (Microsoft Internet Controls) 以及标准的文档对象模型 (Document)。前两个题目我已经讲解了很多相关知识,这里就不详细讲解了。
  我给出以下代码:
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate "about:blank" '创建一个空白页面
  以上几行代码的作用是创建一个IE应用对象,打开一个空白网页。这个网页独立于VBA应用程序(WORD或EXCEL),其实你得自己关闭,或者使用ie.Quit命令退出——注意,简单关闭VBA或者SET ie=nothing不会退出这个页面. 我们经常使用的是把第 3 行的字符串替换成 网站 的名字,或者你主机中的文档名,或者图片名,这样都可以。它与通过在 IE 地址栏中键入名称来浏览这些文档具有相同的效果。
  如果只是创建一个空模型没有任何使用价值,我们需要一个真实的网页,那么我们需要在VBA应用程序之外打开一个完整的网页,直到网页完全加载。下面继续。
  2 IE网页加载
  让我们修复上面打开一个空网页的代码:
  子 mynz()
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate " " '创建一个空白页面
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  结束子
  在上面的代码中添加了几行:
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  这几行代码可以保证网页的加载完成,根据ie.ReadyState的返回值来判断。
  readyState 中有 5 个状态:
  状态含义描述
  0 未初始化对象已创建,但尚未初始化(尚未调用open方法)
  1 初始化对象已经建立,send方法还没有被调用
  2 发送数据的send()方法已经调用,但当前状态和http头未知
  3 数据传输中已经收到了一些数据,由于response和http header不完整,那么通过responseBody和responseText获取一些数据时会报错
  4 收到数据后,可以通过responseBody和responseText获取完整的响应数据
  通过上面的分析可以看出,只有当.ReadyState = 4时,网页的数据才是有效数据。
  3 获取IE页面数据
  当网页加载完毕后,剩下的工作就是从网页中抓取数据。数据抓取主要是利用控件对象的属性和方法。
  1)使用Set doc = ie.Document 获取网页的文档对象
  从表示网页内容的文档对象(Document)扩展而来的对象模型与之前的IE应用程序不是一个系统。
  Documnet(文档)是一个文档对象模型,相当于OFFICE对象中的APPLICATION。获取到Document之后,无论是修改网页,读取还是写入网页,还是触发事件,一切都好说,每一个URL对应一个Documnet(这就是如果某一个Navigate to的成功导航那个URL是完整的,所以需要先判断IE对象READSTATE才能判断该URL对应的Document是否打开)
  2) 在Documnet下可以获得documentElement和body这两个节点。
  您可以使用以下语句:
  set xbody=doc.Body '获取正文对象
  set xDoc=doc.documentElement '获取根节点
  前面说过,body相当于被标记的对象,根节点相当于网页中被标记的元素对象。在 MHTML 类型库定义中,它们都属于 HTMLHtmlElement 类型的对象。我将这种类型的对象称为“节点”,但请注意,文档对象不是节点对象,它是 HTMLDocument 类型。根节点和正文节点的区别在于,根节点包括整个网页。在 HTML 的文档对象模型中,这种类型的对象有几个属性来获取内容:
  object.innerHtml '对象内的 HTML 文本
  Object.OuterHtml '对象中的 HTML 文本,包括对象本身的 HTML 标记
  Object.innerText '对象内部的TEXT,不包括HTML标签
  Object.OuterText '同上,包括对象本身的文本
  所以,如果我们想抓取某个网站的所有HTML内容,代码可以这样写:
  设置 doc=ie.Document
  set xDoc=doc.documentElement '获取根节点
  strX=xDoc.OuterHtml '获取所有HTML内容
  3) 每个标签节点对象下,都有一个名为 ChildNodes 的集合,其中收录“该节点下的标签”,就像一个文件目录,根目录下的一个子目录。
  我们可以看到:HTML标签是文档的根节点,是Document的Childnodes集合的成员(Document不是节点,它是另一种类型的对象,上层文档,但它可以有下层节点集合,就像一个磁盘可以有一个从属目录,但它本身不是一个目录),BODY是根节点的ChildNodes集合的成员,DIV和P节点是ChildNodes集合的两个成员BODY,也有自己的 Childnoes 系列。
  我们要注意:在文档对象模型中,集合不同于OFFICE的集合。集合从 0 开始计数,count 属性是 Length 而不是 Count。
  4)除了 ChildNodes 集合之外,Web 文档对象中最常见的集合是 All 集合,这是“最混乱”的集合。各级文档和节点都有这个集合。集合,顾名思义,是非分层的,但使用起来也很方便:
  设置 doc=ie.Document
  Set xCols=doc.All '获取文档中的所有节点集
  Set xbCols=doc.body.All '获取body节点下的所有节点集
  尽管任何标记的节点都有一个 ALL 集合,但我们仍然喜欢使用 DOCUMENT 的 ALL,没有其他原因。文档最大,一锅ALL最适合找。所有查找都是有条件的:如果标签没有 ID,则无法查找其名称。
  但是,ALL 集合有一个非常方便的特性:可以将 ID 附加到 ALL 集合:
  strX=doc.All.mytag.innerhtml
  5)要获取文档对象的getElementsByName集合,可以使用以下方法:
  set mydivs=doc.getElementsByName("div") '获取所有DIV标签,注意采集
  6) 文档对象的FORMS集合,因为大部分网页数据提交都是通过FORM标签提交的:
  Set myForms=doc.Forms '获取所有FORM标签
  设置 frmX=myForms.item(0) '第一个 FORM
  FORM标签节点所代表的对象是很多朋友关心的内容——在网页对象中,它可以向服务器发送数据,使服务器刷新网页(实际上服务器按照一个一定的格式协议),我们可以向网页发送数据。FORM被视为远程函数调用接口。FORM标签中ACTION指向的URL地址就是函数入口,FORM标签中的每个INPUT标签节点都是函数的参数。发出 FORM.Submit 方法时,将远程调用该函数。现在,在服务器端,比如ASP,PHP就是老老实实的找FORM的参数,不管你用GET还是POST:
  frmX.submit '相当于用户在页面按下FORM的发送按钮
  上面我列出了获取网页数据的一般方法,使用上没有特殊要求。您可以根据自己的习惯使用它们。本题后面的内容就是灵活运用这些知识点解决实际问题。
  
  回到本节的知识点:
  如何提交表格?如何下载图片的地址?如何获取表的数据?
  
  块编程思想的内涵:
  在我的系列书中,我一直在强调“积木”的编程思想,这也是学习使用VBA的主要方法,尤其是对于专业人士来说,采用这种方案是很有必要的。其主要内涵:
  1 不要自己输入所有代码。你要做的就是把块放在正确的地方,然后修复代码,一定要复制它,从你的构建块库中复制它,然后修复代码并利用时间来有效地思考。
  2 建立自己的“块库”。平时在学习的过程中,把自己觉得有用的代码放在一起,多积累,随时用。您在构建块库中拥有的信息越多,您的编程思想就会越广泛。
  
  VBA的应用定义
  VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对 VBA 的应用程序定义。在取代OFFICE的新办公软件出现之前,谁能在数据处理上做到极致,谁就是王者。技巧的巅峰莫过于VBA!
  记得20年前第一次学VBA的时候,当时资料很少,只能看源码搞清楚,真的很难。20年过去了,为了不让学VBA的朋友重复我之前的经历,我结合自己多年的VBA实践经验,推出了六篇VBA专题教程:
  第一组:VBA代码解法是对VBA中各个知识点的讲解。总共147课,涵盖了初学者必备的大部分VBA知识点;
  第二套:VBA数据库解决方案 数据库是专业的数据处理工具。教程中详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作,适合中级学习。
  第三套:VBA数组和字典解决方案数组和字典是VBA的精髓,字典是提高VBA代码水平的有效手段,值得深入研究,是初级和中级人员学习的一种手段改进代码。
  第四套:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。这套教程是第一套教程的视频讲解,听元音比较容易。
  第五套:VBA中类的解释与利用这是一门进阶课程,讲解类的虚无和肉身的程度。虽然类的使用较少,但认真学习可以促进自身VBA理论的提高。对这套课程的领悟,主要是读者的领悟,对一种佛教哲学的领悟。
  第六套教程:《VBA信息获取与处理》,这是一个高级教程,涵盖范围更广,实用性更强,面向中高级人员。教程共有20个主题,包括:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO的使用对象,获取工作表和文件夹信息,获取图形信息,自定义工作表信息等功能。
  您可以按照1→3→2→6→5或4→3→2→6→5的顺序根据以上信息逐步深入学习。教程提供讲解并提供大量积木,如有需要可以微信:NZ9668
  
  学习VBA是一个过程,也需要体验一下枯燥的感觉
  如太白诗云:百鸟高飞,孤云独闲。相见不厌,唯有敬亭山。学习的过程也是修心的过程,修心平和。在码字的世界里,心静,心情好,身体自然就好。当心平静时,它是正义的。心中没有那么多的邪见邪见,也没有那么多的妄想。利益他人就是利益自己。这些教程也是为了帮助你起航,帮助我。我上面的教程是我经验的传递。
  “水无争,万物皆好。” 学习也是如此,知道自己需要什么,不蜷缩在世界的一小块认为自己是天堂的地方,以及自欺欺人的言论直到年老。努力提高自己,以充满活力的精神把握现在,这就是进步。越有意义的事情,就越难。意愿决定一切,智慧决定成败。无论遇到什么,都是风景。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。感受真实的时间,静下心来,多了解,积福报。与其天天闹着玩,不如天天过日子。在杀鸡更严重的后疫情世界,储备知识,尤其是新知识,为自己生存。学习时是渺小而无声的,使用时是巨大而汹涌的。
  每一次收获都是成长的记录。怎么可能没有证据?正是这种执着,让晨曦绽放出灿烂的光芒。最后,给致力于VBA学习的朋友一句话,让大家感受一下枯燥而执着的学习过程:
  乌云掠过,暗语无声,
  只有微风,惊动了梦中的莺。
  看星星,疏散北斗七星,
  钦奈将与过去的鹅一起去。
  陌生人,昏暗的灯光,
  忍着长亭。
  多少VBA人,
  在漆黑的夜里,静静地寻找梦想,期待黎明。
  多么不合理!
  回到学习和使用VBA的经历,很感慨。我想用这些话与大家分享我多年实际工作经验的成果。我想把这些有用的东西分享给真正需要使用 VBA 的旅友。 查看全部

  vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)
  《VBA信息获取与处理》教程第八题“VBA与HTML文档”第七节“HTML DOM的对象事件与关联”太无聊了。希望想掌握这方面知识的朋友可以参考我的教程。. 今天我们开始学习“使用IE捕获网络数据”的第九个话题。
  在我们的网页抓取部分,在讲解了XMLHTTP方法之后,我们利用两个题目的进度,讲解了一些与VBA不太相关的网络知识。这两个话题对于我们重新认识网络抓取数据具有重要意义。,虽然我的解释不能包罗万象,但是对于我经常提倡的VBA定位来说已经足够了。此外,学习是一个不断积累和进步的过程。你需要掌握的是一些基本的理论,然后把它们应用到自己身上。在实践中,这是关键。从这个话题开始,我们继续我们对网络爬虫的研究。本主题是使用IE爬取网络数据。其实就是使用控件来完成我们的工作。
  第一部分使用IE方法提取网页数据的基础
  为了获取网页的数据,我们可以创建IE控件或者webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
  该方法可以模拟大多数浏览器操作。浏览器能看到的数据可以通过代码获取,但是有个致命的缺点:除了烦人的弹窗,兼容性确实是个很烦人的问题。在我自己的实践中,感觉这种方法不是很稳定(只是感觉)。
  1 IE模型的创建
  我们在实际工作中遇到网站和网页相关的问题,比如:如何下载网页数据?网页之间的通信是如何实现的,是否可以控制等等。如果你是用VB/VBA/脚本或者其他支持自动化对象(AUTOMATION)的语言编程,一个值得知道的方法是掌握对象模型:把网页当作对象来控制,这个方法需要了解自动化对象IE (InternetExplorer.Application) 或 IE 控件 (Microsoft Internet Controls) 以及标准的文档对象模型 (Document)。前两个题目我已经讲解了很多相关知识,这里就不详细讲解了。
  我给出以下代码:
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate "about:blank" '创建一个空白页面
  以上几行代码的作用是创建一个IE应用对象,打开一个空白网页。这个网页独立于VBA应用程序(WORD或EXCEL),其实你得自己关闭,或者使用ie.Quit命令退出——注意,简单关闭VBA或者SET ie=nothing不会退出这个页面. 我们经常使用的是把第 3 行的字符串替换成 网站 的名字,或者你主机中的文档名,或者图片名,这样都可以。它与通过在 IE 地址栏中键入名称来浏览这些文档具有相同的效果。
  如果只是创建一个空模型没有任何使用价值,我们需要一个真实的网页,那么我们需要在VBA应用程序之外打开一个完整的网页,直到网页完全加载。下面继续。
  2 IE网页加载
  让我们修复上面打开一个空网页的代码:
  子 mynz()
  Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
  ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
  ie.navigate " " '创建一个空白页面
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  结束子
  在上面的代码中添加了几行:
  Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
  DoEvents '在循环中将工作权限返回给系统,避免“软崩溃”
  环形
  这几行代码可以保证网页的加载完成,根据ie.ReadyState的返回值来判断。
  readyState 中有 5 个状态:
  状态含义描述
  0 未初始化对象已创建,但尚未初始化(尚未调用open方法)
  1 初始化对象已经建立,send方法还没有被调用
  2 发送数据的send()方法已经调用,但当前状态和http头未知
  3 数据传输中已经收到了一些数据,由于response和http header不完整,那么通过responseBody和responseText获取一些数据时会报错
  4 收到数据后,可以通过responseBody和responseText获取完整的响应数据
  通过上面的分析可以看出,只有当.ReadyState = 4时,网页的数据才是有效数据。
  3 获取IE页面数据
  当网页加载完毕后,剩下的工作就是从网页中抓取数据。数据抓取主要是利用控件对象的属性和方法。
  1)使用Set doc = ie.Document 获取网页的文档对象
  从表示网页内容的文档对象(Document)扩展而来的对象模型与之前的IE应用程序不是一个系统。
  Documnet(文档)是一个文档对象模型,相当于OFFICE对象中的APPLICATION。获取到Document之后,无论是修改网页,读取还是写入网页,还是触发事件,一切都好说,每一个URL对应一个Documnet(这就是如果某一个Navigate to的成功导航那个URL是完整的,所以需要先判断IE对象READSTATE才能判断该URL对应的Document是否打开)
  2) 在Documnet下可以获得documentElement和body这两个节点。
  您可以使用以下语句:
  set xbody=doc.Body '获取正文对象
  set xDoc=doc.documentElement '获取根节点
  前面说过,body相当于被标记的对象,根节点相当于网页中被标记的元素对象。在 MHTML 类型库定义中,它们都属于 HTMLHtmlElement 类型的对象。我将这种类型的对象称为“节点”,但请注意,文档对象不是节点对象,它是 HTMLDocument 类型。根节点和正文节点的区别在于,根节点包括整个网页。在 HTML 的文档对象模型中,这种类型的对象有几个属性来获取内容:
  object.innerHtml '对象内的 HTML 文本
  Object.OuterHtml '对象中的 HTML 文本,包括对象本身的 HTML 标记
  Object.innerText '对象内部的TEXT,不包括HTML标签
  Object.OuterText '同上,包括对象本身的文本
  所以,如果我们想抓取某个网站的所有HTML内容,代码可以这样写:
  设置 doc=ie.Document
  set xDoc=doc.documentElement '获取根节点
  strX=xDoc.OuterHtml '获取所有HTML内容
  3) 每个标签节点对象下,都有一个名为 ChildNodes 的集合,其中收录“该节点下的标签”,就像一个文件目录,根目录下的一个子目录。
  我们可以看到:HTML标签是文档的根节点,是Document的Childnodes集合的成员(Document不是节点,它是另一种类型的对象,上层文档,但它可以有下层节点集合,就像一个磁盘可以有一个从属目录,但它本身不是一个目录),BODY是根节点的ChildNodes集合的成员,DIV和P节点是ChildNodes集合的两个成员BODY,也有自己的 Childnoes 系列。
  我们要注意:在文档对象模型中,集合不同于OFFICE的集合。集合从 0 开始计数,count 属性是 Length 而不是 Count。
  4)除了 ChildNodes 集合之外,Web 文档对象中最常见的集合是 All 集合,这是“最混乱”的集合。各级文档和节点都有这个集合。集合,顾名思义,是非分层的,但使用起来也很方便:
  设置 doc=ie.Document
  Set xCols=doc.All '获取文档中的所有节点集
  Set xbCols=doc.body.All '获取body节点下的所有节点集
  尽管任何标记的节点都有一个 ALL 集合,但我们仍然喜欢使用 DOCUMENT 的 ALL,没有其他原因。文档最大,一锅ALL最适合找。所有查找都是有条件的:如果标签没有 ID,则无法查找其名称。
  但是,ALL 集合有一个非常方便的特性:可以将 ID 附加到 ALL 集合:
  strX=doc.All.mytag.innerhtml
  5)要获取文档对象的getElementsByName集合,可以使用以下方法:
  set mydivs=doc.getElementsByName("div") '获取所有DIV标签,注意采集
  6) 文档对象的FORMS集合,因为大部分网页数据提交都是通过FORM标签提交的:
  Set myForms=doc.Forms '获取所有FORM标签
  设置 frmX=myForms.item(0) '第一个 FORM
  FORM标签节点所代表的对象是很多朋友关心的内容——在网页对象中,它可以向服务器发送数据,使服务器刷新网页(实际上服务器按照一个一定的格式协议),我们可以向网页发送数据。FORM被视为远程函数调用接口。FORM标签中ACTION指向的URL地址就是函数入口,FORM标签中的每个INPUT标签节点都是函数的参数。发出 FORM.Submit 方法时,将远程调用该函数。现在,在服务器端,比如ASP,PHP就是老老实实的找FORM的参数,不管你用GET还是POST:
  frmX.submit '相当于用户在页面按下FORM的发送按钮
  上面我列出了获取网页数据的一般方法,使用上没有特殊要求。您可以根据自己的习惯使用它们。本题后面的内容就是灵活运用这些知识点解决实际问题。
  
  回到本节的知识点:
  如何提交表格?如何下载图片的地址?如何获取表的数据?
  
  块编程思想的内涵:
  在我的系列书中,我一直在强调“积木”的编程思想,这也是学习使用VBA的主要方法,尤其是对于专业人士来说,采用这种方案是很有必要的。其主要内涵:
  1 不要自己输入所有代码。你要做的就是把块放在正确的地方,然后修复代码,一定要复制它,从你的构建块库中复制它,然后修复代码并利用时间来有效地思考。
  2 建立自己的“块库”。平时在学习的过程中,把自己觉得有用的代码放在一起,多积累,随时用。您在构建块库中拥有的信息越多,您的编程思想就会越广泛。
  
  VBA的应用定义
  VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对 VBA 的应用程序定义。在取代OFFICE的新办公软件出现之前,谁能在数据处理上做到极致,谁就是王者。技巧的巅峰莫过于VBA!
  记得20年前第一次学VBA的时候,当时资料很少,只能看源码搞清楚,真的很难。20年过去了,为了不让学VBA的朋友重复我之前的经历,我结合自己多年的VBA实践经验,推出了六篇VBA专题教程:
  第一组:VBA代码解法是对VBA中各个知识点的讲解。总共147课,涵盖了初学者必备的大部分VBA知识点;
  第二套:VBA数据库解决方案 数据库是专业的数据处理工具。教程中详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作,适合中级学习。
  第三套:VBA数组和字典解决方案数组和字典是VBA的精髓,字典是提高VBA代码水平的有效手段,值得深入研究,是初级和中级人员学习的一种手段改进代码。
  第四套:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。这套教程是第一套教程的视频讲解,听元音比较容易。
  第五套:VBA中类的解释与利用这是一门进阶课程,讲解类的虚无和肉身的程度。虽然类的使用较少,但认真学习可以促进自身VBA理论的提高。对这套课程的领悟,主要是读者的领悟,对一种佛教哲学的领悟。
  第六套教程:《VBA信息获取与处理》,这是一个高级教程,涵盖范围更广,实用性更强,面向中高级人员。教程共有20个主题,包括:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO的使用对象,获取工作表和文件夹信息,获取图形信息,自定义工作表信息等功能。
  您可以按照1→3→2→6→5或4→3→2→6→5的顺序根据以上信息逐步深入学习。教程提供讲解并提供大量积木,如有需要可以微信:NZ9668
  
  学习VBA是一个过程,也需要体验一下枯燥的感觉
  如太白诗云:百鸟高飞,孤云独闲。相见不厌,唯有敬亭山。学习的过程也是修心的过程,修心平和。在码字的世界里,心静,心情好,身体自然就好。当心平静时,它是正义的。心中没有那么多的邪见邪见,也没有那么多的妄想。利益他人就是利益自己。这些教程也是为了帮助你起航,帮助我。我上面的教程是我经验的传递。
  “水无争,万物皆好。” 学习也是如此,知道自己需要什么,不蜷缩在世界的一小块认为自己是天堂的地方,以及自欺欺人的言论直到年老。努力提高自己,以充满活力的精神把握现在,这就是进步。越有意义的事情,就越难。意愿决定一切,智慧决定成败。无论遇到什么,都是风景。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。感受真实的时间,静下心来,多了解,积福报。与其天天闹着玩,不如天天过日子。在杀鸡更严重的后疫情世界,储备知识,尤其是新知识,为自己生存。学习时是渺小而无声的,使用时是巨大而汹涌的。
  每一次收获都是成长的记录。怎么可能没有证据?正是这种执着,让晨曦绽放出灿烂的光芒。最后,给致力于VBA学习的朋友一句话,让大家感受一下枯燥而执着的学习过程:
  乌云掠过,暗语无声,
  只有微风,惊动了梦中的莺。
  看星星,疏散北斗七星,
  钦奈将与过去的鹅一起去。
  陌生人,昏暗的灯光,
  忍着长亭。
  多少VBA人,
  在漆黑的夜里,静静地寻找梦想,期待黎明。
  多么不合理!
  回到学习和使用VBA的经历,很感慨。我想用这些话与大家分享我多年实际工作经验的成果。我想把这些有用的东西分享给真正需要使用 VBA 的旅友。

vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)

网站优化优采云 发表了文章 • 0 个评论 • 96 次浏览 • 2022-01-30 01:16 • 来自相关话题

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索中的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 'row
For j = 0 To tb(H).Cells.Length - 1 'cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
'发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。如果要使用多段内容,只能将内容提取出来,然后进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。 查看全部

  vba xmlhttp 抓取网页(excel爬取网页的2种实现方式做一个全方位和细节解释)
  我从没想过VBA也可以抓取网页。老实说,我也不知道。今天,我将根据搜索中的一些资料和探索,对VBA爬取网页的两种实现方式进行全面详细的讲解。还有认知,我觉得就够了,因为Python在爬取网页方面比VBA好,甚至是其他编程语言,所以如果真的要爬取网页,就应该用Python。
  第一种方法使用Webbrowser控件
  相当于在Office中打开一个可见的IE。优点是实现简单,易于调试,整个爬取过程直观直观,轻松解决动态网页、跨域登录等疑难问题。使用excel爬取网页内容非常简单。缺点是不灵活,有些网页不能处理。同时,如果内容很多,速度会很慢。最大的缺点是需要IE浏览器。
  
  首先在excel中新建一个Active X控件,然后根据该控件编写VBA代码。
  Private Sub CommandButton1_Click()
Dim tb, H%, j%

On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop

Set tb = .document.All.tags("table")(0).Rows

For H = 0 To tb.Length - 1 'row
For j = 0 To tb(H).Cells.Length - 1 'cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
  说明"set tb = .document.All.tags("table")(0).Rows",获取所有表格元素,括号中的0代表数组的第0个元素,后面的内容其实是一对数组元素的处理。
  第二种方式是使用 XMLhttp 对象
  优点是快速灵活,可以实现GET、POST、Header、Cookie等很多细节。缺点是比Webbrowser麻烦一点,调试不直观。
  
  查看网页源代码,抓取以下文字
  
  Sub 抓取当天天气()
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
'发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-t ... ot%3B, False
xmlHttp.send
'等待响应
Do While xmlHttp.ReadyState 4
DoEvents
Loop
'得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
  重点讲解split的用法,weather = Split(Split(Myhtml, "")(1), "
  ")(0)
  VBA中的拆分用法如下:
  描述
  返回一个从零开始的一维数组,其中收录指定数量的子字符串
  语法
  拆分(表达式[,分隔符[,限制[,比较]]])
  参数说明
  在这段代码段的使用中,经过验证,目前只能实现两个拆分应用,只能提取两个区间字符串的内容。如果要使用多段内容,只能将内容提取出来,然后进行字符串组合的方式。
  总结
  对于VBA爬取网页,建议朋友只懂,不需要浪费太多时间去学习,真心觉得用处不大。

vba xmlhttp 抓取网页(:-日报第2期)

网站优化优采云 发表了文章 • 0 个评论 • 98 次浏览 • 2022-01-22 22:10 • 来自相关话题

  vba xmlhttp 抓取网页(:-日报第2期)
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '网址读取
  使用 CreateObject("InternetExplorer.Application") '调用互联网
  .可见=真
  .navigate preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  dmt.all.tags("select")(10).Value = "山东"
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 1) = t
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  -------------------------------------------------- -------------------------------------------------- --------分割线---------------------------------------- -------------------------------------------------- ---------- 我的目标:将2008-2012年山东各学校和专业B栏(最低分、最高分、平均分)的招生情况记录到各自的工作表中去。
  工作经历和想法:
  首先我去指定的网站()看看。查询该校各专业的招生情况,需要经过条件搜索,点击三下链接,才能到达最终结果页面,(... t_2012_shandong .htm)。我分析了这个结果页面,发现schoolpoint之后的参数都可以修改得到对应的结果。我现在需要找到的是参数/539/,它是来自学校对这个网站 ID 编码的。
  然后,我回过头去看了一路跳过的网页的源代码。在第一次搜索的结果网页中,有一个“A”,其NameProp值为school539.htm,其对应的文字正是搜索结果中的学校名称。也就是说,如果我找到这个NameProp,我就可以得到学校的id。
  接下来,我去初始页面()寻找进入搜索结果页面的方法。
  第一阶段,通过合成 urL? 输入字段后,但是输入后,搜索框是乱码,结果是默认的“北大”,无法合成。
  第二阶段,尝试搜索后,发现重定向结果页的UrL不是明码。我尝试将搜索字段转码为UTF-8并再次合成搜索结果页面的URL,但还是不行。仔细对比后发现,系统的地址和我上一段合成的一模一样,只是最后多了一个“&amp;x=3&amp;y=22”之类的字段。在同一个搜索字段中反复试验,发现x和y都是随机的。是的,我猜是防盗链(其实我也不知道防盗链是什么)。因为无法获取正确的地址,所以决定放弃XmlHttp,改用IE。
  第三阶段,IE尝试进入搜索结果页正常,但是结果页完成后,读取新页面的目标数据,发现上一页的值还是上一页的值. 方法清除缓存,但结果还是不行,还是上一页的值。所以很郁闷,卡在这里。
  以下是添加清除缓存功能后的代码,因为DeleteUrlCacheEntry功能不是很懂,请大家指导。
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '读
  使用 CreateObject("internetExplorer.Application")
  .可见=真
  .导航 preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  s = dmt.all.tags("a")(129)
  dmt.all.tags("select")(10).Value = eprovince
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  DeleteUrlCacheEntry dmt.all '清除缓存
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 2) = t
  ThisWorkbook.Sheets(2).Cells(1, 1) = s
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  
  此帖已经同步到谁道天涯-江波的微博 查看全部

  vba xmlhttp 抓取网页(:-日报第2期)
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '网址读取
  使用 CreateObject("InternetExplorer.Application") '调用互联网
  .可见=真
  .navigate preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  dmt.all.tags("select")(10).Value = "山东"
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 1) = t
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  -------------------------------------------------- -------------------------------------------------- --------分割线---------------------------------------- -------------------------------------------------- ---------- 我的目标:将2008-2012年山东各学校和专业B栏(最低分、最高分、平均分)的招生情况记录到各自的工作表中去。
  工作经历和想法:
  首先我去指定的网站()看看。查询该校各专业的招生情况,需要经过条件搜索,点击三下链接,才能到达最终结果页面,(... t_2012_shandong .htm)。我分析了这个结果页面,发现schoolpoint之后的参数都可以修改得到对应的结果。我现在需要找到的是参数/539/,它是来自学校对这个网站 ID 编码的。
  然后,我回过头去看了一路跳过的网页的源代码。在第一次搜索的结果网页中,有一个“A”,其NameProp值为school539.htm,其对应的文字正是搜索结果中的学校名称。也就是说,如果我找到这个NameProp,我就可以得到学校的id。
  接下来,我去初始页面()寻找进入搜索结果页面的方法。
  第一阶段,通过合成 urL? 输入字段后,但是输入后,搜索框是乱码,结果是默认的“北大”,无法合成。
  第二阶段,尝试搜索后,发现重定向结果页的UrL不是明码。我尝试将搜索字段转码为UTF-8并再次合成搜索结果页面的URL,但还是不行。仔细对比后发现,系统的地址和我上一段合成的一模一样,只是最后多了一个“&amp;x=3&amp;y=22”之类的字段。在同一个搜索字段中反复试验,发现x和y都是随机的。是的,我猜是防盗链(其实我也不知道防盗链是什么)。因为无法获取正确的地址,所以决定放弃XmlHttp,改用IE。
  第三阶段,IE尝试进入搜索结果页正常,但是结果页完成后,读取新页面的目标数据,发现上一页的值还是上一页的值. 方法清除缓存,但结果还是不行,还是上一页的值。所以很郁闷,卡在这里。
  以下是添加清除缓存功能后的代码,因为DeleteUrlCacheEntry功能不是很懂,请大家指导。
  子测试()
  暗淡 strRespText$、school$、province&amp;、preUrl$
  昏暗的网址
  school = ThisWorkbook.Sheets(1).Cells(2, 2) '读学校名
  eprovince = ThisWorkbook.Sheets(1).Cells(2, 3) '省读
  preUrl = ThisWorkbook.Sheets(1).Cells(2, 4) '读
  使用 CreateObject("internetExplorer.Application")
  .可见=真
  .导航 preUrl
  直到 .readystate = 4
  做事件
  环形
  设置 dmt = .document
  s = dmt.all.tags("a")(129)
  dmt.all.tags("select")(10).Value = eprovince
  dmt.all.tags("输入")(8).Value = 学校
  dmt.all.tags("输入")(9).Click
  DeleteUrlCacheEntry dmt.all '清除缓存
  直到 .readystate = 4
  做事件
  环形
  t = dmt.all.tags("a")(129)
  ThisWorkbook.Sheets(2).Cells(1, 2) = t
  ThisWorkbook.Sheets(2).Cells(1, 1) = s
  结束于
  with CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '得到的字符串放入剪贴板,记事本观察数据
  .SetText tt '数据正常显示,可以提取
  .PutInClipboard
  结束于
  结束子
  
  此帖已经同步到谁道天涯-江波的微博

vba xmlhttp 抓取网页(【分享成果,随喜正能量】《VBA之Word应用》)

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-01-03 23:05 • 来自相关话题

  vba xmlhttp 抓取网页(【分享成果,随喜正能量】《VBA之Word应用》)
  【分享成果,正能量庆生】生活不能靠心情,而是靠心态。感觉像六月的天气,多云变幻莫测。如果一个人的生活取决于他的心情,他一定是善变的。他的人生将像断了线的风筝,随风摇曳,无法自拔。生活中的强者会及时调整心态,让心情始终保持积极向上,充满阳光。受情绪影响的人常迷茫,控制心态的人常快乐。
  “VBA Word 应用程序”是我的第八套教程。本教程专门讲解VBA在Word中的应用。它侧重于“面向对象编程”。首先让大家了解VBA在Word中的对象,以及该对象的Properties、方法,然后通过实例让大家感受一下Word VBA的美。本套教程共三卷十六章。今天的内容是第三章“文档集合的文档对象和文档对象”,第三节:打开文档,将文档赋值给变量。
  
  第 3 节 打开文档并将文档赋值给变量
  在上一节中,我们解释了使用 Documents 的 Open 方法打开指定文档的方法。在这个方法中,我们使用的语句是 Documents.Open myFile。这种方法是直接打开一个文档,但是,打开文档进行操作,在后续的文档操作中,我们需要捕获打开文档的对象,然后完成后续的操作。
  VBA是面向对象的编程,所有的操作也是面向对象的操作,所以我们可以在打开文档后直接将文档赋值给一个变量,以利用后续的操作。
  1 打开文档并将文档赋值给变量的思路解析
  在《VBA Excel 应用程序》中,我们谈到了变量的赋值。一般情况下,赋值直接使用“a variable=value”,但是给对象变量赋值时,需要使用Set语句。这里我们可以使用 Set 语句给文档对象变量赋值。在赋值的同时,我们可以用Documents.Open myFile同时打开指定的文件。
  赋值后,我们可以通过变量与文档进行交互。这个操作的代码很简单,给后面的操作留了足够的接口来使用我们后续的文档操作。让我们可以随时轻松参考文档。
  2 打开文档,给变量赋值
  我们来看下面的代码。此代码将打开指定的文件并在打开的文档中写入一些文本。我们先看代码:
  子 mynzB()
  将 myFile 淡化为字符串
  将 myDoc 淡化为文档
  myFile = ThisDocument.Path & "\" & "Example 03.docx"
  If Dir(myFile) "" Then
  设置 myDoc = Documents.Open(myFile)
  其他
  MsgBox myFile & "不存在!":END
  如果结束
  myDoc.Range(0, 0).Text = ""VBA Word 应用程序""
  ActiveDocument.Save
  '文档(myDoc).保存
  'ActiveDocument.Close wdSaveChanges
  'Documents(myDoc).Close wdSaveChanges
  ActiveDocument.Close wdDoNotSaveChanges
  'Documents(myDoc).Close wdDoNotSaveChanges
  结束子
  代码截图:
  
  3 代码的解释和操作
  我们来看看代码的解释:
  1)Dim myFile As String 这行代码将定义一个变量作为文件名
  2)Dim myDoc As Document 这行代码将定义一个文档对象变量
  3)myFile = ThisDocument.Path & "\" & "Example 03.docx" 这行代码给文件名变量赋值
  4)If Dir(myFile) "" 那么这行代码判断文件是否存在
  5) Set myDoc = Documents.Open(myFile) 打开一个文件并将这个文件赋值给对象变量。大家应该注意,这行代码有两个意思,一是打开变量myFile代表的文件,二是把这个文件赋值给变量myDoc。写的简单明了,同时在后面的代码中,我们可以使用这个变量,可以直接使用myDoc变量进行相关操作。如果不使用这个变量处理,那么我们需要进行ActiveDocument等代码处理。
  6) MsgBox myFile & "does not exist!": 这行代码的意思是如果文件不存在,会提示用户并终止代码运行
  7) myDoc.Range(0, 0).Text = ""VBA Word Application"" 这行代码的意思是在开头写""VBA Word Application"文档“
  8) ActiveDocument.Save 这行代码的意思就是保存活动文档
  9)'Documents(myDoc).Save这行代码的意思是关闭名为myDoc的变量所代表的文件
  10)'ActiveDocument.Close wdSaveChanges 这行代码的意思就是关闭当前活动的文档并保存。
  11)'Documents(myDoc).Close wdSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档并保存。
  12) ActiveDocument.Close wdDoNotSaveChanges 这行代码的意思就是关闭当前活动的文档,不保存。
  13)'Documents(myDoc).Close wdDoNotSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档,不保存。
  最后看一下代码的运行状态:文档开头已经添加了“VBA Word Application”的字符串:
  
  今日内容转帖:
  1 如何使用文档变量来存储打开的文档?
  2 本讲讲解的方案和上一节的方案有什么区别?
  3 你理解本课最后一部分给出的句子吗?
  
  本讲内容参考程序文件:Doc 003 document.docm
  ① 7→1→3→2→6→5 或 7→4→3→2→6→5 ② 7→8 查看全部

  vba xmlhttp 抓取网页(【分享成果,随喜正能量】《VBA之Word应用》)
  【分享成果,正能量庆生】生活不能靠心情,而是靠心态。感觉像六月的天气,多云变幻莫测。如果一个人的生活取决于他的心情,他一定是善变的。他的人生将像断了线的风筝,随风摇曳,无法自拔。生活中的强者会及时调整心态,让心情始终保持积极向上,充满阳光。受情绪影响的人常迷茫,控制心态的人常快乐。
  “VBA Word 应用程序”是我的第八套教程。本教程专门讲解VBA在Word中的应用。它侧重于“面向对象编程”。首先让大家了解VBA在Word中的对象,以及该对象的Properties、方法,然后通过实例让大家感受一下Word VBA的美。本套教程共三卷十六章。今天的内容是第三章“文档集合的文档对象和文档对象”,第三节:打开文档,将文档赋值给变量。
  
  第 3 节 打开文档并将文档赋值给变量
  在上一节中,我们解释了使用 Documents 的 Open 方法打开指定文档的方法。在这个方法中,我们使用的语句是 Documents.Open myFile。这种方法是直接打开一个文档,但是,打开文档进行操作,在后续的文档操作中,我们需要捕获打开文档的对象,然后完成后续的操作。
  VBA是面向对象的编程,所有的操作也是面向对象的操作,所以我们可以在打开文档后直接将文档赋值给一个变量,以利用后续的操作。
  1 打开文档并将文档赋值给变量的思路解析
  在《VBA Excel 应用程序》中,我们谈到了变量的赋值。一般情况下,赋值直接使用“a variable=value”,但是给对象变量赋值时,需要使用Set语句。这里我们可以使用 Set 语句给文档对象变量赋值。在赋值的同时,我们可以用Documents.Open myFile同时打开指定的文件。
  赋值后,我们可以通过变量与文档进行交互。这个操作的代码很简单,给后面的操作留了足够的接口来使用我们后续的文档操作。让我们可以随时轻松参考文档。
  2 打开文档,给变量赋值
  我们来看下面的代码。此代码将打开指定的文件并在打开的文档中写入一些文本。我们先看代码:
  子 mynzB()
  将 myFile 淡化为字符串
  将 myDoc 淡化为文档
  myFile = ThisDocument.Path & "\" & "Example 03.docx"
  If Dir(myFile) "" Then
  设置 myDoc = Documents.Open(myFile)
  其他
  MsgBox myFile & "不存在!":END
  如果结束
  myDoc.Range(0, 0).Text = ""VBA Word 应用程序""
  ActiveDocument.Save
  '文档(myDoc).保存
  'ActiveDocument.Close wdSaveChanges
  'Documents(myDoc).Close wdSaveChanges
  ActiveDocument.Close wdDoNotSaveChanges
  'Documents(myDoc).Close wdDoNotSaveChanges
  结束子
  代码截图:
  
  3 代码的解释和操作
  我们来看看代码的解释:
  1)Dim myFile As String 这行代码将定义一个变量作为文件名
  2)Dim myDoc As Document 这行代码将定义一个文档对象变量
  3)myFile = ThisDocument.Path & "\" & "Example 03.docx" 这行代码给文件名变量赋值
  4)If Dir(myFile) "" 那么这行代码判断文件是否存在
  5) Set myDoc = Documents.Open(myFile) 打开一个文件并将这个文件赋值给对象变量。大家应该注意,这行代码有两个意思,一是打开变量myFile代表的文件,二是把这个文件赋值给变量myDoc。写的简单明了,同时在后面的代码中,我们可以使用这个变量,可以直接使用myDoc变量进行相关操作。如果不使用这个变量处理,那么我们需要进行ActiveDocument等代码处理。
  6) MsgBox myFile & "does not exist!": 这行代码的意思是如果文件不存在,会提示用户并终止代码运行
  7) myDoc.Range(0, 0).Text = ""VBA Word Application"" 这行代码的意思是在开头写""VBA Word Application"文档“
  8) ActiveDocument.Save 这行代码的意思就是保存活动文档
  9)'Documents(myDoc).Save这行代码的意思是关闭名为myDoc的变量所代表的文件
  10)'ActiveDocument.Close wdSaveChanges 这行代码的意思就是关闭当前活动的文档并保存。
  11)'Documents(myDoc).Close wdSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档并保存。
  12) ActiveDocument.Close wdDoNotSaveChanges 这行代码的意思就是关闭当前活动的文档,不保存。
  13)'Documents(myDoc).Close wdDoNotSaveChanges 这行代码的意思就是关闭myDoc变量所代表的文档,不保存。
  最后看一下代码的运行状态:文档开头已经添加了“VBA Word Application”的字符串:
  
  今日内容转帖:
  1 如何使用文档变量来存储打开的文档?
  2 本讲讲解的方案和上一节的方案有什么区别?
  3 你理解本课最后一部分给出的句子吗?
  
  本讲内容参考程序文件:Doc 003 document.docm
  ① 7→1→3→2→6→5 或 7→4→3→2→6→5 ② 7→8

vba xmlhttp 抓取网页(我想从单个网站页面(带有XMLHTTP请求)中抓取一个)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-12-26 07:12 • 来自相关话题

  vba xmlhttp 抓取网页(我想从单个网站页面(带有XMLHTTP请求)中抓取一个)
  我想从单个网站页面(使用 XML HTTP 请求)抓取网站(以提取产品价格)。但在运行此脚本之前,我需要首先选择正确的商店(存储在浏览器 cookie 变量中,或者如果可能,以任何其他方式/请求包括在内),因为价格因商店而异。
  我已经创建了一个有效的代码,但是需要很长时间才能运行,所以我认为必须有一种更快更干净的方法:)。我还需要收录
应用程序以等待网站执行这些步骤。
  我当前的 VBA 代码:
  选择正确的存储(并将其保存在浏览器 cookie 中)
   Sub SetStore()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLSearchbox As MSHTML.IHTMLElement
Dim HTMLSearchboxes As MSHTML.IHTMLElementCollection
Dim HTMLButton As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection
Dim HTMLSearchButton As MSHTML.IHTMLElement
Dim HTMLSearchButtons As MSHTML.IHTMLElementCollection
Dim HTMLStoreID As MSHTML.IHTMLElement
Dim HTMLStoreIDs As MSHTML.IHTMLElementCollection
Dim HTMLSaveStore As MSHTML.IHTMLElement
Dim HTMLSaveStores As MSHTML.IHTMLElementCollection
'set on False to hide IE screen
IE.Visible = True
'navigate to url with limited content
IE.navigate "https://www.jumbo.com/content/ ... ot%3B
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLButton In HTMLButtons
If HTMLButton.getAttribute("data-jum-action") = "openHomeStoreFinder" Then
HTMLButton.Click
Exit For
End If
Next HTMLButton
Application.Wait Now + #12:00:02 AM#
Set HTMLSearchboxes = HTMLDoc.getElementsByTagName("input")
For Each HTMLSearchbox In HTMLSearchboxes
If HTMLSearchbox.getAttribute("id") = "searchTerm__DkKYx4XylsAAAFJktpb2Guy" Then
'input field store name/location to show search results
HTMLSearchbox.Value = "Oosterhout"
Application.Wait Now + #12:00:03 AM#
HTMLSearchbox.Click
Exit For
End If
Next HTMLSearchbox
Set HTMLSearchButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLSearchButton In HTMLSearchButtons
If HTMLSearchButton.getAttribute("data-jum-filter") = "search" Then
HTMLSearchButton.Click
Exit For
End If
Next HTMLSearchButton
Application.Wait Now + #12:00:05 AM#
Set HTMLStoreIDs = HTMLDoc.getElementsByTagName("li")
For Each HTMLStoreID In HTMLStoreIDs
'oosterhout = YC8KYx4XB88AAAFIDcIYwKxJ
'nieuwegein = 84IKYx4XziUAAAFInSYYwKrH
'vaassen = JYYKYx4XC1oAAAFItvcYwKxJ
'brielle = OG8KYx4XP4wAAAFIlsEYwKxK
If HTMLStoreID.getAttribute("data-jum-store-id") = "YC8KYx4XB88AAAFIDcIYwKxJ" Then
HTMLStoreID.Click
Application.Wait Now + #12:00:03 AM#
Exit For
End If
Next HTMLStoreID
Set HTMLSaveStores = HTMLDoc.getElementsByTagName("button")
For Each HTMLSaveStore In HTMLSaveStores
If HTMLSaveStore.getAttribute("data-jum-action") = "saveHomeStore" Then
HTMLSaveStore.Click
Exit For
End If
Next HTMLSaveStore
'IE.Quit
End Sub
  从产品页面中提取数据(IE HTTP请求,使用cookie存储值)
  Sub GetJumboPriceIE()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
IE.Visible = False
IE.navigate SKU_url
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
IE.Quit
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  上面的代码有效,但我希望使用以下 XML HTTP 请求代码(但使用正确的存储)。价格是 1,39。
  从产品页面提取数据(使用 XML HTTP 请求),但不使用 cookie 值
  Sub GetJumboPriceXML()
Dim XMLReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
XMLReq.Open "GET", SKU_url, False
XMLReq.send
If XMLReq.Status 200 Then
MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLReq.responseText
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  代码没有使用正确的商店并输出我不想要的价格(打印的价格是1.48)。
  综上所述:
  如果未选择商店(未设置 cookie),则以下 URL 现在的费用为 1.48 欧元。
  我希望 VB 脚本将商店设置为“Jumbo Oosterhout Nieuwe Bouwlingstraat”,然后在产品列表中抓取预定义的产品 URL 并提取价格(上面的 URL 是 €1,39)。
  然后将商店设置为另一个本地商店“Jumbo Brielle Thoelaverweg”并抓取相同的产品 URL 列表。上面的 URL 是 1.48 欧元。
  您可以通过单击页面右上角的位置图钉图标来选择其他商店。
  非常感谢您的帮助 查看全部

  vba xmlhttp 抓取网页(我想从单个网站页面(带有XMLHTTP请求)中抓取一个)
  我想从单个网站页面(使用 XML HTTP 请求)抓取网站(以提取产品价格)。但在运行此脚本之前,我需要首先选择正确的商店(存储在浏览器 cookie 变量中,或者如果可能,以任何其他方式/请求包括在内),因为价格因商店而异。
  我已经创建了一个有效的代码,但是需要很长时间才能运行,所以我认为必须有一种更快更干净的方法:)。我还需要收录
应用程序以等待网站执行这些步骤。
  我当前的 VBA 代码:
  选择正确的存储(并将其保存在浏览器 cookie 中)
   Sub SetStore()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLSearchbox As MSHTML.IHTMLElement
Dim HTMLSearchboxes As MSHTML.IHTMLElementCollection
Dim HTMLButton As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection
Dim HTMLSearchButton As MSHTML.IHTMLElement
Dim HTMLSearchButtons As MSHTML.IHTMLElementCollection
Dim HTMLStoreID As MSHTML.IHTMLElement
Dim HTMLStoreIDs As MSHTML.IHTMLElementCollection
Dim HTMLSaveStore As MSHTML.IHTMLElement
Dim HTMLSaveStores As MSHTML.IHTMLElementCollection
'set on False to hide IE screen
IE.Visible = True
'navigate to url with limited content
IE.navigate "https://www.jumbo.com/content/ ... ot%3B
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLButton In HTMLButtons
If HTMLButton.getAttribute("data-jum-action") = "openHomeStoreFinder" Then
HTMLButton.Click
Exit For
End If
Next HTMLButton
Application.Wait Now + #12:00:02 AM#
Set HTMLSearchboxes = HTMLDoc.getElementsByTagName("input")
For Each HTMLSearchbox In HTMLSearchboxes
If HTMLSearchbox.getAttribute("id") = "searchTerm__DkKYx4XylsAAAFJktpb2Guy" Then
'input field store name/location to show search results
HTMLSearchbox.Value = "Oosterhout"
Application.Wait Now + #12:00:03 AM#
HTMLSearchbox.Click
Exit For
End If
Next HTMLSearchbox
Set HTMLSearchButtons = HTMLDoc.getElementsByTagName("button")
For Each HTMLSearchButton In HTMLSearchButtons
If HTMLSearchButton.getAttribute("data-jum-filter") = "search" Then
HTMLSearchButton.Click
Exit For
End If
Next HTMLSearchButton
Application.Wait Now + #12:00:05 AM#
Set HTMLStoreIDs = HTMLDoc.getElementsByTagName("li")
For Each HTMLStoreID In HTMLStoreIDs
'oosterhout = YC8KYx4XB88AAAFIDcIYwKxJ
'nieuwegein = 84IKYx4XziUAAAFInSYYwKrH
'vaassen = JYYKYx4XC1oAAAFItvcYwKxJ
'brielle = OG8KYx4XP4wAAAFIlsEYwKxK
If HTMLStoreID.getAttribute("data-jum-store-id") = "YC8KYx4XB88AAAFIDcIYwKxJ" Then
HTMLStoreID.Click
Application.Wait Now + #12:00:03 AM#
Exit For
End If
Next HTMLStoreID
Set HTMLSaveStores = HTMLDoc.getElementsByTagName("button")
For Each HTMLSaveStore In HTMLSaveStores
If HTMLSaveStore.getAttribute("data-jum-action") = "saveHomeStore" Then
HTMLSaveStore.Click
Exit For
End If
Next HTMLSaveStore
'IE.Quit
End Sub
  从产品页面中提取数据(IE HTTP请求,使用cookie存储值)
  Sub GetJumboPriceIE()
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
IE.Visible = False
IE.navigate SKU_url
Do While IE.readyState READYSTATE_COMPLETE
Loop
Set HTMLDoc = IE.document
IE.Quit
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  上面的代码有效,但我希望使用以下 XML HTTP 请求代码(但使用正确的存储)。价格是 1,39。
  从产品页面提取数据(使用 XML HTTP 请求),但不使用 cookie 值
  Sub GetJumboPriceXML()
Dim XMLReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim JumInputs As MSHTML.IHTMLElementCollection
Dim JumInput As MSHTML.IHTMLElement
Dim JumPrice As MSHTML.IHTMLElement
Dim JumboPrice As Double
Dim Price_In_Cents_Tag As String
Dim SKU_tag As String, SKU_url As String
SKU_tag = "173140KST"
SKU_url = "https://www.jumbo.com/lu-basto ... ot%3B
XMLReq.Open "GET", SKU_url, False
XMLReq.send
If XMLReq.Status 200 Then
MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLReq.responseText
Set JumInputs = HTMLDoc.getElementsByTagName("input")
Price_In_Cents_Tag = "PriceInCents_" & SKU_tag
Set JumPrice = HTMLDoc.getElementById(Price_In_Cents_Tag)
JumboPrice = JumPrice.getAttribute("value") / 100
Debug.Print JumboPrice
End Sub
  代码没有使用正确的商店并输出我不想要的价格(打印的价格是1.48)。
  综上所述:
  如果未选择商店(未设置 cookie),则以下 URL 现在的费用为 1.48 欧元。
  我希望 VB 脚本将商店设置为“Jumbo Oosterhout Nieuwe Bouwlingstraat”,然后在产品列表中抓取预定义的产品 URL 并提取价格(上面的 URL 是 €1,39)。
  然后将商店设置为另一个本地商店“Jumbo Brielle Thoelaverweg”并抓取相同的产品 URL 列表。上面的 URL 是 1.48 欧元。
  您可以通过单击页面右上角的位置图钉图标来选择其他商店。
  非常感谢您的帮助

vba xmlhttp 抓取网页(Usage:ExampleUsage:用法示例:Example)

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-12-23 23:02 • 来自相关话题

  vba xmlhttp 抓取网页(Usage:ExampleUsage:用法示例:Example)
  如果有理由需要使用 VBA 执行此操作,也可以执行此操作,尽管需要以某种方式进行一些额外的工作。做一些额外的工作,但也可以做到。
  为了从任何站点加载 JSON 或 HTML,我使用此函数:为了从任何站点加载 JSON 或 HTML,我使用此函数:
  Public Function getHTTP(ByVal sReq As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", sReq, False
.Send
getHTTP = StrConv(.responseBody, vbUnicode)
End With
End Function
  示例用法:示例用法:
  由于我不确定您从何处获取 JSON 数据,这里有一个使用 Stack Exchange API 显示 Stack Overflow 站点状态的示例:由于我不确定从何处获取 JSON 数据,以下是示例使用 Stack Exchange API 显示 Stack Overflow 站点的状态:
  Sub GetSiteInfo()
Const url = "https://api.stackexchange.com/ ... ot%3B
Dim json As String
json = getHTTP(url) 'get JSON response
If InStr(json, """error_id""") > 0 Or json = "" Then 'check for error
MsgBox "There was a problem." & vbLf & vbLf & json, vbCritical
Exit Sub
End If
json = Mid(json, InStr(json, "[{""") + 3) 'tidy response with string functions
json = Left(json, InStr(json, "}],") - 1)
json = Replace(Replace(Replace(json, Chr(34), ""), ",", vbNewLine), "_", " ")
json = Replace(StrConv(Replace(json, ":", " :" & vbTab & vbTab _
& vbTab), vbProperCase), " Per ", "/")
MsgBox json, vbInformation, "Site Statistics" 'display response
End Sub
  注意如何使用基本的字符串函数来管理像这样的简单响应的提取。
  使用基本字符串函数提取值使用基本字符串函数提取值
  再举一个例子,使用问题顶部的 JSON 数据,如果字符串在一个名为 json 的变量中,并且您想提取 bestBuy 的值,一种方法(几种可能的方法)是这样的:再举一个例子,使用问题顶部的JSON数据,如果字符串在一个名为json的变量中,并且您想提取bestBuy的值,则一种方法(几种可能的方法)如下:
  Sub jsonExtract_Demo()
Const json = "aaaaaaa""bestBuy"": ""6.04"",." 'for demo
Dim pStart As Long, pStop As Long, bestBuy As Single
Dim prefix As String, suffix As String
prefix = "bestBuy"": """ 'equivalent to: "bestBuy": "
suffix = """" 'equivalent to a single "
pStart = InStr(json, prefix) + Len(prefix) 'find beginning of value
pStop = InStr(pStart, json, suffix) 'find end of value
bestBuy = CSng(Mid(json, pStart, pStop - pStart)) 'extract & convert value
MsgBox "The value for 'bestBuy` is : " & bestBuy, vbInformation
End Sub
  WEBSERVICE 工作表功能 WEBSERVICE 工作表功能
  我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,它适用于大多数纯文本响应(例如这个 JSON 示例):我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,适用于大多数纯文本响应(例如这个 JSON 示例):
  输入工作表单元格:输入工作表单元格:
  =WEBSERVICE("https://raw.githubusercontent. ... 6quot;)
  ...您将立即看到原创文本结果,准备好根据需要使用工作表函数进行操作...。在 XML 响应的情况下,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段,这对于基本的抓取需求非常方便。对于 XML 响应,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段。非常方便的基本抓取需求。
  以上链接中的更多信息。上面收录的链接中有更多信息。 查看全部

  vba xmlhttp 抓取网页(Usage:ExampleUsage:用法示例:Example)
  如果有理由需要使用 VBA 执行此操作,也可以执行此操作,尽管需要以某种方式进行一些额外的工作。做一些额外的工作,但也可以做到。
  为了从任何站点加载 JSON 或 HTML,我使用此函数:为了从任何站点加载 JSON 或 HTML,我使用此函数:
  Public Function getHTTP(ByVal sReq As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", sReq, False
.Send
getHTTP = StrConv(.responseBody, vbUnicode)
End With
End Function
  示例用法:示例用法:
  由于我不确定您从何处获取 JSON 数据,这里有一个使用 Stack Exchange API 显示 Stack Overflow 站点状态的示例:由于我不确定从何处获取 JSON 数据,以下是示例使用 Stack Exchange API 显示 Stack Overflow 站点的状态:
  Sub GetSiteInfo()
Const url = "https://api.stackexchange.com/ ... ot%3B
Dim json As String
json = getHTTP(url) 'get JSON response
If InStr(json, """error_id""") > 0 Or json = "" Then 'check for error
MsgBox "There was a problem." & vbLf & vbLf & json, vbCritical
Exit Sub
End If
json = Mid(json, InStr(json, "[{""") + 3) 'tidy response with string functions
json = Left(json, InStr(json, "}],") - 1)
json = Replace(Replace(Replace(json, Chr(34), ""), ",", vbNewLine), "_", " ")
json = Replace(StrConv(Replace(json, ":", " :" & vbTab & vbTab _
& vbTab), vbProperCase), " Per ", "/")
MsgBox json, vbInformation, "Site Statistics" 'display response
End Sub
  注意如何使用基本的字符串函数来管理像这样的简单响应的提取。
  使用基本字符串函数提取值使用基本字符串函数提取值
  再举一个例子,使用问题顶部的 JSON 数据,如果字符串在一个名为 json 的变量中,并且您想提取 bestBuy 的值,一种方法(几种可能的方法)是这样的:再举一个例子,使用问题顶部的JSON数据,如果字符串在一个名为json的变量中,并且您想提取bestBuy的值,则一种方法(几种可能的方法)如下:
  Sub jsonExtract_Demo()
Const json = "aaaaaaa""bestBuy"": ""6.04"",." 'for demo
Dim pStart As Long, pStop As Long, bestBuy As Single
Dim prefix As String, suffix As String
prefix = "bestBuy"": """ 'equivalent to: "bestBuy": "
suffix = """" 'equivalent to a single "
pStart = InStr(json, prefix) + Len(prefix) 'find beginning of value
pStop = InStr(pStart, json, suffix) 'find end of value
bestBuy = CSng(Mid(json, pStart, pStop - pStart)) 'extract & convert value
MsgBox "The value for 'bestBuy` is : " & bestBuy, vbInformation
End Sub
  WEBSERVICE 工作表功能 WEBSERVICE 工作表功能
  我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,它适用于大多数纯文本响应(例如这个 JSON 示例):我想指出的最后一件事是一个经常被忽视的 Excel 工作表函数,适用于大多数纯文本响应(例如这个 JSON 示例):
  输入工作表单元格:输入工作表单元格:
  =WEBSERVICE("https://raw.githubusercontent. ... 6quot;)
  ...您将立即看到原创文本结果,准备好根据需要使用工作表函数进行操作...。在 XML 响应的情况下,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段,这对于基本的抓取需求非常方便。对于 XML 响应,WEBSERVICE 可以与 FILTERXML 结合使用 XPath 提取特定的数据片段。非常方便的基本抓取需求。
  以上链接中的更多信息。上面收录的链接中有更多信息。

vba xmlhttp 抓取网页( 高手讲讲实现的基本流程吧..很多代码没有注释 )

网站优化优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2021-11-27 16:05 • 来自相关话题

  vba xmlhttp 抓取网页(
高手讲讲实现的基本流程吧..很多代码没有注释
)
  VB抓取网页某处内容【求取过程】
  作为标题...
  高手说说实现的基本过程。
  很多代码没有注释,看起来很累。
  真心学习!--------------------编程问答--------------------从xmlhttp中获取数据object 转换编码完成!--------------------编程问答--------------------
      'ServerXMLHTTP 获取函数<br />
    Function GetBody(Weburl)<br />
       On Error Resume Next<br />
       Dim xmlHttp<br />
       'Set xmlHttp=createobject("Msxml2.XMLHTTP.4.0")<br />
       'set xmlHttp=createobject("Microsoft.XMLHTTP")<br />
       Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP")<br />
       xmlHttp.setTimeouts 4000, 4000, 4000, 8000<br />
       xmlHttp.Open "GET", Weburl, False<br />
       xmlHttp.send<br />
       If xmlHttp.readystate = 4 Then<br />
       'if xmlHttp.status=200 then<br />
        GetBody = xmlHttp.responsebody<br />
       'end if<br />
        Else<br />
        GetBody = ""<br />
       End If<br />
      Dim sError<br />
       If Err.Number  0 Then<br />
       sError = Err.Number<br />
       Err.Clear<br />
       Else<br />
       sError = ""<br />
       End If<br />
       Set xmlHttp = Nothing<br />
    End Function<br />
    '远程获取网页编码格式转换<br />
    Function BytesToBstr(body, charset) '转换成需要的编码格式<br />
        Dim objstream<br />
        Set objstream = CreateObject("adodb.stream")<br />
        objstream.Type = 1<br />
        objstream.Mode = 3<br />
        objstream.Open<br />
        On Error Resume Next<br />
        objstream.Write body<br />
        objstream.Position = 0<br />
        objstream.Type = 2<br />
        objstream.charset = charset<br />
        BytesToBstr = objstream.ReadText<br />
        objstream.Close<br />
        Set objstream = Nothing<br />
    End Function
  --------------------编程问答--------------------msgboxBytesToBstr(GetBody("" ), "gb2312")
  补充:VB , 网络编程 查看全部

  vba xmlhttp 抓取网页(
高手讲讲实现的基本流程吧..很多代码没有注释
)
  VB抓取网页某处内容【求取过程】
  作为标题...
  高手说说实现的基本过程。
  很多代码没有注释,看起来很累。
  真心学习!--------------------编程问答--------------------从xmlhttp中获取数据object 转换编码完成!--------------------编程问答--------------------
      'ServerXMLHTTP 获取函数<br />
    Function GetBody(Weburl)<br />
       On Error Resume Next<br />
       Dim xmlHttp<br />
       'Set xmlHttp=createobject("Msxml2.XMLHTTP.4.0")<br />
       'set xmlHttp=createobject("Microsoft.XMLHTTP")<br />
       Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP")<br />
       xmlHttp.setTimeouts 4000, 4000, 4000, 8000<br />
       xmlHttp.Open "GET", Weburl, False<br />
       xmlHttp.send<br />
       If xmlHttp.readystate = 4 Then<br />
       'if xmlHttp.status=200 then<br />
        GetBody = xmlHttp.responsebody<br />
       'end if<br />
        Else<br />
        GetBody = ""<br />
       End If<br />
      Dim sError<br />
       If Err.Number  0 Then<br />
       sError = Err.Number<br />
       Err.Clear<br />
       Else<br />
       sError = ""<br />
       End If<br />
       Set xmlHttp = Nothing<br />
    End Function<br />
    '远程获取网页编码格式转换<br />
    Function BytesToBstr(body, charset) '转换成需要的编码格式<br />
        Dim objstream<br />
        Set objstream = CreateObject("adodb.stream")<br />
        objstream.Type = 1<br />
        objstream.Mode = 3<br />
        objstream.Open<br />
        On Error Resume Next<br />
        objstream.Write body<br />
        objstream.Position = 0<br />
        objstream.Type = 2<br />
        objstream.charset = charset<br />
        BytesToBstr = objstream.ReadText<br />
        objstream.Close<br />
        Set objstream = Nothing<br />
    End Function
  --------------------编程问答--------------------msgboxBytesToBstr(GetBody("" ), "gb2312")
  补充:VB , 网络编程

vba xmlhttp 抓取网页(我需要从价格比较网站(2015年03月23日) )

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-11-21 21:06 • 来自相关话题

  vba xmlhttp 抓取网页(我需要从价格比较网站(2015年03月23日)
)
  我需要比较 网站 的价格(产品链接:.toppreise.ch/prod_488002.html)。我不能挠。查看我要捕获的图像中突出显示的价格:
  
  请帮助我如何抓取此页面。
  PS:很多国家/地区都无法访问toppreise.ch,请使用VPN
  我正在使用以下代码:
  Private Sub SiteInfo_Click()
Dim strhtml
On Error Resume Next
ThisWorkbook.Sheets("Data Mining").Activate
Sheets("Data Mining").Range("B1").Select
Set xmlHttp = Nothing
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
StrUrl = ""
StrUrl = Sheets("Data Mining").Range("B1").Value
xmlHttp.Open "GET", StrUrl, False
xmlHttp.Send
strhtml =xmlHttp.responseText
END Sub
  当我运行上面的代码时,我只在下面的响应文本下得到一个提示。它没有给出整个页面。(您可以通过产品链接查看源代码,或者在这里查看 %20code.txt?dl =0)
  




...
  解决方案
  此代码有效,谢谢 SIM
  Sub Get_Price()
Dim HTTP As New XMLHTTP60, HTML As New HTMLDocument
Dim post As HTMLDivElement
With HTTP
.Open "GET", "https://www.toppreise.ch/index.php?a=488002", False
.send
HTML.body.innerHTML = .responseText
End With
For Each post In HTML.getElementsByClassName("altLinesOdd")
With post.getElementsByTagName("a")
If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
End With
With post.getElementsByClassName("spaceVert nobreak")
If .Length Then Cells(R, 2) = .Item(0).innerText
End With
Next post
End Sub 查看全部

  vba xmlhttp 抓取网页(我需要从价格比较网站(2015年03月23日)
)
  我需要比较 网站 的价格(产品链接:.toppreise.ch/prod_488002.html)。我不能挠。查看我要捕获的图像中突出显示的价格:
  
  请帮助我如何抓取此页面。
  PS:很多国家/地区都无法访问toppreise.ch,请使用VPN
  我正在使用以下代码:
  Private Sub SiteInfo_Click()
Dim strhtml
On Error Resume Next
ThisWorkbook.Sheets("Data Mining").Activate
Sheets("Data Mining").Range("B1").Select
Set xmlHttp = Nothing
Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
StrUrl = ""
StrUrl = Sheets("Data Mining").Range("B1").Value
xmlHttp.Open "GET", StrUrl, False
xmlHttp.Send
strhtml =xmlHttp.responseText
END Sub
  当我运行上面的代码时,我只在下面的响应文本下得到一个提示。它没有给出整个页面。(您可以通过产品链接查看源代码,或者在这里查看 %20code.txt?dl =0)
  




...
  解决方案
  此代码有效,谢谢 SIM
  Sub Get_Price()
Dim HTTP As New XMLHTTP60, HTML As New HTMLDocument
Dim post As HTMLDivElement
With HTTP
.Open "GET", "https://www.toppreise.ch/index.php?a=488002", False
.send
HTML.body.innerHTML = .responseText
End With
For Each post In HTML.getElementsByClassName("altLinesOdd")
With post.getElementsByTagName("a")
If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
End With
With post.getElementsByClassName("spaceVert nobreak")
If .Length Then Cells(R, 2) = .Item(0).innerText
End With
Next post
End Sub

vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-11-09 18:09 • 来自相关话题

  vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())
  网页数据下载与控制
  一、概述和感谢
  网页控制需要用到的方面可以大致总结如下:
  1、 程序中需要嵌入一个网页,比如天气预报。
  2、 需要从网上下载数据写入本地数据库。
  二、傲游的使用
  不管什么应用,第一件事就是找到网址(可能是废话)。
  以Winland的天气预报为例。如果我的程序需要这样的东西,我该怎么做:
  1、打开
  2、点击“天气预报”打开:/tianqi
  3、 尝试查看一个城市,此时找到了结果,但是URL并没有改变。
  4、点击Maxthon的viewpage。
  5、在“Frame”中,找到一个“Inline Frame”,点击打开。原来天气预报的网址是:
  /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c
  6、接下来我们就可以在自己的程序中使用这个URL直接查询了。
  综上所述,通过傲游,我们可以轻松找到自己需要的真实网站。
  viewpage里面还有一个“form”,里面清楚的显示了Name、method和Action。我知道这个 Action 是“结果页面”的 URL 的后半部分(对吗?)。
  (在网页形式中,Action为目标地址,即对提交内容进行处理的服务器端脚本,如果Action为空,则为当前文件。)
  三、 网页关键词解读(输入、按钮、数据)
  ASP 脚本片段的开始和结束。标签之间的脚本代码将在主页传递到用户浏览器之前在服务器上执行。
  并标记网页的开头,标记网页的结尾。
  并且网页上的文字应该放在这些标记之间
  以及表的开头和结尾
  表格边框参数指定表格边框的宽度
  并将表格标题放在这些标签之间
  和
  标记表中新行的开始。表中的每一行都以
  标记结束。
  和
  使用这些标签来标识表格单元格。每个单元格以
  马克开头
  标记结束。表格单元格可以收录任何内容,包括另一个表格。
  我们需要关注的是:和,和
  也
  和
  .
  文本框:有些省略TYPE、VALUE和SIZE,但应该有关键字INPUT和NAME。
  选择框:
  单选按钮:升序'当前选择
  降序
  多选按钮:
  '当前选择
  五菱LZW6400CV3客车(批次#F9)
  中顺SZS6503E1轻型客车(批次#F9)
  按下按键:
  名称=获取事件&gt;
  四、POST、GET 和 NAME、VALUE
  为了从网页中获取数据,参数需要明确。要在 Web 查询中将参数发送到 Web 服务器,您需要在验证特定 Web 服务器使用哪种方法后使用 POST 或 GET 方法。
  打开源代码并搜索“POST”。如果使用 POST 方法向 Web 服务器发送参数,则应显示文本 POST。如果Web服务器使用GET方式接收参数,可以在浏览器地址栏中看到参数名称和值。例如:/dist_sch/sch/searchresult/asp?boro=Manhattan &amp;flag= schoolInfo2
  (第一个参数前面加一个问号,参数之间用与号隔开,参数顺序不重要)
  搜索“名称”。在单词名称之后,可以看到括号中的一些文字,这是第一个参数的名称。在“value=”这个词之后,是参数的当前值。例如:
  在上面的 HTML 语句中,“Amount”这个词是参数名称,“1”是参数的当前值。参数值也可以是 HTML 标签中的选项之一。例如:
  Post和Get的区别:
  1、Get用于从服务器获取数据,Post用于向服务器传输数据。
  2、Get将表单中的数据以variable=value的形式添加到action指向的URL中,两者用“?”连接,变量用“&amp;”连接;Post是将表单中的数据放在表单的数据体中,以变量和值对应的方式传递给action指向的URL。
  3、Get 是不安全的,因为在传输过程中,数据是放在请求的 URL 中的,很多现有的服务器、代理服务器或者用户代理都会将请求的 URL 记录在日志文件中,然后放入日志文件。在某个地方,一些隐私信息可能会被第三方看到。此外,用户还可以直接在浏览器上看到提交的数据,一些内部系统消息会显示在用户面前。Post的所有操作对用户都是不可见的。
  4、Get传输的数据量很小。这主要是由于URL长度的限制,只能传输1024字节左右;而Post可以传输大量数据,最大2M,所以上传文件时只能使用Post。
  5、Get 限制Form的数据集的值为ASCII字符;和 Post 支持整个 ISO10646 字符集。
  6、Get 是 Form 的默认方法。
  五、使用网页浏览器
  要使用 WebBrowser,您需要添加“Microsoft Web 浏览器”(VBA) 或“Microsoft Internet 控件”(VB)。
  1、WebBrowser的简单使用方法:
  '开店前
  Urlstr=" /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c"
  F_tqyb.WebBrowser1.导航Urlstr
  F_tqyb.Show'当这句话被屏蔽时,WebBrowser也打开了网页,但在桌面上不显示
  Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)
  如果 WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'页面调用是否完成...
  结束子
  2、我们想要的网页内容:
  一般来说,我们想要的网页内容在WebBrowser1.document.body.innerhtml 和WebBrowser1.document.body.innertext 中,通过替换和分析,可以得到我们想要的数据。
  Innerhtml 中的内容是网页的源代码。
  innertext 中的内容是网页上显示的内容。(此内容是我们将网页保存为文本时的内容) 个人认为使用Innerhtml更方便。
  当您拥有 html 源代码时,您可以使用搜索和替换功能来删除您需要的数据。另外,可以将源代码写入文本文件,将文本文件的扩展名修改为htm,然后使用Excel的“导入外部数据”-“导入数据”功能将数据读入Excel。(通过这个方法,导入时选择具体的表,可以参考需要导入的表号WebTables)
  3、在程序中使用WebBrowser显示网页
  ⑴. 如果您需要的网页的 URL 收录怎么办?,而且取值规则很明确,很方便,直接把参数和取值写到URL中即可,如上例(显示宜昌天气),只需注意:第一个参数前面是一个问号,参数用与号分隔。参数的顺序并不重要。
  如果该值收录非英文和数字,则需要进行转换。(应用Winland的程序)
  示例:City=Escape("宜昌")
  公共函数转义(ByVal strText As String)作为字符串
  Dim JS 作为 ScriptControl
  设置 JS = 新建 MSScriptControl.ScriptControl
  nguage = "JavaScript"
  Escape = JS.Eval("encodeURI('" &amp; Replace(strText, "'", "\'") &amp; "');")
  结束函数
  ⑵. 如果您需要的网页的 URL 收录怎么办?,但价值规则不明确。例如,如果将其替换为一长串值,则需要从上层开始。我们估计并称之为“查询网页”和“结果网页”。
  通过程序分析“查询网页”,自动进入、选择、点击,或用户在使用时输入、选择、点击,打开“结果网页”。
  但是此时出现了一个问题:“结果网页”在新窗口中打开,在WebBrowser1中没有显示!这一刻,
  我们从以下方法中找到适合自己的:(详情见下文)
  ①、“遍历打开的IE窗口”,找到“结果网页”,读取网页,关闭网页,用EXCEL的“获取外部数据”将网页内容读入EXCEL。
  ②、“遍历打开的IE窗口”,找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴进去优秀。
  ③、“遍历打开的IE窗口”,找到“结果网页”,恢复对IE的控制,读取innerhtml,分析innerhtml。
  ④. 强制在 WebBrowser1 中显示新窗口,而无需打开 IE 或 Maxthon。阅读innerhtml并分析innerhtml。
  ⑤使用POST方式(winland提供)。
  ⑥. 使用EXCEL 的POST 方法。
  ⑶. 如果您需要的网址不包括在内怎么办?, 无论您的查询条件是什么,“结果页”的网址都保持不变。这时候如果直接在IE中输入地址,就什么也得不到。对于此类网页,只能从上层查看,同上。
  (我刚完成的程序属于这一类,用winland提供的POST方法不行,最后用EXCEL的POST方法完成)
  六、使用IE
  1、如果不想用WebBrowser,想用IE浏览器,或者“结果网页”是新窗口,被“强制”使用,控制起来也比较方便。
  将 IEPL 调暗为对象
  Set IEPL = CreateObject("InternetExplorer.Application")
  IEPL.Visible = False'Hide
  '打开网页
  URLstr=""
  IEPL.Navigate URLstr
  '和 webbrowser 一样,当页面被调用时,DocumentComplete 事件就会发生。
  '读取内部html
  ...
  IEPL.退出关闭
  或者:
  Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")
  遍历打开的IE窗口,通过窗口标题找到刚刚打开的IE(或“结果页”的新窗口),恢复对IE的控制。
  '遍历打开的IE窗口
  Dim dWinFolder 作为新的 ShellWindows
  Dim objIE 作为对象
  Dim Czpmxurl As String, Czpmxname As String
  对于 dWinFolder 中的每个 objIE
  Czpmxname = objIE.LocationName'Title
  If InStr(Czpmxname, "Query Results") Then
  Zdurl = 真
  万一
  下一个
  如果 Zdurl then'found
  objIE.application.Visible = False'隐藏
  czpmxurl = objIE.LocationURL'URL
  '读取内部html
  ...
  万一
  objIE.application.Quit'Close
  2、如果“结果网页”的新窗口不是IE,而是傲游,会比较麻烦。上述隐藏和关闭方法对傲游无效且无错误,但其他控制方法相同。此时要关闭傲游,必须使用sendkey Alt+F4 方法。
  当然,您也可以通过修改注册表将IE设置为默认。
  七、查询结果是新建弹窗的控件
  当查询结果是新的弹窗时,IE控件前面已经讨论过了,这里有两种方法:
  1、示例:通过窗口标题找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴在 EXCEL 中。
  '定义API函数
  声明函数 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  声明 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  声明函数 SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
  声明函数 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  类型 POINTAPI
  x只要
  y 只要
  结束类型
  声明函数 GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
  公共常量 SM_CXSCREEN = 0
  公共常量 SM_CYSCREEN = 1
  声明 Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  Public Const MOUSEEVENTF_MOVE = &amp;H1 '鼠标移动
  Public Const MOUSEEVENTF_LEFTDOWN = &amp;H2 '左键按下
  Public Const MOUSEEVENTF_LEFTUP = &amp;H4 '左键向上
  Public Const MOUSEEVENTF_RIGHTDOWN = &amp;H8 '右键按下
  Public Const MOUSEEVENTF_RIGHTUP = &amp;H10 '右键向上
  Public Const MOUSEEVENTF_MIDDLEDOWN = &amp;H20 '中键按下
  Public Const MOUSEEVENTF_MIDDLEUP = &amp;H40 '中间按钮向上
  Public Const MOUSEEVENTF_ABSOLUTE = &amp;H8000 '绝对移动
  '定义
  Dim Czpmxhwnd 只要
  czpmxhwnd = FindWindow(vbNullString, "-Query result-Microsoft Internet Explorer")'根据窗口标题搜索,找到时返回句柄
  If Czpmxhwnd = 0 Then Czpmxhwnd = FindWindow(vbNullString, "Query Results-Microsoft Internet Explorer")
  如果 Czpmxhwnd = 0 那么
  MsgBox "未找到", vbOKOnly, "提示"
  退出子
  万一
  aa = SetForegroundWindow(Czpmxhwnd)'将网页置于前台
  睡眠 100
  mouse_event MOUSEEVENTF_RIGHTDOWN 或 MOUSEEVENTF_RIGHTUP, 0&amp;, 0&amp;, 0, 0' 模拟鼠标点击,设置焦点
  睡眠 100
  SendKeys "^a", True'Ctrl+A 全选
  睡眠 100
  SendKeys "^c", True'Ctrl+C 复制
  睡眠 100
  SendKeys "%{F4}", True'Alt+F4 关闭
  '打开EXCEL,粘贴
  ...
  2、强制在WebBrowser1中显示新窗口,无需打开IE或Maxthon
  使用这种方法,无论是通过程序“自动点击”“提交”按钮,还是用户点击“提交”按钮,新窗口都被强制显示在WebBrowser1中,无需打开IE或Maxthon。
  从 1 创建一个新窗口,并在窗口中放置一个 WebBrowser1。
  私有子 Form_Load()
  Dim Strurl 作为字符串
  Strurl="……"'网址
  WebBrowser1.导航strurl
  结束子
  Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  '当有新的弹出窗口时触发
  将新窗口调暗为 Form1
  设置 NewWindow = New Form1
  新窗口.显示
  设置 ppDisp = NewWindow.WebBrowser1.Object
  '上面VBA中的命令错误需要改成:
  '设置 ppDisp = NewWindow.WebBrowser1
  结束子
  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  '网页下载'时触发
  Dim I As Single, J As Single
  如果WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'Open all web pages' 根据窗口标题或其他属性,判断是完成“查询网页”还是“结果网页”
  '根据不同的需求,编写相应的命令
  ...
  结束子
  八、使用POST方式(winland提供)
  要使用这种方法,首先必须根据“查询页面”中的内容编写要提交的查询字符串。当然,如果有非英文和数字,还必须使用上面的转义函数进行转换。
  strQuery="year_start=%202007&amp;month_start=%205&amp;date_start=%2012&amp;" &amp; _
  "hour_start=%200" &amp; _
  "&amp;year_end=%202007&amp;month_end=%205&amp;date_end=%2013&amp;hour_end=%200" &amp; _
  "&amp;substation%5B%5D=00&amp;R1=sortall&amp;order=1&amp;desckey="
  '上句表示开始年月日为:2007-5-12 0:00(%20为空格),结束时间:2007-5-13 0:00,单位为00( %5B%5D 为 []),所有内容,升序,无关键字。
  '没有“提交”按钮内容
  调用 QueryStr(strQuery)
  Public Sub QueryStr(strQuery As String) 查看全部

  vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())
  网页数据下载与控制
  一、概述和感谢
  网页控制需要用到的方面可以大致总结如下:
  1、 程序中需要嵌入一个网页,比如天气预报。
  2、 需要从网上下载数据写入本地数据库。
  二、傲游的使用
  不管什么应用,第一件事就是找到网址(可能是废话)。
  以Winland的天气预报为例。如果我的程序需要这样的东西,我该怎么做:
  1、打开
  2、点击“天气预报”打开:/tianqi
  3、 尝试查看一个城市,此时找到了结果,但是URL并没有改变。
  4、点击Maxthon的viewpage。
  5、在“Frame”中,找到一个“Inline Frame”,点击打开。原来天气预报的网址是:
  /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c
  6、接下来我们就可以在自己的程序中使用这个URL直接查询了。
  综上所述,通过傲游,我们可以轻松找到自己需要的真实网站。
  viewpage里面还有一个“form”,里面清楚的显示了Name、method和Action。我知道这个 Action 是“结果页面”的 URL 的后半部分(对吗?)。
  (在网页形式中,Action为目标地址,即对提交内容进行处理的服务器端脚本,如果Action为空,则为当前文件。)
  三、 网页关键词解读(输入、按钮、数据)
  ASP 脚本片段的开始和结束。标签之间的脚本代码将在主页传递到用户浏览器之前在服务器上执行。
  并标记网页的开头,标记网页的结尾。
  并且网页上的文字应该放在这些标记之间
  以及表的开头和结尾
  表格边框参数指定表格边框的宽度
  并将表格标题放在这些标签之间
  和
  标记表中新行的开始。表中的每一行都以
  标记结束。
  和
  使用这些标签来标识表格单元格。每个单元格以
  马克开头
  标记结束。表格单元格可以收录任何内容,包括另一个表格。
  我们需要关注的是:和,和
  也
  和
  .
  文本框:有些省略TYPE、VALUE和SIZE,但应该有关键字INPUT和NAME。
  选择框:
  单选按钮:升序'当前选择
  降序
  多选按钮:
  '当前选择
  五菱LZW6400CV3客车(批次#F9)
  中顺SZS6503E1轻型客车(批次#F9)
  按下按键:
  名称=获取事件&gt;
  四、POST、GET 和 NAME、VALUE
  为了从网页中获取数据,参数需要明确。要在 Web 查询中将参数发送到 Web 服务器,您需要在验证特定 Web 服务器使用哪种方法后使用 POST 或 GET 方法。
  打开源代码并搜索“POST”。如果使用 POST 方法向 Web 服务器发送参数,则应显示文本 POST。如果Web服务器使用GET方式接收参数,可以在浏览器地址栏中看到参数名称和值。例如:/dist_sch/sch/searchresult/asp?boro=Manhattan &amp;flag= schoolInfo2
  (第一个参数前面加一个问号,参数之间用与号隔开,参数顺序不重要)
  搜索“名称”。在单词名称之后,可以看到括号中的一些文字,这是第一个参数的名称。在“value=”这个词之后,是参数的当前值。例如:
  在上面的 HTML 语句中,“Amount”这个词是参数名称,“1”是参数的当前值。参数值也可以是 HTML 标签中的选项之一。例如:
  Post和Get的区别:
  1、Get用于从服务器获取数据,Post用于向服务器传输数据。
  2、Get将表单中的数据以variable=value的形式添加到action指向的URL中,两者用“?”连接,变量用“&amp;”连接;Post是将表单中的数据放在表单的数据体中,以变量和值对应的方式传递给action指向的URL。
  3、Get 是不安全的,因为在传输过程中,数据是放在请求的 URL 中的,很多现有的服务器、代理服务器或者用户代理都会将请求的 URL 记录在日志文件中,然后放入日志文件。在某个地方,一些隐私信息可能会被第三方看到。此外,用户还可以直接在浏览器上看到提交的数据,一些内部系统消息会显示在用户面前。Post的所有操作对用户都是不可见的。
  4、Get传输的数据量很小。这主要是由于URL长度的限制,只能传输1024字节左右;而Post可以传输大量数据,最大2M,所以上传文件时只能使用Post。
  5、Get 限制Form的数据集的值为ASCII字符;和 Post 支持整个 ISO10646 字符集。
  6、Get 是 Form 的默认方法。
  五、使用网页浏览器
  要使用 WebBrowser,您需要添加“Microsoft Web 浏览器”(VBA) 或“Microsoft Internet 控件”(VB)。
  1、WebBrowser的简单使用方法:
  '开店前
  Urlstr=" /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c"
  F_tqyb.WebBrowser1.导航Urlstr
  F_tqyb.Show'当这句话被屏蔽时,WebBrowser也打开了网页,但在桌面上不显示
  Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)
  如果 WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'页面调用是否完成...
  结束子
  2、我们想要的网页内容:
  一般来说,我们想要的网页内容在WebBrowser1.document.body.innerhtml 和WebBrowser1.document.body.innertext 中,通过替换和分析,可以得到我们想要的数据。
  Innerhtml 中的内容是网页的源代码。
  innertext 中的内容是网页上显示的内容。(此内容是我们将网页保存为文本时的内容) 个人认为使用Innerhtml更方便。
  当您拥有 html 源代码时,您可以使用搜索和替换功能来删除您需要的数据。另外,可以将源代码写入文本文件,将文本文件的扩展名修改为htm,然后使用Excel的“导入外部数据”-“导入数据”功能将数据读入Excel。(通过这个方法,导入时选择具体的表,可以参考需要导入的表号WebTables)
  3、在程序中使用WebBrowser显示网页
  ⑴. 如果您需要的网页的 URL 收录怎么办?,而且取值规则很明确,很方便,直接把参数和取值写到URL中即可,如上例(显示宜昌天气),只需注意:第一个参数前面是一个问号,参数用与号分隔。参数的顺序并不重要。
  如果该值收录非英文和数字,则需要进行转换。(应用Winland的程序)
  示例:City=Escape("宜昌")
  公共函数转义(ByVal strText As String)作为字符串
  Dim JS 作为 ScriptControl
  设置 JS = 新建 MSScriptControl.ScriptControl
  nguage = "JavaScript"
  Escape = JS.Eval("encodeURI('" &amp; Replace(strText, "'", "\'") &amp; "');")
  结束函数
  ⑵. 如果您需要的网页的 URL 收录怎么办?,但价值规则不明确。例如,如果将其替换为一长串值,则需要从上层开始。我们估计并称之为“查询网页”和“结果网页”。
  通过程序分析“查询网页”,自动进入、选择、点击,或用户在使用时输入、选择、点击,打开“结果网页”。
  但是此时出现了一个问题:“结果网页”在新窗口中打开,在WebBrowser1中没有显示!这一刻,
  我们从以下方法中找到适合自己的:(详情见下文)
  ①、“遍历打开的IE窗口”,找到“结果网页”,读取网页,关闭网页,用EXCEL的“获取外部数据”将网页内容读入EXCEL。
  ②、“遍历打开的IE窗口”,找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴进去优秀。
  ③、“遍历打开的IE窗口”,找到“结果网页”,恢复对IE的控制,读取innerhtml,分析innerhtml。
  ④. 强制在 WebBrowser1 中显示新窗口,而无需打开 IE 或 Maxthon。阅读innerhtml并分析innerhtml。
  ⑤使用POST方式(winland提供)。
  ⑥. 使用EXCEL 的POST 方法。
  ⑶. 如果您需要的网址不包括在内怎么办?, 无论您的查询条件是什么,“结果页”的网址都保持不变。这时候如果直接在IE中输入地址,就什么也得不到。对于此类网页,只能从上层查看,同上。
  (我刚完成的程序属于这一类,用winland提供的POST方法不行,最后用EXCEL的POST方法完成)
  六、使用IE
  1、如果不想用WebBrowser,想用IE浏览器,或者“结果网页”是新窗口,被“强制”使用,控制起来也比较方便。
  将 IEPL 调暗为对象
  Set IEPL = CreateObject("InternetExplorer.Application")
  IEPL.Visible = False'Hide
  '打开网页
  URLstr=""
  IEPL.Navigate URLstr
  '和 webbrowser 一样,当页面被调用时,DocumentComplete 事件就会发生。
  '读取内部html
  ...
  IEPL.退出关闭
  或者:
  Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")
  遍历打开的IE窗口,通过窗口标题找到刚刚打开的IE(或“结果页”的新窗口),恢复对IE的控制。
  '遍历打开的IE窗口
  Dim dWinFolder 作为新的 ShellWindows
  Dim objIE 作为对象
  Dim Czpmxurl As String, Czpmxname As String
  对于 dWinFolder 中的每个 objIE
  Czpmxname = objIE.LocationName'Title
  If InStr(Czpmxname, "Query Results") Then
  Zdurl = 真
  万一
  下一个
  如果 Zdurl then'found
  objIE.application.Visible = False'隐藏
  czpmxurl = objIE.LocationURL'URL
  '读取内部html
  ...
  万一
  objIE.application.Quit'Close
  2、如果“结果网页”的新窗口不是IE,而是傲游,会比较麻烦。上述隐藏和关闭方法对傲游无效且无错误,但其他控制方法相同。此时要关闭傲游,必须使用sendkey Alt+F4 方法。
  当然,您也可以通过修改注册表将IE设置为默认。
  七、查询结果是新建弹窗的控件
  当查询结果是新的弹窗时,IE控件前面已经讨论过了,这里有两种方法:
  1、示例:通过窗口标题找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴在 EXCEL 中。
  '定义API函数
  声明函数 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  声明 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  声明函数 SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
  声明函数 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  类型 POINTAPI
  x只要
  y 只要
  结束类型
  声明函数 GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
  公共常量 SM_CXSCREEN = 0
  公共常量 SM_CYSCREEN = 1
  声明 Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  Public Const MOUSEEVENTF_MOVE = &amp;H1 '鼠标移动
  Public Const MOUSEEVENTF_LEFTDOWN = &amp;H2 '左键按下
  Public Const MOUSEEVENTF_LEFTUP = &amp;H4 '左键向上
  Public Const MOUSEEVENTF_RIGHTDOWN = &amp;H8 '右键按下
  Public Const MOUSEEVENTF_RIGHTUP = &amp;H10 '右键向上
  Public Const MOUSEEVENTF_MIDDLEDOWN = &amp;H20 '中键按下
  Public Const MOUSEEVENTF_MIDDLEUP = &amp;H40 '中间按钮向上
  Public Const MOUSEEVENTF_ABSOLUTE = &amp;H8000 '绝对移动
  '定义
  Dim Czpmxhwnd 只要
  czpmxhwnd = FindWindow(vbNullString, "-Query result-Microsoft Internet Explorer")'根据窗口标题搜索,找到时返回句柄
  If Czpmxhwnd = 0 Then Czpmxhwnd = FindWindow(vbNullString, "Query Results-Microsoft Internet Explorer")
  如果 Czpmxhwnd = 0 那么
  MsgBox "未找到", vbOKOnly, "提示"
  退出子
  万一
  aa = SetForegroundWindow(Czpmxhwnd)'将网页置于前台
  睡眠 100
  mouse_event MOUSEEVENTF_RIGHTDOWN 或 MOUSEEVENTF_RIGHTUP, 0&amp;, 0&amp;, 0, 0' 模拟鼠标点击,设置焦点
  睡眠 100
  SendKeys "^a", True'Ctrl+A 全选
  睡眠 100
  SendKeys "^c", True'Ctrl+C 复制
  睡眠 100
  SendKeys "%{F4}", True'Alt+F4 关闭
  '打开EXCEL,粘贴
  ...
  2、强制在WebBrowser1中显示新窗口,无需打开IE或Maxthon
  使用这种方法,无论是通过程序“自动点击”“提交”按钮,还是用户点击“提交”按钮,新窗口都被强制显示在WebBrowser1中,无需打开IE或Maxthon。
  从 1 创建一个新窗口,并在窗口中放置一个 WebBrowser1。
  私有子 Form_Load()
  Dim Strurl 作为字符串
  Strurl="……"'网址
  WebBrowser1.导航strurl
  结束子
  Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  '当有新的弹出窗口时触发
  将新窗口调暗为 Form1
  设置 NewWindow = New Form1
  新窗口.显示
  设置 ppDisp = NewWindow.WebBrowser1.Object
  '上面VBA中的命令错误需要改成:
  '设置 ppDisp = NewWindow.WebBrowser1
  结束子
  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  '网页下载'时触发
  Dim I As Single, J As Single
  如果WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'Open all web pages' 根据窗口标题或其他属性,判断是完成“查询网页”还是“结果网页”
  '根据不同的需求,编写相应的命令
  ...
  结束子
  八、使用POST方式(winland提供)
  要使用这种方法,首先必须根据“查询页面”中的内容编写要提交的查询字符串。当然,如果有非英文和数字,还必须使用上面的转义函数进行转换。
  strQuery="year_start=%202007&amp;month_start=%205&amp;date_start=%2012&amp;" &amp; _
  "hour_start=%200" &amp; _
  "&amp;year_end=%202007&amp;month_end=%205&amp;date_end=%2013&amp;hour_end=%200" &amp; _
  "&amp;substation%5B%5D=00&amp;R1=sortall&amp;order=1&amp;desckey="
  '上句表示开始年月日为:2007-5-12 0:00(%20为空格),结束时间:2007-5-13 0:00,单位为00( %5B%5D 为 []),所有内容,升序,无关键字。
  '没有“提交”按钮内容
  调用 QueryStr(strQuery)
  Public Sub QueryStr(strQuery As String)

vba xmlhttp 抓取网页(写原生Ajax的方法:原生的Ajax是什么样呢?)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-11-02 18:15 • 来自相关话题

  vba xmlhttp 抓取网页(写原生Ajax的方法:原生的Ajax是什么样呢?)
  编写原生Ajax的方法:首先创建XMLHttpRequest对象;然后写回调函数onreadystatechange;然后配置请求信息;最后发送请求。
  
  Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的Web开发技术,对于提升用户体验和页面性能非常有帮助。
  简单来说,Ajax 不需要刷新页面,通过异步请求加载后台数据并呈现在网页上。常见的应用场景包括表单验证登录是否成功、百度搜索下拉框提示、快递单号查询等。
  想对Ajax有一个全面的了解,这里可以去Js教程进行全面的了解。
  现在Ajax经过各种优化已经变得很方便了。比如使用Jquery只需要一行就可以使用Ajax。
  
  那么什么是原生 Ajax?
  让我们来看看。
  
function ajax(url){
//创建XMLHttpRequest对象,新版本的浏览器可以直接创建XMLHttpRequest对象,IE5或IE6没有
//XMLHttpRequest对象,而是用的ActiveXObject对象
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")
xhr.open("get",url,true);
xhr.send();//发送请求
xhr.onreadysattechange = () =>{
if(xhr.readystate == 4){//返回存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
if(xhr.status == 200){//返回状态码
var data = xhr.responseTEXT;
return data;
}
}
}
}
  就绪状态: 查看全部

  vba xmlhttp 抓取网页(写原生Ajax的方法:原生的Ajax是什么样呢?)
  编写原生Ajax的方法:首先创建XMLHttpRequest对象;然后写回调函数onreadystatechange;然后配置请求信息;最后发送请求。
  
  Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的Web开发技术,对于提升用户体验和页面性能非常有帮助。
  简单来说,Ajax 不需要刷新页面,通过异步请求加载后台数据并呈现在网页上。常见的应用场景包括表单验证登录是否成功、百度搜索下拉框提示、快递单号查询等。
  想对Ajax有一个全面的了解,这里可以去Js教程进行全面的了解。
  现在Ajax经过各种优化已经变得很方便了。比如使用Jquery只需要一行就可以使用Ajax。
  
  那么什么是原生 Ajax?
  让我们来看看。
  
function ajax(url){
//创建XMLHttpRequest对象,新版本的浏览器可以直接创建XMLHttpRequest对象,IE5或IE6没有
//XMLHttpRequest对象,而是用的ActiveXObject对象
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : ActiveXObject("microsoft.XMLHttp")
xhr.open("get",url,true);
xhr.send();//发送请求
xhr.onreadysattechange = () =>{
if(xhr.readystate == 4){//返回存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
if(xhr.status == 200){//返回状态码
var data = xhr.responseTEXT;
return data;
}
}
}
}
  就绪状态:

vba xmlhttp 抓取网页(几种常用的方法(图)笔记介绍(组图))

网站优化优采云 发表了文章 • 0 个评论 • 127 次浏览 • 2021-10-20 19:25 • 来自相关话题

  vba xmlhttp 抓取网页(几种常用的方法(图)笔记介绍(组图))
  微知笔记的前身是网页文字快拍,所以微知笔记继承了网页文字快拍的很多功能,可以快速抓取网页内容并保存到微知笔记。下面介绍几种常用的方法:
  使用浏览器剪辑器插件
  微知笔记支持多种浏览器的网页编辑器插件,快速保存网页内容。网页保存方法包括保存整个页面、保存文本、保存选择、保存到本地等方法。如图:
  
  常见浏览器分类:
  IE内核浏览器
  Webkit内核浏览器
  浏览器中多种模式共存(不同模式使用不同工具)
  我们为一些主流浏览器提供了特殊的编辑器插件,例如:
  Chrome 浏览器
  火狐浏览器
  搜狗高速浏览器
  点击此处查看更多浏览器编辑器插件下载地址
  使用浏览器的右键菜单“Save to Wiz Notes”
  安装本地客户端或浏览器编辑插件后,浏览器右键菜单显示“保存到Wiznote”选项。点击该选项会调用Wiznote客户端进行本地保存。
  这时候也可以直接使用快捷键“Windows+S”来保存选中的内容
  
  PS:这个热键可以修改,直接在Windows客户端“Menu-&gt;Options-&gt;Webpage Clipper”中,如下图:
  
  使用浮动工具栏爬虫将网页保存到本地
  微智笔记支持在点击浮动工具栏中的保存按钮时自动抓取当前页面的选定部分进行快速保存。当前页面可以是网页、记事本、办公室等。
  
  在IE浏览器中,如果不选择任何内容进行保存,则默认保存整个界面。
  在其他非IE内核浏览器中,需要先选择需要保存的部分,然后再进行保存操作进行保存。如果不选择任何内容使用此方法保存,会提示“剪贴板抓取失败”且无法保存。
  注:浮动工具栏的调用方法:在Windows客户端点击“菜单-&gt;工具-&gt;浮动工具栏” 查看全部

  vba xmlhttp 抓取网页(几种常用的方法(图)笔记介绍(组图))
  微知笔记的前身是网页文字快拍,所以微知笔记继承了网页文字快拍的很多功能,可以快速抓取网页内容并保存到微知笔记。下面介绍几种常用的方法:
  使用浏览器剪辑器插件
  微知笔记支持多种浏览器的网页编辑器插件,快速保存网页内容。网页保存方法包括保存整个页面、保存文本、保存选择、保存到本地等方法。如图:
  
  常见浏览器分类:
  IE内核浏览器
  Webkit内核浏览器
  浏览器中多种模式共存(不同模式使用不同工具)
  我们为一些主流浏览器提供了特殊的编辑器插件,例如:
  Chrome 浏览器
  火狐浏览器
  搜狗高速浏览器
  点击此处查看更多浏览器编辑器插件下载地址
  使用浏览器的右键菜单“Save to Wiz Notes”
  安装本地客户端或浏览器编辑插件后,浏览器右键菜单显示“保存到Wiznote”选项。点击该选项会调用Wiznote客户端进行本地保存。
  这时候也可以直接使用快捷键“Windows+S”来保存选中的内容
  
  PS:这个热键可以修改,直接在Windows客户端“Menu-&gt;Options-&gt;Webpage Clipper”中,如下图:
  
  使用浮动工具栏爬虫将网页保存到本地
  微智笔记支持在点击浮动工具栏中的保存按钮时自动抓取当前页面的选定部分进行快速保存。当前页面可以是网页、记事本、办公室等。
  
  在IE浏览器中,如果不选择任何内容进行保存,则默认保存整个界面。
  在其他非IE内核浏览器中,需要先选择需要保存的部分,然后再进行保存操作进行保存。如果不选择任何内容使用此方法保存,会提示“剪贴板抓取失败”且无法保存。
  注:浮动工具栏的调用方法:在Windows客户端点击“菜单-&gt;工具-&gt;浮动工具栏”

vba xmlhttp 抓取网页(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程)

网站优化优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2021-10-13 00:11 • 来自相关话题

  vba xmlhttp 抓取网页(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程)
  示例 1
  
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for all new browsers
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = OK
// ...our code here...
}
else
{
alert("Problem retrieving XML data");
}
}
}
  自己试试
  注意:onreadystatechange 是一个事件处理程序。它的值(state_Change)是一个函数的名字,当 XMLHttpRequest 对象的状态改变时会触发这个函数。状态从 0(未初始化)变为 4(完成)。只有当状态为 4 时,我们才执行代码。
  为什么使用 Async=true?
  我们的示例在 open() 的第三个参数中使用了“true”。
  此参数指定是否异步处理请求。
  True 表示脚本将在 send() 方法之后继续执行,而无需等待服务器的响应。
  onreadystatechange 事件使代码复杂化。但这是防止代码在没有服务器响应的情况下停止的最安全方法。
  通过将此参数设置为“false”,可以省略额外的 onreadystatechange 代码。如果在请求失败时是否执行其余代码无关紧要,则可以使用此参数。
  自己试试 查看全部

  vba xmlhttp 抓取网页(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程)
  示例 1
  
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for all new browsers
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = OK
// ...our code here...
}
else
{
alert("Problem retrieving XML data");
}
}
}
  自己试试
  注意:onreadystatechange 是一个事件处理程序。它的值(state_Change)是一个函数的名字,当 XMLHttpRequest 对象的状态改变时会触发这个函数。状态从 0(未初始化)变为 4(完成)。只有当状态为 4 时,我们才执行代码。
  为什么使用 Async=true?
  我们的示例在 open() 的第三个参数中使用了“true”。
  此参数指定是否异步处理请求。
  True 表示脚本将在 send() 方法之后继续执行,而无需等待服务器的响应。
  onreadystatechange 事件使代码复杂化。但这是防止代码在没有服务器响应的情况下停止的最安全方法。
  通过将此参数设置为“false”,可以省略额外的 onreadystatechange 代码。如果在请求失败时是否执行其余代码无关紧要,则可以使用此参数。
  自己试试

官方客服QQ群

微信人工客服

QQ人工客服


线