ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] vba 网站数据获取,请大神帮忙看一下代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-3-21 23:19 | 显示全部楼层 |阅读模式
本帖最后由 RMOON 于 2013-3-22 23:11 编辑

有个网站难住我了。求救
http://www.iphoneox.com
013181005175016获取查询到的数据
我想用xmlhttp或是winhttp,都弄不下来
工作簿1.7z (14.6 KB, 下载次数: 38)


已经解决,感谢蓝天大神!
我原来的代码之所以没有成功,原因是获取了cookie后,上传时没有加上一个“;”,导致出错。
至于其它网站,cookie后面要不要加分号,我觉得也要看具体情况,以前我可是没注意到这个问题
分享完成的代码如下:
[code=vb]
Public Const url2 = "http://www.iphoneox.com/" '013181005175016,013071009588837,013170003230949
Public Const url20 = "http://www.iphoneox.com/validate.php" '013181005175016,013071009588837,013170003230949

Sub FImei(ByVal IDs As String)
    Dim xml As object
    Dim cki As String, Dat As String
    Dat = "imei=" & IDs & "&jq=x&key=9111613" ' & Int(Rnd(Timer) * 1000000)
    set xml=CreateObject("WinHttp.WinHttpRequest.5.1")
    With xml
        .Open "GET", url2, False
        .Send
        cki = Split(.GetResponseHeader("Set-Cookie"), ";")(0) & ";"
        .Open "POST", url20, False
        .SetRequestHeader "Referer", "http://www.iphoneox.com/"
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .SetRequestHeader "x-requested-with", "XMLHttpRequest"
        .SetRequestHeader "Cookie", cki
        .Send Dat
        Debug.Print .ResponseText
    End With
End Sub

[/code]

后记:
问题远比想象的复杂。这个网页post 数据中的key,从网页内容上看是随机数据,但是在
实际获取数据是发现,并不是随机的,而是对imei的一个校验。每个imei都对应了一个key.
不知道是如何生成的这个key.
上面的程序是对的。但post数据仅限于指定的imei和对应的key.

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-21 23:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
人工置顶,希望大神可以看到

TA的精华主题

TA的得分主题

发表于 2013-3-22 08:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我这里网速慢的一塌糊涂,你测试下吧
  1. Sub cc()
  2.     With CreateObject("InternetExplorer.Application")
  3.         .Visible = True
  4.         .navigate "http://www.iphoneox.com/"
  5.         Do While .Busy
  6.             DoEvents
  7.         Loop
  8.         .Document.Forms(0).all(0).Value = "013181005175016"
  9.         .Document.Forms(0).all(1).Click
  10.         Do While .Busy
  11.             DoEvents
  12.         Loop
  13.         k = 0
  14.         Set r = .Document.all.tags("td")
  15.         ReDim arr(1 To r.Length, 1 To 2)
  16.         For i = 0 To r.Length - 1
  17.             arr(i \ 2 + 1, k Mod 2 + 1) = r(i).innerText
  18.             k = k + 1
  19.         Next i
  20.     End With
  21.     [a1].Resize(UBound(arr), 2) = arr
  22. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-22 09:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 RMOON 于 2013-3-22 09:33 编辑

谢谢你的回复。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-22 09:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 RMOON 于 2013-3-22 09:33 编辑

谢谢你的回复。

TA的精华主题

TA的得分主题

发表于 2013-3-22 09:34 | 显示全部楼层
如果是这样,抱歉帮不了你,这个我比你懂的还少呢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-22 09:29 | 显示全部楼层
ccwan 发表于 2013-3-22 08:37
我这里网速慢的一塌糊涂,你测试下吧


ccwan 发表于 2013-3-22 08:37
我这里网速慢的一塌糊涂,你测试下吧

谢谢你的回复。你说的方法,我是知道的。
我的目的是想用xmlhttp,或是winhttp 来获取返回数据。想知道为什么这两个对象返回的结果不对,想知道我post数据时少了什么东西。

