ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wcymiss

[原创] 不懂html也来学网抓(xmlhttp/winhttp+fiddler)

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-27 09:38 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
onlycxb 发表于 2014-10-27 09:20
学习很刻苦,赏花

多谢你的鲜花,更多谢你的帮助!

TA的精华主题

TA的得分主题

发表于 2014-10-27 09:51 | 显示全部楼层
xmyjk 发表于 2014-10-26 16:08
玩一玩。呵呵,我登陆没选下次自动登陆,过一天左右sue和sup就失效了,就没法用了。
所以呵呵,如果要 ...

Mark一下,申请了微博后再学习。

TA的精华主题

TA的得分主题

发表于 2014-10-27 09:53 | 显示全部楼层
本帖最后由 VBA万岁 于 2014-10-27 09:54 编辑
suwenkai 发表于 2014-10-26 22:50
换一种方法下载数据,哪个页面有下载excel的功能,捕捉数据后发送出来的效果。


我这里打不开目标网页,日后换台电脑再测试。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-27 10:03 | 显示全部楼层
此用户被禁言 发表于 2014-10-26 22:56
不明白为什么,使用IE对象与msxml2对象的时候,表格不一样
这个是在第二个

也想知道答案。

TA的精华主题

TA的得分主题

发表于 2014-10-27 10:43 | 显示全部楼层
此用户被禁言 发表于 2014-10-26 22:56
不明白为什么,使用IE对象与msxml2对象的时候,表格不一样
这个是在第二个

因为IE执行了网页中的 js ,而js中有向html 插入 table 。
xmlhttp 不执行 js。
所以,得到的html 结构会不同。

TA的精华主题

TA的得分主题

发表于 2014-10-27 10:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
此用户被禁言 发表于 2014-10-26 22:56
不明白为什么,使用IE对象与msxml2对象的时候,表格不一样
这个是在第二个

在这个网页中,数据所在的table有唯一标识:id="Table1"

用这个特征,可以迅速找到数据。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-27 10:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好东西,必须收藏,

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 11:35 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-28 09:29 编辑

初识JSON

JSON数据的特点:
1、用方括号扩住的是数组,数组内元素以逗号分隔。如:["甲","乙","丙"]、[1,2,3]
2、用花括号扩住的是对象,对象内各属性以逗号分隔,属性名和属性值以冒号分隔。同一对象里的属性名不会重复如对象{"name":"甲","age":36},含name、age两个属性,属性值分别为 “甲”和36。
3、对象的属性值可以是数组。数组的元素可以是对象。JSON数据就是数组对象嵌套的大集合。比如,下面的JSON数据记录了甲乙二人的基本信息:
  1. [{"name":"甲","age":36,"children":[{"name":"甲儿","age":10},{"name":"甲女","age":7}]},{"name":"乙","age":28,"children":[{"name":"乙女","age":6}]}]
复制代码
将其格式化后,看起来更清晰:
  1. [
  2.   {
  3.     "name" : "甲",
  4.     "age" : 36,
  5.     "children" :
  6.     [
  7.       {
  8.         "name" : "甲儿",
  9.         "age" : 10
  10.       },
  11.       {
  12.         "name" : "甲女",
  13.         "age" : 7
  14.       }
  15.     ]
  16.   },
  17.   {
  18.     "name" : "乙",
  19.     "age" : 28,
  20.     "children" :
  21.     [
  22.       {
  23.         "name" : "乙女",
  24.         "age" : 6
  25.       }
  26.     ]
  27.   }
  28. ]
复制代码
解读:甲36岁,有10岁的甲儿和7岁的甲女两个子女;乙28岁,有6岁的乙女一个子女。

JSON数据易于解读,字符简短,方便网络传输,在网络中应用相当广泛。

敬请进入http://www.w3school.com.cn/json/index.asp学习更多JSON知识。

小贴士:
点击Fiddler的Response框的JSON按钮,可以很清晰的看到JSON数据结构。


再补个附件,对比下类似效果的table和xml: 对比类似效果的table和xml.rar (457 Bytes, 下载次数: 436)
可以都用excel打开,xml打开的时候选择“xml列表”

