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 14:29 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
研究中, 一定要解决我的问题!!

TA的精华主题

TA的得分主题

发表于 2014-10-27 14:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wcymiss 发表于 2014-10-27 14:05
JSON转换成vba对象

JSON数组在vba内需要用For Each来获取其元素: JSON对象在vba内可直接用“对象.属性” ...

建议采取
CallByName(objJSON.mydata, "name", VbGet)
另一法:定义name对象
  1. Sub Test()
  2.     Const strJSON As String = "{""name"":""甲"",""age"":36}"
  3.     Dim objJSON As Object, name As Object
  4.     Dim Cell
  5.     With CreateObject("msscriptcontrol.scriptcontrol")
  6.         .Language = "JavaScript"
  7.         .AddCode "var mydata=" & strJSON
  8.         Set objJSON = .CodeObject
  9.     End With
  10.     Debug.Print objJSON.mydata.age
  11.     Debug.Print objJSON.mydata.name           '此句在先行定义name对象的情况下,经测试可以通过
  12. End Sub
复制代码

点评

此name非彼name吧。一个是变量,一个是属性名。先行定义的用处仅仅是避免了自动大写。但若代码里有vba其他对象的name属性,也会变成小写。这样会不会造成其他困扰呢?  发表于 2014-10-27 14:59

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-27 15:03 | 显示全部楼层
wcymiss 发表于 2014-10-27 14:05
JSON转换成vba对象

JSON数组在vba内需要用For Each来获取其元素:JSON对象在vba内可直接用“对象.属性” ...

看了链接(3),才知道还有“[原创] 在VBA中使用JAVASCRIPT和VBSCRIPT(3)”这个帖子。

TA的精华主题

TA的得分主题

发表于 2014-10-27 15:24 | 显示全部楼层
本帖最后由 onlycxb 于 2014-10-27 15:31 编辑
onlycxb 发表于 2014-10-27 14:34
建议采取
CallByName(objJSON.mydata, "name", VbGet)
另一法:定义name对象

wcymiss :感谢你的鲜花,这对于我来讲是一种鼓励!此name非彼name吧。一个是变量,一个是属性名。先行定义的用处仅仅是避免了自动大写。但若代码里有vba其他对象的name属性,也会变成小写。这样会不会造成其他困扰呢?

       事先定义对象类型,没有通过Set方式指定。又因是小写所以不会冲突。在特定范围内使用是可以的。如objJSON.mydata.name限定了只是mydate这个层次下的name(非Name属性名称),是可以区分的。又如length,可用多处,代表的是指定的变量或对象,所以还是可以用的。
      如果代码中有其他Name属性,有可能存在干扰。这可能要换一种方式,比如set...,这里可能要灵活处理。所以也在贴子中首先强调了。建议采取CallByName(objJSON.mydata, "name", VbGet)方式。

TA的精华主题

TA的得分主题

发表于 2014-10-27 15:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 kangatang 于 2014-10-27 15:39 编辑
xmyjk 发表于 2014-10-26 16:08
玩一玩。呵呵,我登陆没选下次自动登陆,过一天左右sue和sup就失效了,就没法用了。
所以呵呵,如果要 ...

某些的网站行为如果分析的比较深,会发现很有意思。无论是网页脚本控制的客户端行为(分析网页脚本可知大概),还是服务器端程序的行为(我们看不到源码),背后都有网站设计者制定的一套游戏规则。要跟它玩就得知道游戏规则。它所制定的那么多规则,很大一方面就是为了用户的信息安全。感谢分享。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 15:49 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-27 16:51 编辑

编写JavaScript代码处理JSON(一)

个人为了练习分析JavaScript、JSON的能力,常编写JavaScript处理JSON成一个“表格文本”,放入剪贴板后粘贴到工作表内。

此法需要学习JavaScript知识。http://www.w3school.com.cn/js/index.asp

