ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 网页抓取特定对象数据求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-2-8 15:46 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小弟需要抓取下面这个网址中,图片中红色圈圈所示处的数据, 但是碰到两个问题:
1. 等待网页加载完成有问题, 可能因为是JAVA控件, 虽然网页已经加载完了, 但是它的控件还没有完全打开. 请问这里该怎么判断该控件已经完全打开?
2. 要抓取的数据对象我定位不了, 因为找不到它的ID和name之类的东西, 所以用不了MSHTML.HTMLDocument.all("XX")这种方法,  另外我试过用item(?)去遍历对象, 可是好像也没用. 不知道是哪里出问题.
http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910
ScreenShot.JPG


点评

知识树索引内容:12楼,WEBBROWSER跨域访问  发表于 2013-9-25 00:09

TA的精华主题

TA的得分主题

发表于 2012-2-8 15:50 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-8 16:29 | 显示全部楼层
liucqa 发表于 2012-2-8 15:50
1、看这个http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=815805&pid=5596186

2 ...

谢谢你, 你介绍的例子网页我也打不开, 只看了一下代码, 好像不太适用, 我是引用IE为object去的, 也没有用自定义窗体去打开网址, 因为有些网页提交后会有弹出另一个结果网页, 所以我没有去这样写.

附上代码:
  1. IE.Visible = True
  2. IE.Navigate URL:="http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=" & "OOLU7530910"

  3. Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
  4.    DoEvents
  5. Loop
复制代码
下面就不知道怎么继续了.

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-8 19:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有人帮忙吗?听说只要显示出来的东西都能用Webbrowser抓取啊?用IE抓不了吗?

TA的精华主题

TA的得分主题

发表于 2012-2-9 21:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

  1. Sub Test()
  2.     With CreateObject("microsoft.xmlhttp")
  3.             .Open "get", "http://iport.sctcn.com/oi/action/Inquery/oiQuery?parameterType=ContainerInfo&parameterValue=OOLU7530910&appModuleName=OI&appFunctionName=ContainerInfo", False
  4.             .send
  5.           MsgBox Split(Split(.responsetext, "实际到泊信息")(1), "实际离泊信息")(0)
  6.     End With
  7. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-2-10 10:05 | 显示全部楼层
本帖最后由 xmyjk 于 2012-2-10 13:07 编辑
northwolves 发表于 2012-2-9 21:47

对了,狼版,请教下,如果用webbrowser,怎么解决跨域访问的问题(特别是上述那个会禁止访问的这种模式)。

TA的精华主题

TA的得分主题

发表于 2012-2-10 13:59 | 显示全部楼层
本帖最后由 xmyjk 于 2012-2-10 17:22 编辑

借狼版的改下

  1. Option Explicit

  2. Sub Test()
  3. Dim cookie
  4.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  5.             .Open "GET", "http://iport.sctcn.com/oi/action/Inquery/oiQuery?parameterType=ContainerInfo&parameterValue=OOLU7530910&appModuleName=OI&appFunctionName=ContainerInfo", False
  6.             .setRequestHeader "Cookie", "JSESSIONID=0254e1b04f3c624ddbf771b4bd255f1ed74a95532b7107a7f51e56d8b5e82e93"
  7.             .SEND
  8.             Debug.Print .RESPONSETEXT
  9.             MsgBox Split(Split(.RESPONSETEXT, "实际到泊信息")(1), "实际离泊信息")(0)
  10.     End With
  11. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-11 14:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xmyjk 发表于 2012-2-10 13:59
借狼版的改下

谢谢狼版和下弦月,我刚刚开始学习这方面的东西,原来网页查询还可以这样写,不过你们两位的代码到了Split处都说下标越界,看了一下.Responsetext, 找不到用于拆分的关键字,是不是该网页有什么定期随机变换的东西导至收到的数据不一样了?

点评

已发现,调整中。  发表于 2012-2-12 02:03

TA的精华主题

TA的得分主题

发表于 2012-2-12 13:04 | 显示全部楼层
本帖最后由 xmyjk 于 2012-2-12 13:12 编辑
闪存不足 发表于 2012-2-11 14:13
谢谢狼版和下弦月,我刚刚开始学习这方面的东西,原来网页查询还可以这样写,不过你们两位的代码到了Spli ...

应该可以了,你自行继续完善,把你要查询的单号用变量替换就可以当工具用。
说明下:网页有3个防护机制,第一个是转向时,URL里面有个SSOTOKEN的防盗。
第二个是最后一个取数的COOIKE防盗。
第三个是框架的判断,如果没有执行倒数第二步的框架内存加载,就不能取得数据。

[code=vb]
Option Explicit
Sub Test1()
    Dim xmlhttp As Object, Cookie As String, stok As String, s As String
    Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    With xmlhttp
        .Open "GET", "http://iport.sctcn.com/portal/page/portal/PG_IPort/P_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910", False
        .send
        stok = Replace(Replace(Replace(Split(Split(.RESPONSETEXT, "SSOToken"" value=""")(1), """>")(0), "~", "%7E"), "=", "%3D"), "+", "%2B")
        .Open "GET", "http://iport.sctcn.com/oi/?p_action=oi&p_langcode=zhs&SSOToken=" & stok & "&ParameterType=ContainerInfo&ParameterValue=OOLU7530910&debug=", False
        .send
        Cookie = Split(.getResponseHeader("Set-Cookie"), ";")(0)
        .Open "GET", "http://iport.sctcn.com/oi/action?SSOToken=" & stok & "&ParameterType=ContainerInfo&ParameterValue=OOLU7530910&LocaleCode=zhs&moduleName=oi&logout=&loginUrl=", False
        .send
        .Open "GET", "http://iport.sctcn.com/oi/action/Inquery/oiQuery?parameterType=ContainerInfo&#182;meterValue=OOLU7530910&appModuleName=OI&appFunctionName=ContainerInfo", False
        .setRequestHeader "Cookie", Cookie
        .send
        s = Split(Split(Split(.RESPONSETEXT, "实际到泊信息")(1), "实际离泊信息")(0), "</td></tr><tr><td>")(0)
        MsgBox Split(s, ">")(UBound(Split(s, ">")))
    End With
    Set xmlhttp = Nothing
End Sub
[/code]

蛇口.zip

10.79 KB, 下载次数: 117

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-12 19:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xmyjk 发表于 2012-2-12 13:04
应该可以了,你自行继续完善,把你要查询的单号用变量替换就可以当工具用。
说明下:网页有3个防护机制, ...

谢谢下弦月,刚才试了一下,还是提示下标越界,看了一下最后返回的信息里有“系统繁忙中,请稍候再试”和“处理中”等字段,你看是不是需要加个延迟等待?另外想问一下要看懂这种网页代码,除了HTML外,需要学习JAVA知识吗?

点评

去看看http://www.w3school.com.cn/,里面比较全面易懂。  发表于 2012-2-12 22:33
JAVA不需要吧,JS脚本看些有好处,不过用到也少,玩XMLHTTP要知道HTTP协议(最重要的是头部信息),玩WEBBROWSER要知道HTML和HTML DOM。  发表于 2012-2-12 22:32
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-20 03:28 , Processed in 0.044290 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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