admin 管理员组

文章数量: 1184232


2024年4月20日发(作者:程序员分享代码的网站)

vba网抓常用方法:

1、xmlhttp/winhttp法:

用xmlhttp/winhttp模拟向服务器发送请求,接收服务器返回的数据。

优点:效率高,基本无兼容性问题。

缺点:需要借助如fiddler的工具来模拟http请求。

2、IE/webbrowser法:

创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取

浏览器页面的数据。

优点:这个方法可以模拟大部分的浏览器操作。所见即所得,浏览器能看到的数据就能用代

码获取。

缺点:各种弹窗相当烦人,兼容性也确实是个很伤脑筋的问题。上传文件在IE里根本无法

实现。(有实现方法?请一定告诉我)

3、QueryTables法:

因为它是excel自带,所以勉强也算是一种方法。其实此法和xmlhttp类似,也是GET或

POST方式发送请求,然后得到服务器的response返回到单元格内。

优点:excel自带,可以通过录制宏得到代码,处理table很方便。代码简短,适合快速获取

一些存在于源代码的table里的数据。

缺点:无法模拟referer等发包头(如果你有在QT中模拟referer的方法,请一定告诉我)

网抓主题代码:

Sub Main()

Dim strText As String

With CreateObject("P")

'CreateObject("pRequest.5.1")'

.Open "POST", "", False

.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

.setRequestHeader "Referer", ""

.Send

strText = .responsetext

strText

End With

End Sub

拷贝剪切板:

Sub CopyToClipbox(strText As String)

'文本拷贝到剪贴板

With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

.SetText strText

.PutInClipboard

End With

End Sub

DongYu作业

(18.29 KB, 下载次数: 88)

2014-10-21 17:05 上传

下载次数: 88

Sub HomerWork1_1()

'新手:DongYu

'作业:1、网站:/lccp/

' 操作:点击“今日在售产品”,获取今日在售产品第一页的数据。

Dim xml As New P, url As String, St As String

Dim arr, brr, ar, i, c

url = "/lccp/?col=1&tag=desc&date=2014-

10-21&page=2"

With xml

.Open "GET", url, False

.send

St = .responseText

End With