吐槽:囧!这篇帖子提交时居然提示我含有不良信息!后来一个个词检查,发现问题竟然在“孩 子”二字上,改成“子女”就没问题了!!!。额滴大神,“孩 子”二字有啥问题涅?

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-27 12:30 | 显示全部楼层
coby001 发表于 2014-10-27 10:47
在这个网页中,数据所在的table有唯一标识:id="Table1"

用这个特征,可以迅速找到数据。

原来如此,明白了,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 14:05 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-31 09:41 编辑

JSON转换成vba对象

1、JSON数组在vba内需要用For Each来获取其元素:(For Each 后面的变量不能定义为Object类型)
  1. Sub Test()
  2.     Const strJSON As String = "[""甲"",""乙"",""丙""]"
  3.     Dim objJSON As Object
  4.     Dim Cell '这里不能定义为object类型
  5.     With CreateObject("msscriptcontrol.scriptcontrol")
  6.         .Language = "JavaScript"
  7.         .AddCode "var mydata =" & strJSON
  8.         Set objJSON = .CodeObject
  9.     End With
  10.     Stop '查看vba本地窗口里objJSON对象以了解JSON数据在vba里的形态
  11.     For Each Cell In objJSON.mydata
  12.         Debug.Print Cell
  13.     Next
  14. End Sub
复制代码
2、JSON对象在vba内可直接用“对象.属性”的方法获取,但当名称不被vba允许时,用CallByName函数获取:
  1. Sub Test()
  2.     Const strJSON As String = "{""name"":""甲"",""age"":36}"
  3.     Dim objJSON As Object
  4.     With CreateObject("msscriptcontrol.scriptcontrol")
  5.         .Language = "JavaScript"
  6.         .AddCode "var mydata=" & strJSON
  7.         Set objJSON = .CodeObject
  8.     End With
  9.     Stop '查看本地窗口
  10.     Debug.Print objJSON.mydata.age
  11.     Debug.Print objJSON.mydata.Name '此句出错
  12. End Sub
复制代码
“name”作为vba对象的属性时会被自动首字母大写。而JavaScript里是区分大小写的,“Name”不能等同“name”,json数据里无“Name”属性,所以代码运行出错。

这时让我们请出“CallByName”吧。(使用前请先查看vba帮助中对此函数的说明

将出错的那句代码改成:
  1. Debug.Print CallByName(objJSON.mydata, "name", VbGet)
复制代码
ok。数据成功获取!

3、综合处理:
  1. Sub Test()
  2.     Const strJSON As String = "[{""name"":""甲"",""age"":36,""children"":[{""name"":""甲儿"",""age"":10},{""name"":""甲女"",""age"":7}]},{""name"":""乙"",""age"":28,""children"":[{""name"":""乙女"",""age"":6}]}]"
  3.     Dim objJSON As Object
  4.     Dim Person, Child
  5.     Dim arrData(1 To 100, 1 To 4)
  6.     Dim i As Long
  7.    
  8.     With CreateObject("msscriptcontrol.scriptcontrol")
  9.         .Language = "JavaScript"
  10.         .AddCode "var mydata =" & strJSON
  11.         Set objJSON = .CodeObject
  12.     End With
  13.     Stop '多多查看本地窗口,你才会进步更快。。。
  14.    
  15.     '为了编写方便,假设每个Person的children数组里至少有一个元素:
  16.     For Each Person In CallByName(objJSON, "mydata", VbGet)
  17.         For Each Child In CallByName(Person, "children", VbGet)
  18.             i = i + 1
  19.             arrData(i, 1) = CallByName(Person, "name", VbGet)
  20.             arrData(i, 2) = CallByName(Person, "age", VbGet)
  21.             arrData(i, 3) = CallByName(Child, "name", VbGet)
  22.             arrData(i, 4) = CallByName(Child, "age", VbGet)
  23.         Next
  24.     Next
  25.     Cells.Clear
  26.     Range("a1:d1").Value = Array("name", "age", "childname", "childage")
  27.     Range("a2").Resize(i, 4).Value = arrData
  28. End Sub
复制代码
个人建议:为了区分vba对象本身的属性,建议JSON对象的属性都用CallByName表示。


更多在vba中使用JavaScript的例子,敬请参考figfig大师的帖子:
http://club.excelhome.net/thread-478544-1-1.html
http://club.excelhome.net/thread-483942-1-1.html
http://club.excelhome.net/thread-484702-1-1.html

评分

5

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-23 11:26 , Processed in 0.054631 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表