仍以之前的JSON数据为例:
  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 strJS As String
  4.     Dim strTable As String
  5.    
  6.     '为了编写方便,假设每个Person的children数组里至少有一个元素:
  7.     strJS = "var mydata=" & strJSON _
  8.         & ";var i,j;var s='name\tage\tchildname\tchildage\r';" _
  9.         & "for(i=0;i<mydata.length;i++){for(j=0;j<mydata[i].children.length;j++)" _
  10.         & "{s+=mydata[i].name+'\t'+mydata[i].age+'\t'+mydata[i].children[j].name+'\t'+mydata[i].children[j].age+'\r'}};"
  11.     strTable = JSEval(strJS)
  12.     Debug.Print strTable
  13.    
  14.     CopyToClipbox strTable
  15.     Cells.Clear
  16.     Range("a1").Select
  17.     ActiveSheet.Paste
  18. End Sub

  19. Function JSEval(strJS As String) As String
  20.     With CreateObject("MSScriptControl.ScriptControl")
  21.         .Language = "javascript"
  22.         JSEval = .Eval(strJS)
  23.     End With
  24. End Function

  25. Sub CopyToClipbox(strText As String)
  26.     With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  27.         .SetText strText
  28.         .PutInClipboard
  29.     End With
  30. End Sub
复制代码
JavaScript的'\t'相当于 vbTab,'\r'相当于 vbCr,取出值后,每列之间用'\t'连接,每行之间用'\r'连接,这样的文本复制到剪贴板后,可直接粘贴到工作表形成表格数据。

本法非主流,不喜勿用!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-27 16:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 bluexuemei 于 2014-10-27 16:35 编辑
wcymiss 发表于 2014-10-27 14:05
JSON转换成vba对象

1、JSON数组在vba内需要用For Each来获取其元素:

关于name,也可以这样解决
  1. Sub Test()
  2.     Const strJSON As String = "{""name"":""甲"",""age"":36}"
  3.     Set ojs = CreateObject("msscriptcontrol.scriptcontrol"): ojs.Language = "jScript"
  4.     y = ojs.eval("eval(" & strJSON & ")['name']")
  5.     MsgBox y
  6. End Sub
复制代码

点评

呃,那个帖子的意思是,json转换为vba对象后如何取出它的各种值。用了eval就不用转成vba对象了。直接用javascript处理后一步到位,类似我讲的“编写javascipt代码处理JSON”。。  发表于 2014-10-27 16:51

TA的精华主题

TA的得分主题

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

编写JavaScript代码处理JSON(二)

70楼的获取QQ群成员列表的数据为例,再上一个处理JSON的例子:
  1. Sub Main()
  2.     Const gc As String = "" '群号
  3.     Const bkn As String = "" '从fiddler中获取
  4.     Const uin As String = "" 'QQ号
  5.     Const skey As String = "" '从fiddler中获取
  6.     Dim strText As String
  7.     Dim strJS As String
  8.     Dim strTable As String
  9.    
  10.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  11.         .Open "GET", "http://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_new?gc=" & gc & "&bkn=" & bkn, False
  12.         .setRequestHeader "Cookie", "uin=o" & uin & "; skey=" & skey
  13.         .Send
  14.         strText = .responsetext
  15.     End With
  16.    
  17.     strJS = "var mydata=" & strText _
  18.         & ";var x,qq,s='qq号\t昵称\t群名片\t等级\r';" _
  19.         & "var mems=mydata.mems,cards=mydata.cards,lv=mydata.lv,lvname=mydata.levelname;" _
  20.         & "for(x in mems){qq=mems[x].u;s+=qq+'\t'+mems[x].n+'\t'+(cards[qq]||'')+'\t'+lvname['lvln'+lv[qq].l]+'\r'}"
  21.     strTable = JSEval(strJS)

  22.     CopyToClipbox strTable
  23.     Cells.Clear
  24.     Range("a1").Select
  25.     ActiveSheet.Paste
  26. End Sub
复制代码
此JSON数据内的很多对象都以QQ号为属性名,如mems[qq]可得该成员基本信息,cards[qq]得到群名片信息。所以可以遍历mems对象后获取qq号和昵称,再获取该qq群名片信息和等级信息组成table表。

如果不用JavaScript语句处理此JSON,因为群名片和群员等级在不同的对象里,取出后需要按照QQ号用字典来定位匹配。这样代码就相对较长了。有兴趣的朋友可以写个练练手。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

作业四

除了我上面的用javascript代码处理的方式,用其他方式提取群成员列表。包括:qq号、昵称、群名片、等级。


TA的精华主题

TA的得分主题

发表于 2014-10-27 18:17 | 显示全部楼层
onlycxb 发表于 2014-10-22 08:25
作业2、网站:http://www.caac.gov.cn/S1/GNCX/,     操作:点击“查询”,获取航班信息数据。'顺便把航 ...

你这个航班价位信息不全啊,机票价格,只有一个,还是重复的,别的价位都没抓出来
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 10:21 , Processed in 0.046091 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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