St = Split(Split(St, "

")(1), "
")(0)

arr = Split(St, "")

ReDim brr(1 To UBound(arr), 1 To 9)

For i = 1 To UBound(arr)

ar = arr(i)

brr(i, 1) = Split(Split(ar, "value='")(1), "'")(0) + Split(Split(ar,

"")(1), "")(0)

brr(i, 2) = Split(Split(ar, "")(1),

"")(0)

brr(i, 3) = Split(Split(ar, "")(1), "")(0)

brr(i, 4) = Split(Split(ar, "")(1), "")(0)

brr(i, 5) = Split(Split(ar, "")(2), "")(0)

brr(i, 6) = Split(Split(ar, "")(3), "")(0)

brr(i, 7) = Split(Split(ar, "")(4), "")(0)

brr(i, 8) = Split(Split(ar, "")(5), "")(0)

brr(i, 9) = Split(Split(Split(ar, "")(5), "")(1),

">")(1)

Next i

With ActiveSheet

.

.Columns("D:E").NumberFormatLocal = "yyyy-m-d"

.[a1].Resize(1, 10) = [{"对比","产品名称","银行","起售日","停售日","币

种","管理期(月)","产品类型","预期收益(%)","收益"}]

.[b2].Resize(UBound(brr, 1), 9) = brr

End With

End Sub

Sub 按钮2_单击()

Dim url, html

url =

"/WEB/Flight/?JT=1"

url = url & "&OC=PEK" '北京首都机场

url = url & "&DC=SHA" '上海虹口机场

url = url & "&dstDesp=GUANGZHOU%B9%E3%D6%DD"

url = url & "&dst2=CAN"

url = url & "&DD=2014-10-22" '查询日期

url = url & "&DT=7"

url = url & "&BD="

url = url & "&BT=7"

url = url & "&AL=ALL" '全部航空

url = url & "&DR=true"

url = url & "&image.x=33"

url = url & "&image.y=9"

url = url & "&Sn=87bf24142bc0c78727610871f373e0a7"

Set html = CreateObject("htmlfile")

With CreateObject("p")

.Open "get", url, False

.send

tml = .responsetext

Set tb = ("div")

For i = 0 To - 1

If tb(i).classname = "menu_layout2" Or tb(i).classname =

"listone_layout" Or tb(i).classname = "listtwo_layout" Or tb(i).classname =

"menu_content_small2" Then

n = n + 1

For j = 0 To tb(i). - 1

Cells(n, j + 1) = tb(i).childnodes(j).innertext

Next

End If

Next

End With

End Sub

Sub 作业1_2_获取航班信息数据()

'网站:/S1/GNCX/

'操作:点击“查询”,获取航班信息数据。

Dim St As String, Url$, arr, brr, Crr

Dim S1$, S2$, i%, j%, rng As Range

Url =

"/WEB/Flight/?JT=1&O

C=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%DD&dst2=CAN&DD=2014-10-

22&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=37&image.y=9&Sn=87bf24142bc0c7872761087

1f373e0a7"

With CreateObject("pRequest.5.1")

.Open "GET", Url, False

.Send

St = .responsetext

End With

'

If InStr(St, "

") < 1 Then

Cells(1, 1) = "抱歉!没有满足条件的航班,请重新输入查询条件! "

Else

St = Split(Split(St, "

")(1),

"

")(0)

With ActiveSheet

Cells(1, 1) = Split(Split(St, "")(1), "")(0)

arr = Split(St, "

")

'航空公司分组

For i = 1 To UBound(arr)

S1 = arr(i)

Crr = Split(S1, "

")

ReDim brr(1 To UBound(Crr) + 2, 1 To 5)

'班次UBound(S1) + 1,航空公司及机行+1,航线+1

'航空公司

brr(1, 1) = Trim(Split(Split(S1, "

")(1),

"

")(0)) '中国东方航空公司

brr(1, 2) = Trim(Split(Split(S1, "

")(1),

"

")(0)) '航班

brr(1, 2) = Trim(Split(Split(brr(1, 2), "font"">")(1),

"")(0))

brr(1, 3) = Trim(Split(Split(S1, "

")(2),

"

")(0)) ''机型:333

'飞行线路

brr(2, 1) = Trim(Split(Split(S1, "

class=""menu1_layout"">")(1), "

")(0)) '北京首都机场

brr(2, 2) = Trim(Split(Split(S1, "

class=""menu2_layout"">")(1), "

")(0)) '(22:00)

brr(2, 3) = Trim(Split(Split(S1, "

class=""menu3_layout"">")(1), "

")(0)) '经停:0

brr(2, 4) = Trim(Split(Split(S1, "

class=""menu1_layout"">")(2), "

")(0)) '上海虹桥机场

brr(2, 5) = Trim(Split(Split(S1, "

class=""menu2_layout"">")(2), "

")(0)) '(23:55)

'飞行班次

For j = 1 To UBound(Crr)

S2 = Crr(j)

' S2

brr(2 + j, 1) = Trim(Split(Split(S2, "

class=""menu4_layout"">")(1), "

")(0)) '票价

brr(2 + j, 2) = Trim(Split(Split(S2, "

class=""menu5_layout"">")(1), "

")(0)) '舱位'

brr(2 + j, 3) = Trim(Split(Split(S2, "

class=""menu6_layout"">")(1), "

")(0)) '票数'

'……

Next j

Set rng = (, 1).End(xlUp).Offset(1,

0)

(UBound(brr, 1), 5) = brr

Next i

End With

End If

End Sub

Sub 作业1_2_航空公司获取()

'网站:/S1/GNCX/

'操作:点击“查询”,获取航班信息数据。

Dim strText As String

With CreateObject("P")

.Open "GET", "/images/", False

.Send

strText = .responsetext

ByteToStr(.responseBody, "GB2312")

End With

End Sub

Function ByteToStr(arrByte, strCharset As String) As String

With CreateObject("")

.Type = 1 'adTypeBinary

.Open

.Write arrByte

.Position = 0

.Type = 2 'adTypeText

.Charset = strCharset

ByteToStr = .Readtext

.Close

End With

End Function

Sub Main()

Dim strText As String

Const saltkey As String = "oUuXXXX"'请复制你自己的Cookie粘贴到这里。下同

Const sid As String = "tXXXX"

Const auth As String = "a30eEZTXXXXXXXXXXXXXXXXXXXX"

Const cookiereport As String = "f1fXXXXXXXXXXXXXXXXXXXXXXXX"

Const ulastactivity As String = "84cXXXXXXXXXXXXXXXXXXXX"

Const touclick As String = "70a9vPXXXXXXXXXXXXXXXXXXXX"

Const member_login_uid As String = "218917"

Const member_login_sid As String = "tXXXX"

With CreateObject("pRequest.5.1")

.Open "GET",

"/?mod=space&do=thread&view=me ", False

.setRequestHeader "Cookie", _

"5WOj_b676_saltkey=" & saltkey _

& ";5WOj_b676_sid=" & sid _

& ";5WOj_b676_auth=" & auth _

& ";5WOj_b676_cookiereport=" & cookiereport _

& ";5WOj_b676_ulastactivity=" & ulastactivity _

& ";5WOj_b676_touclick=" & touclick _

& ";5WOj_b676_member_login_uid=" & member_login_uid _

& ";5WOj_b676_member_login_sid=" & member_login_sid

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

Const saltkey As String = "oUuXXXX"

Const auth As String = "a30eEZTXXXXXXXXXXXXXXXXXXXX"

With CreateObject("pRequest.5.1")

.Open "GET",

"/?mod=space&do=thread&view=me ", False

.setRequestHeader "Cookie", _

"5WOj_b676_saltkey=" & saltkey _

& ";5WOj_b676_auth=" & auth

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

With CreateObject("P")

'CreateObject("pRequest.5.1")

.Open "POST", "/lz/?method=viewDetail",

False

.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

' .setRequestHeader "Referer", ""

.send "etpsId=150300047"

strText = .responseText

strText

End With

End Sub

Sub Main()

Dim strText As String

With CreateObject("pRequest.5.1") 'CreateObject("P")

'

.Open "POST", "/lz/?method=viewDetail", False

.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

.setRequestHeader "Referer",

"/lz/?method=doSearch"

.send "etpsId=150300047"

strText = .responseText

strText

End With

End Sub

Sub Main()

Dim strText As String

With CreateObject("pRequest.5.1")

.Open "GET",

":8080/costRegulatory/?method=showProjectList&is

Visitor=1&f_id=11011&t42", False

.setRequestHeader "Referer",

":8080/costRegulatory/?method=changeIndex&fareaId=1

"

.setRequestHeader "Cookie", "E0685A9F6B708A1F1039BF2322B82A35"

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

Dim strCookie As String

With CreateObject("pRequest.5.1")

.Option(6) = False ' 禁止重定向,以获取原网页信息

.Open "GET",

":8080/costRegulatory/?method=changeIndex&fareaId=1

", False

.Send

strText = .getAllResponseHeaders '获取所有的回应头信息

strText: Stop '在立即窗口里查看头信息

strCookie = Split(Split(strText, "Set-Cookie: ")(1), ";")(0) '取出Cookie

End With

'在同一个winhttp对象里能保留cookie,为了体现设置cookie的作用,启用一个新

的winhttp对象

With CreateObject("pRequest.5.1")

.Open "GET",

":8080/costRegulatory/?method=showProjectList&is

Visitor=1&f_id=11011&t42", False

.setRequestHeader "Referer",

":8080/costRegulatory/?method=changeIndex&fareaId=1

"

.setRequestHeader "Cookie", strCookie '模拟Cookie

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

With CreateObject("pRequest.5.1")

.Open "GET",

":8080/costRegulatory/?method=changeIndex&fareaId=1

", False

.Send '此次send是为了获取cookie

.Open "GET",

":8080/costRegulatory/?method=showProjectList&is

Visitor=1&f_id=11011&t42", False

.setRequestHeader "Referer",

":8080/costRegulatory/?method=changeIndex&fareaId=1

"

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

Const saltkey As String = "oUuXXXX"'请复制你自己的Cookie粘贴到这里。下同

Const sid As String = "tXXXX"

Const auth As String = "a30eEZTXXXXXXXXXXXXXXXXXXXX"

Const cookiereport As String = "f1fXXXXXXXXXXXXXXXXXXXXXXXX"

Const ulastactivity As String = "84cXXXXXXXXXXXXXXXXXXXX"

Const touclick As String = "70a9vPXXXXXXXXXXXXXXXXXXXX"

Const member_login_uid As String = "218917"

Const member_login_sid As String = "tXXXX"

With CreateObject("pRequest.5.1")

.Open "GET",

"/?mod=space&do=thread&view=me ", False

.setRequestHeader "Cookie", _

"5WOj_b676_saltkey=" & saltkey _

& ";5WOj_b676_sid=" & sid _

& ";5WOj_b676_auth=" & auth _

& ";5WOj_b676_cookiereport=" & cookiereport _

& ";5WOj_b676_ulastactivity=" & ulastactivity _

& ";5WOj_b676_touclick=" & touclick _

& ";5WOj_b676_member_login_uid=" & member_login_uid _

& ";5WOj_b676_member_login_sid=" & member_login_sid

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

Const saltkey As String = "oUuXXXX"

Const auth As String = "a30eEZTXXXXXXXXXXXXXXXXXXXX"

With CreateObject("pRequest.5.1")

.Open "GET",

"/?mod=space&do=thread&view=me ", False

.setRequestHeader "Cookie", _

"5WOj_b676_saltkey=" & saltkey _

& ";5WOj_b676_auth=" & auth

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

With CreateObject("P")

'CreateObject("pRequest.5.1")

.Open "GET",

"/?mod=space&uid=218917&do=thread&view=me&type

=reply&from=space&mobile=yes", False

.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible: MSIE 7.0;

Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)"

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

Dim strHost As String

Dim strURL As String

strHost = ""

With CreateObject("pRequest.5.1")

.Open "GET", strHost &

"/WEB/Flight/?JT=1&OC=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%D

D&dst2=CAN&DD=2014-10-22&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=37&image.y=14",

False

.setRequestHeader "Referer", "/S1/GNCX/"

.Send

strText = .responsetext

strURL = Split(Split(strText,

"setTimeout(""e('")(1), "'")(0)

.Open "GET", strHost & strURL, False

.Send

strText = .responsetext

strText

End With

End Sub

Sub Main()

Dim strText As String

Dim strHost As String

Dim strURL As String

strHost = ""

With CreateObject("pRequest.5.1")

.Open "GET", strHost &

"/WEB/Flight/?JT=1&OC=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%D

D&dst2=CAN&DD=2014-10-22&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=37&image.y=14",

False

.setRequestHeader "Referer", "/S1/GNCX/"

.Send

strText = .responsetext

strURL = Split(Split(strText,

"setTimeout(""e('")(1), "'")(0)

.Open "GET", strHost & strURL, False

.Send

strText = .responsetext

strText

End With

End Sub

本帖最后由 wcymiss 于 2014-10-24 15:18 编辑

对获取数据作个小结:

1、清除缓存cookie历史记录后用fiddler抓包。

2、搜索所需数据,找到数据真实网页(别忘了对fiddler事先进行设置,否则有可能搜不到

数据)

3、用代码模拟Request框的Raw按钮下的内容:

首先只写Open和Send,看是否有数据;(xmlhttp)(winhttp有时解析utf-8字符不成

功,所以初始测试首选xmlhttp)

无数据的话,首选模拟Referer;(winhttp)

仍然不行的话,观察Cookie或是URL或SendData中有无动态参数。有的话需要追根朔

源。(这步需要时间和耐心)

其他模拟一般都是小概率事件,如果遇到了我只能说你很不幸。

最后,祝你成功!

Sub Main()

Dim strText As String

With CreateObject("pRequest.5.1")

.SetProxy 2, "218.75.100.114:8080"

.Open "GET", "/", False

.send

strText = ByteToStr(.Responsebody, "GB2312")'请自行拷贝之前的常用函数

strText

End With

End Sub

Sub Main()

Const strFileName As String = "C:测试EH下载文件.rar"

With CreateObject("P")

'CreateObject("pRequest.5.1")

.Open "GET",

"/?mod=attachment&aid=MTA2MjQ1MHw0MDQxMTAzOHw

xNDE0MTIxNTg0fDIxODkxN3w4MDk5MjQ%3D", False

.Send

ByteToFile .responsebody, strFileName

End With

End Sub

Function unescape(strTobecoded As String) As String

With CreateObject("control")

.Language = "JavaScript"

unescape = .Eval("unescape('" & strTobecoded & "');")

End With

End Function

Function JSEval(s As String) As String

With CreateObject("Control")

.Language = "javascript"

JSEval = .Eval(s)

End With

End Function

Function EnCodeByHTML(strText As String)

With CreateObject("htmlfile")

.write strText

EnCodeByHTML = .ext

End With

End Function

有坛友问ResponseBody和ResponseText的区别,这里补充说下:

1、ResponseBody是二进制的数据,是服务器传来的没有经过任何加工的数据。在网络中,

文本一般都是以utf-8编码,所以xmlhttp/winhttp对象的ResponseText是按照utf-8编码

把ResponseBody转换而成,也就是:ResponseText=ByteToStr(ResponseBody,"UTF-8")

至于问“为什么ByteToStr(ResponseText,"GB2312")没有结果”,原因是:一是参数类型不对,

ByteToStr的第一参数是二进制数据的Byte数组类型,ResponseText是文本类型,系统提

示出错;二是,即使进行了将文本转成二进制数据的转换(如下面代码里的b7=s这样的转

换),这种转换也是按照某种编码进行的,这样的二进制已经进行过一次编码加工了,你再

用ByteToStr就得不到原来的字符了。

处理数据的通用方法:

1、数组法:

用split和数组,循环将所需数据取出。

优点:不需其他对象辅助,起点低,会数组即可。

缺点:需要分析数据结构,对于复杂结构的数据,需要多步才能完成。

Sub Main()

Dim strText As String

Dim arrRow, arrCell

Dim i As Long, j As Long, n As Long

Dim arrColumn

Dim arrData(1 To 1000, 1 To 10)

With CreateObject("P")

.Open "GET", "/lccp/", False

.Send

strText = .responsetext

End With

arrColumn = Array(, , 9, 12, 14, 16, 18, 20, 22, 24, 26)

arrRow = Split(strText, "name='proTest' ")

For i = 1 To UBound(arrRow)

arrCell = Split(arrRow(i), ">")

n = n + 1

arrData(n, 1) = Split(Split(arrCell(0), "value='")(1), "'")(0)

For j = 2 To 10

arrData(n, j) = Split(arrCell(arrColumn(j)), "<")(0)

Next

Next

Range("a1:j1").Value = Split("产品名称 是否在售 银行 起售日 停售日 币种 管

理期(月) 产品类型 预期收益(%) 收益类型", " ")

Range("a2").Resize(n, 10).Value = arrData

End Sub

2、正则法:

用正则拆解字符串,提取匹配数据,循环取出。

优点:即便复杂结构的数据,也有可能一步到位。

缺点:需要学习正则知识。

Sub Main()

Const gc As String = "" '群号

Const bkn As String = "" '从fiddler中获取

Const uin As String = "" 'QQ号

Const skey As String = "" '从fiddler中获取

Dim strText As String

Dim RegMatch As Object

Dim arrData(1 To 1000, 1 To 2)

Dim n As Long

With CreateObject("pRequest.5.1")

.Open "GET", "/cgi-

bin/qun_info/get_group_members_new?gc=" & gc & "&bkn=" & bkn, False

.setRequestHeader "Cookie", "uin=o" & uin & "; skey=" & skey

.Send

strText = .responsetext

strText

End With

With CreateObject("")

.Global = True

.Pattern = "{""b"":d+,""g"":d+,""n"":""([^""]*)"",""u"":(d+)}"

For Each RegMatch In .Execute(strText)

n = n + 1

arrData(n, 1) = ches(0)

arrData(n, 2) = ches(1)

Next

End With

Set RegMatch = Nothing

Range("a1:b1").Value = Array("昵称", "QQ号")

Range("a2").Resize(n, 2).Value = arrData

End Sub

处理table

table数据处理,除了之前的两种通用方法外,还有以下几种方法:

1、html法

将table数据写入htmldocument对象,然后循环取出表格的各个元素。

优点:可以利用htmldocument对象整理表格。

缺点:需要学习html相关知识。

以17楼作业二为例:

Sub Main()

Dim strText As String

Dim arrData(1 To 1000, 1 To 3)

Dim i As Long, j As Long

Dim TR As Object, TD As Object

With CreateObject("P")

.Open "POST",

"/Template//Present3DList", False

.setRequestHeader "Content-Type", "application/json"

.Send "{pageindex:'1',lottory:'TC7XCData_jiangS',pl3:'',name:'江苏七星

彩',isgp: '0'}"

strText = Split(JSEval(.responsetext), "

会提示错误,所以去除这部分script代码

End With

With CreateObject("htmlfile")

.write strText

i = 0

For Each TR In .("table")(2).Rows

i = i + 1

j = 0

For Each TD In

j = j + 1

arrData(i, j) = ext

Next

Next

End With

Set TR = Nothing

Set TD = Nothing

Range("C:C").NumberFormat = "@" '设置文本格式以显示数字前面的0

Range("a1").Resize(i, 3).Value = arrData

End Sub

Function JSEval(s As String) As String

With CreateObject("Control")

.Language = "javascript"

JSEval = .Eval(s)

End With

End Function

2、QueryTable法:

这个是excel自带的网抓利器。个人觉得它最大的优势就是处理table很方便。

优点:处理table方便,代码简短。

缺点:会产生定义名称。多页循环时每页都会产生行字段名称,需要后续处理删除。

Sub Main()

With

("url;/lccp/",

Range("a1"))

.WebFormatting = xlWebFormattingNone '不包含格式

.WebSelectionType = xlSpecifiedTables '指定table模式

.WebTables = "2" '第2张table

.Refresh False

End With

End Sub

3、复制粘贴法:

table部分的文字可以直接复制到单元格内,且保留数据原格式。

优点:只需取出table部分,不需分析数据内部结构。代码编写简便。

缺点:有时格式反而是累赘。

Sub Main()

Dim strText As String

With CreateObject("P")

.Open "GET", "/lccp/", False

.Send

strText = .responsetext

End With

strText = "")(0) &

""

CopyToClipbox strText

Range("a1").Select

End Sub

Sub CopyToClipbox(strText As String)

'文本拷贝到剪贴板

With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

.SetText strText

.PutInClipboard

End With

End Sub

处理xml数据

Sub Main()

ort _

URL:="/fzjy/tjsj/pztj/pzrtj/2014/", _

ImportMap:=Nothing, _

Overwrite:=True, _

Destination:=("a1")

End Sub

Sub Main()

Dim arrEM(1 To 4), arrEMname

Dim arrData(1000, 1 To 4)

Dim i As Long, j As Long

With CreateObject("P")

.Open "GET",

"/fzjy/tjsj/pztj/pzrtj/2014/", False

.send

arrEMname = Array(, "productid", "tradingday", "volume", "openinterest")

With .responseXML

For i = 1 To 4

Set arrEM(i) = .getElementsByTagName(arrEMname(i))

Next

For i = 0 To arrEM(1).Length - 1

For j = 1 To 4

arrData(i, j) = arrEM(j)(i).Text

Next

Next

End With

End With

Range("a1:d1").Value = Array("品种", "日期", "总成交量", "总持仓量")

Range("a2").Resize(i, 4).Value = arrData

End Sub

初识JSON

JSON数据的特点:

1、用方括号扩住的是数组,数组内元素以逗号分隔。如:["甲","乙","丙"]、[1,2,3]

2、用花括号扩住的是对象,对象内各属性以逗号分隔,属性名和属性值以冒号分隔。同一

对象里的属性名不会重复。如对象{"name":"甲","age":36},含name、age两个属性,属性

值分别为 “甲”和36。

3、对象的属性值可以是数组。数组的元素可以是对象。JSON数据就是数组对象嵌套的大集

合。比如,下面的JSON数据记录了甲乙二人的基本信息:

JSON转换成vba对象

1、JSON数组在vba内需要用For Each来获取其元素:(For Each 后面的变量不能定义为

Object类型)

1、 JSON数组在vba内需要用For Each来获取其元素:(For Each 后面的变量不能定义为

Object类型)

Sub Test()

Const strJSON As String = "[""甲"",""乙"",""丙""]"

Dim objJSON As Object

Dim Cell '这里不能定义为object类型

With CreateObject("control")

.Language = "JavaScript"

.AddCode "var mydata =" & strJSON

Set objJSON = .CodeObject

End With

Stop '查看vba本地窗口里objJSON对象以了解JSON数据在vba里的形态

For Each Cell In

Cell

Next

End Sub

2、 JSON对象在vba内可直接用“对象.属性”的方法获取,但当名称不被vba允许时,用

CallByName函数获取:

Sub Test()

Const strJSON As String = "{""name"":""甲"",""age"":36}"

Dim objJSON As Object

With CreateObject("control")

.Language = "JavaScript"

.AddCode "var mydata=" & strJSON

Set objJSON = .CodeObject

End With

Stop '查看本地窗口

'此句出错

End Sub

登陆:

Sub Main()

Const username As String = "vbatest"

Const password As String = "12341234"

Dim strText As String

Dim uid As String

uid = username & "@"

With CreateObject("P")

.Open "POST",

"/entry/cgi/ntesdoor?df=mail163_letter&funcid=loginone&ifra

me=1&passtype=1&product=mail163&race=63_31_31_gz&uid=" & username & "@",

False

.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

.Send

"savelogin=0&url2=http%3A%2F%%2Ferrorpage%&username

=" & username & "&password=" & password & "&password="

strText = .getallresponseheaders

strText

strText = .responsetext

strText

End With

End Sub

登录之后可以做什么----查询数据

登录并非是我们的最终目的。最终目的是查询一些非登录不能查看的数据,或是发送数据。

如论坛登录后,可下载附件,可发帖;邮箱登录后,可收件发件。

前面讲过,xmlhttp和winhttp只要该对象不销毁,都可以保持cookie。我们登录就是为了

取得一个被允许查看数据和发送数据的cookie,然后执行查询和发送的请求。

仍以网易邮箱为例:

登录后网页显示邮件列表,此过程抓包。

Sub Main()

Const Username As String = "vbatest"

Const Password As String = "12341234"

ConstAccountAsString="***************"

ConstToAccountAsString="***************"

Const Subject As String = "主题:用web发送邮件"

Const Content As String = "正文:看到此邮件则证明发送成功"

Dim strText As String

Dim Sid As String

Dim Senddata

With CreateObject("P")

.Open "POST",

"/entry/cgi/ntesdoor?df=mail163_letter&funcid=loginone&ifra

me=1&passtype=1&product=mail163&race=63_31_31_gz&uid=" & Username & "@",

False

.setrequestheader "Content-Type", "application/x-www-form-urlencoded"

.Send "username=" & Username & "&password=" & Password

Sid = Split(Split(.responsetext, "sid=")(1), "&")(0)

.Open "POST", "/js6/s?sid=" & Sid &

"&func=mbox:compose&FrameMasterMailPopupClose=1&cl_send=2&l=compose&action=deli

ver", False

.setrequestheader "Content-Type", "application/x-www-form-urlencoded"

.setrequestheader "Accept", "text/javascript" '不加这句的话返回的不是

json是xml数据

Senddata = "var=" & encodeURI("" _

& "" _

& "c:" & GetLongTime() & "" _

& "" _

& "" & Account & "" _

& "false" _

& "" & ToAccount & "" _

& "" _

& "" & Subject & "" _

& "true" _

& "" & Content & "" _

& "3" _

& "true" _

& "GBK

" _

& "false" _

& "deliver" _

& "1048576" _

& "

")

.Send Senddata

.responsetext

End With

End Sub

Function encodeURI(strTobecoded As String) As String

With CreateObject("control")

.Language = "JavaScript"

encodeURI = .eval("encodeURIComponent('" & strTobecoded & "');")

End With

End Function

Function GetLongTime()

With CreateObject("control")

.Language = "JavaScript"

GetLongTime = .eval("new Date().getTime();")

End With

End Function


本文标签: 数据 对象 需要

更多相关文章

提升性能看这里!了解显卡硬加速、对比是否启用CPU访问显存加速的优劣

1月前

简而言之,硬件加速就是利用硬件模块来替代软件算法以充分利用硬件所固有的快速特性。硬件解码生效的时候,系统是怎么运转的呢?现在我们有两个处理器,CPU和GPU。他们通过PCIAGPPCIE总线交换数据。1。C

电脑性能翻倍?探究开显卡加速和启用CPU访问显存加速的重要性

1月前

简而言之,硬件加速就是利用硬件模块来替代软件算法以充分利用硬件所固有的快速特性。硬件解码生效的时候,系统是怎么运转的呢?现在我们有两个处理器,CPU和GPU。他们通过PCIAGPPCIE总线交换数据。1。C

从繁复到简单——使用Leaf快速完成Flash资源自动化备份与恢复

1月前

Leaf备份系统:自动备份与恢复

Hex和Bin的奇妙旅程:实用转换技巧分享

1月前

大家好,我是学电子的小白白。 熟悉单片机开发的朋友,应该经常见到*.hex后缀的文件,它是单片机和嵌入式工程编译输出的一种常见的目标文件格式(比如keil就能编译输出hex文件),通过烧写工具把它下载到单片机中,程序就能在芯片

当心!不小心删了U盘内容?一文教你找回失联数据!

1月前

u盘删除的文件怎么不在回收站?当我们删除u盘上的文件时,你会发现这些删除的文件都不在回收站里,还无法在电脑中找到。其实这是因为硬盘上删除的文件会留在回收站,而u盘删除的文件一旦删除就是永久删除。 如果我们不小心删

Mysql高可用集群配置秘籍:一主两从模式实战演练

1月前

一、项目概述成功部署并验证了MySQL 8.3.0一主两从复制集群,实现了数据自动同步、高可用性和读写分离基础架构。该项目涵盖了从环境准备、软件安装、配置优化到故障排查的全流程。 MySQL 集群(MySQL C

GIS新知:快速上手指南带你玩转空间数据处理

1月前

1. 从零开始:GIS文件格式到底是什么? 如果你刚接触GIS(地理信息系统),可能会被一堆文件格式搞得晕头转向。别担心,这很正常。简单来说,GIS文件格式就是用来存储地理空间数据的“容器”,就像我们平时用的Word文档存文字

一文掌握:利用Windows剪贴板与clipbrd工具提升工作生产力的实战指南

1月前

简介:Windows剪贴板是操作系统中用于不同程序间传递信息的核心组件。本文将介绍其基本概念、格式多样性、clipbrd工具的功能及使用方法,以及HTML FORMAT与剪贴板的交互。剪贴板工具对于开发者、故障排查和用户体验研究等场景

ASF文件格式入门:让Flash内容制作更加高效与流畅

23天前

了解ASF文件格式对于开发人员在处理多媒体文件时非常重要。ASF代表"Advanced Systems Format",是一种由Microsoft开发的多媒体容器格式,用于存储和传输音频和视频数据。在本指南中,我们将深入

从基础到进阶:VLOOKUP在Excel中的运用与优化策略

19天前

说明我下面简单说明匹配数据,详细使用方式也可以参考下面文库哈EXCEL表中如何利用VLOOKUP将2张工作表的数据匹配? countif 方式1 A列数据在B列中出现的次

即时更新:厂里Flash中心的最热文章,深度剖析Adobe Flash Player的前沿技术

19天前

1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例

SWF硬盘测评汇总:帮你选到最合适的硬盘

19天前

硬盘天梯排行榜数据集成指南 引言 硬盘天梯排行榜数据为开发者和企业提供了硬盘性能的权威参考,涵盖SSD、HDD等各类存储设备的读写速度、耐用性、性价比等关键指标。通过API集成这些数据,用户可以快速获取最新的硬盘排名信

Windows 11与Windows 10:未来与过去的选择

19天前

全新 Windows 11 将于 10 月 5 日上市,微软宣布了运行新操作系统所需的最低配置要求。了解这一点后,你就可以查看你的 Windows10 系统是否能够完成升级Windows 10Windows

从入门到精通:Android 10.0 WiFi静态IP和DNS配置攻略

19天前

想要在代码中实现设置WIFI静态IP需要有系统权限,要在manifest文件添加android:sharedUserId=“android.uid.system”,还要有系统签名。设置WIFI静态IP和之前以太网的类似,都

Windows应用数据开发实战:Windows 8环境下轻松上手

18天前

一、Application Data简介Applicaion Data相当于桌面应用的注册表,存储一些用户配置信息,如运行时状态,用户喜好等,需要注意的时, 当卸载应用时,这些数据会被删除,所以不要存储重要数

掌握SWF文件,驾驭Adobe Flash Player的无限可能

18天前

一、Application Data简介Applicaion Data相当于桌面应用的注册表,存储一些用户配置信息,如运行时状态,用户喜好等,需要注意的时, 当卸载应用时,这些数据会被删除,所以不要存储重要数

玩转Windows Phone 8.1应用设置:_applicationdatacontainer_localsettings全解析

18天前

最近正好有机会看到林政老师的Windows Phone 8,1的书,正好我平时都是基于用户控件之类的写写使用收获,虽然 编程中基本上都用过应用数据之类的知识,但是一直没整理过,知识越来越多,东西也越来越杂,有时候过

深入I.MX6U:Linux启动方式的实战指南

18天前

第九章I.MX6U启动方式详解 I.MX6U支持多种启动方式以及启动设备,比如可以从SDEMMC、NAND Flash、QSPI Flash等启动。用户可以根据实际情况,选择合适的启动设备。不同的启动方式其启动方式和启动要求

Go与Linux通信基础:strace与read操作的深入解读

18天前

大家好,我是码农先森。 前言 各种编程语言百花齐放、百家争鸣,但是 “万变不离其中”。对于网络通信而言,每一种编程语言的实现方式都不一样;但其实,调用的底层逻辑都是一样的。linux 系统底层向上提供了统一的 Sock

eclipse 初始化失败

14天前

eclipse failed to createthe java virtualmachine解决方法:1.问题现象2.java虚拟机初始化失败!寻找eclipse解压路径3.寻找eclipse初

发表评论

全部评论 0
暂无评论