这是我的返回数据:
<!doctype html><table id="box-table-b"><tr><td>Device IMEI:</td><td>!!!Write to imei@iphoneox.com if you want to use the checker at your website!!!</td></tr><tr><td>Product description:</td><td><a  href="http://www.iphoneox.com">Visit this website -> www.iphoneox.com[/url]</a></td></tr><tr><td>Telephone technical support:</td><td>Free iPhone imei checker - www.iphoneox.com</td></tr><tr><td>Telephone support expiration date:</td><td>Visit www.iphoneox.com to check your imei!</td></tr><tr><td>Warranty(repairs and service coverage):</td><td>Expired</td></tr><tr><td>Warranty expiration date:</td><td><a  href="http://www.iphoneox.com">www.iphoneox.com - unlock your iPhone</a></td></tr><tr><td>Activation status:</td><td>Visit [url]www.iphoneox.com to unlock your iPhone</td></tr><tr><td>Is registered:</td><td>Yes</td></tr><tr><td>Sim lock status:</td><td><script language="javascript" type="text/javascript">window.location="http://www.iphoneox.com";</script></td></tr></table>

这是浏览器中的返回数据:

<!doctype html><table id="box-table-b"><tr><td>Device IMEI:</td><td>013181005175016</td></tr><tr><td>Product description:</td><td>iPhone 4S 16GB White</td></tr><tr><td>Telephone technical support:</td><td> Expired</td></tr><tr><td>Warranty(repairs and service coverage):</td><td> Active</td></tr><tr><td>Warranty expiration date:</td><td> September 21, 2013</td></tr><tr><td>Activation status:</td><td>Activated</td></tr><tr><td>Is registered:</td><td>Yes</td></tr><tr><td>Contract status:</td><td>Under contract</td></tr><tr><td>Contract expiration date:</td><td>September 22, 2014</td></tr>

TA的精华主题

TA的得分主题

发表于 2013-3-22 10:04 | 显示全部楼层
RMOON 发表于 2013-3-22 09:29
ccwan 发表于 2013-3-22 08:37
我这里网速慢的一塌糊涂,你测试下吧

Private Sub CommandButton1_Click()    'iPhone IMEI checker online FREE
    Set oDoc = CreateObject("htmlfile")
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", "http://www.iphoneox.com/", False
        .Send
        MyCookie = GetCookie(.getAllResponseHeaders)
        .Open "POST", "http://www.iphoneox.com/validate.php", False
        .SetRequestHeader "Referer", "http://www.iphoneox.com/"
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .SetRequestHeader "x-requested-with", "XMLHttpRequest"
        .SetRequestHeader "Connection", "Keep-Alive"
        .SetRequestHeader "Cookie", MyCookie
        .Send "imei=013181005175016&jq=x&key=9111613"
        oDoc.body.innerHTML = .responsetext
        Set r = oDoc.all.tags("table")(0).Rows
        For i = 0 To r.Length - 1
            For j = 0 To r(i).Cells.Length - 1
                Cells(i + 1, j + 1) = r(i).Cells(j).innerText
            Next j
        Next i
    End With
End Sub

Public Function GetCookie(str$)
    Dim cookie$
    a = InStr(str, "Set-Cookie: ")
    If a = 0 Then
        GetCookie = ""
    Else
        b = InStr(a, str, ";"): c = Mid(str, a + 12, b - a - 11)
        cookie = c
        Do
            d = InStr(b, str, "Set-Cookie: ")
            If d = 0 Then Exit Do
            E = InStr(d, str, ";"): F = Mid(str, d + 12, E - d - 11)
            b = E
            cookie = cookie & F
        Loop
        GetCookie = cookie
    End If
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-3-22 14:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
蓝天大师,能不能说明一下GetCookie函数在这里的的作用,谢谢啦

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-22 14:46 | 显示全部楼层
蓝天630902 发表于 2013-3-22 10:04
Private Sub CommandButton1_Click()    'iPhone IMEI checker online FREE
    Set oDoc = CreateObjec ...

谢谢蓝天大神!这些代码我也写的出来。但是我做的时候不行。
经过查找原因,与你post的数据对比,我传的cookie,少了一个“;”
直接要吐血了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-9 15:05 , Processed in 0.036024 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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