|
VBA万岁 发表于 2015-4-15 14:14
在论及含有ViewState的帖子中,似乎只有你的网抓教程(二),我这里测试相关代码,到目前为止,最成功的也 ...
我这里套用教程(二)示例的代码(运行不成功)如下:- Sub MSXML2查看专业资质排名()
- Dim strAllItemName, aryIndex, html
- Cells.Clear
- On Error Resume Next
- Set html = CreateObject("htmlfile")
- Url = "http://www.cfh.ac.cn/Album/ShowAlbum.aspx?albumid=4b7af393-99db-4461-a7c5-daa98b9384e5&Username=arisaema&AspxAutoDetectCookieSupport=1"
- With CreateObject("msxml2.xmlhttp")
- .Open "GET", Url, False
- .send
- viewstate = Split(Split(.responsetext, "__VIEWSTATE"" value=""", -1, vbTextCompare)(1), """", -1, vbTextCompare)(0) '取得VIEWSTATE的Post参数,去掉“, -1, vbTextCompare”也可
- EventValidation = Split(Split(.responsetext, "__EVENTVALIDATION"" value=""", -1, vbTextCompare)(1), """", -1, vbTextCompare)(0) '取得EVENTVALIDATION的Post参数
- n = Val(Split(Split(.responsetext, "总共")(1), "张")(0))
- p0 = Val(Split(Split(.responsetext, "当前是第1/")(1), "页")(0))
- End With
-
- For p = 1 To 2
- With CreateObject("msxml2.xmlhttp")
- PostData = "__VIEWSTATE=" & EncodePostdata(viewstate) & _
- "&__EVENTVALIDATION=" & EncodePostdata(EventValidation) & _
- "&ctl00%24HiddenField_MasterUserName=" & _
- "&ctl00%24HiddenField_VisitorUserName=" & _
- "&ctl00%24CurrAlbumID=" & _
- "&ctl00%24ContentPlaceHolder_body%24CurrentAlbumId=4b7af393-99db-4461-a7c5-daa98b9384e5" & _
- "&ctl00%24ContentPlaceHolder_body%24TotalPhotos=" & n & _
- "&ctl00%24ContentPlaceHolder_body%24TotalPages=" & p0 & _
- "&ctl00%24ContentPlaceHolder_body%24CurrentPage=1" & _
- "&AlbumRefUrl=" & _
- "&ctl00%24ContentPlaceHolder_body%24TxtPageSn=" & p & _
- "&ctl00%24ContentPlaceHolder_body%24ImgBtnGoPage.x=22" & _
- "&ctl00%24ContentPlaceHolder_body%24ImgBtnGoPage.y=8"
- .Open "POST", Url, False
- .setRequestHeader "Referer", Url '提交来源
- .setRequestHeader "If-Modified-Since", "0"
- .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 'POST提交必备
- .setRequestHeader "Content-Length", Len(PostData) 'POST提交的长度信息
- .setRequestHeader "Connection", "Keep-Alive"
- .send (PostData) ' 如果操作系统为XP,只有打上括号才能提交。(猜测可能和Unicode编码有关)
- html.body.innerhtml = .responsetext
- Set tb = html.all.tags("tr")
- For a = 2 To tb.Length
- For b = 0 To tb(a).Cells.Length - 1
- Cells((p - 1) * 10 + a - 1, b + 1) = tb(a).Cells(b).innertext
- Next
- Next
- viewstate = Split(Split(.responsetext, "__VIEWSTATE"" value=""")(1), """")(0) '获取VIEWSTATE参数
- EventValidation = Split(Split(.responsetext, "__EVENTVALIDATION"" value=""")(1), """")(0) '获取EVENTVALIDATION参数
- End With
- Next p
- End Sub
- Function EncodePostdata(szInput)
- Dim i As Long
- Dim x() As Byte
- Dim szRet As String
- szRet = ""
- x = StrConv(szInput, vbFromUnicode)
- For i = LBound(x) To UBound(x)
- If x(i) >= 48 And x(i) <= 57 Or x(i) >= 65 And x(i) <= 90 Or x(i) >= 97 And x(i) <= 122 Then
- szRet = szRet & Chr(x(i))
- Else
- szRet = szRet & "%" & Hex(x(i))
- End If
- Next
- EncodePostdata = szRet
- End Function
复制代码 |
|