. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 关闭主题
 
主题工具
zzhikang
 
zzhikang 的头像
热心会员
 
资 料:
注册日期: Jun 2002
帖子: 5,351 声望值: 3
精华: 1,解答: 6
#1 旧 2011-12-10, 22:31:48 默认 【求助】请帮忙指点一下如何Excel VBA实现网页操作
zzhikang 当前离线  

实现效果如下:
打开某个网页,然后点击登录对话框,输入用户名和密码,进入登陆后的界面,
然后通过某个链接下载一个文件。

登录界面可以通过VBA实现,但是登陆后服务器返回的新页面,怎么获取然后操作呢?

请高手指点一二啊,谢谢!


我在尽力正面看待每一件事
edwardj
 
edwardj 的头像
超级会员
 
资 料:
注册日期: Nov 2001
帖子: 1,745 声望值: 3
精华: 1,解答: 3
#2 旧 2011-12-11, 22:44:21 默认
edwardj 当前离线  

引用:
作者: zzhikang 查看帖子
实现效果如下:
打开某个网页,然后点击登录对话框,输入用户名和密码,进入登陆后的界面,
然后通过某个链接下载一个文件。

登录界面可以通过VBA实现,但是登陆后服务器返回的新页面,怎么获取然后操作呢?

请高手指点一二啊,谢谢!
可以创建 IE 的 COM 对象,然后对这个对象操作。
代码:
set oIE = CreateObject("InternetExplorer.Application")
oIE.visible = true ' 显示 IE 窗口

'转到某网址
oIE.Navigate loginUrl

'页面加载完成后
set oDoc = oIE.document  ' 取document对象
set oUser = oDoc.getElementById('user')  ' 取用户名输入框控件,假定输入框的 html 代码为 <input type="text" id="user">; 下同
oUser.value = yourusername
set oPass = oDoc.getElementById('pass')
oPass.value = yourpassword
set oForm = oDoc.getElementById('loginForm')  '假定 user/pass 在这个 loginForm 中
oForm.submit  '提交

。。。。。。
上面的伪代码简单演示了一下如何登录,很不完善。具体的控件 id/name,页面某些内部运作,需要你自己对页面进行分析。你关心的登陆后页面跳转 IE 会自己处理。具体下载文件的页面或者链接,可以通过 IE 的 Navigate 方法去打开。你可能需要挂接 IE 的相应事件来确定页面是否加载完成等等。

IE 及其子对象的事件、方法和属性可以查 msdn

此帖于 2011-12-11 22:48:14 被 edwardj 编辑. .


胸无大志,跑到屁股上去了 :eek:
zzhikang
 
zzhikang 的头像
热心会员
 
资 料:
注册日期: Jun 2002
帖子: 5,351 声望值: 3
精华: 1,解答: 6
#3 旧 2011-12-12, 22:22:23 默认
zzhikang 当前离线  

我重新试了一下,已经可以正常登入了,但在抓去文件时出了问题。
我是用VBA下载程序如下:
引用:
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", vWebFile, False 'Open socket to get the website
oXMLHTTP.Send 'send request
试图抓取文件链接:
引用:
http://xxx.xxx.com/cqweb/cqqueryresults.cq?action=ExportQueryResult&format=EXCEL&action=ExecuteQuery&resourceId=cq.repo.cq-query%3A45449565%40DCT_Production%2FDCTPD&format=JSON&cquid=0000BUBhuJO1Y3ZguC_Zmb66XGJ:-1
结果返回出错信息:


引用:
{
"message": {
"MESSAGE": "ClearQuest Session Expired",
"STATUS": "LOGIN_FAIL"
},
"status": "LOGIN_FAIL"
}
可是,此时在IE中地址栏输入这个地址,可以弹出保存文件的对话框来啊。
请问我哪里出错了吗?

谢谢!
edwardj
 
edwardj 的头像
超级会员
 
资 料:
注册日期: Nov 2001
帖子: 1,745 声望值: 3
精华: 1,解答: 3
#4 旧 2011-12-12, 23:37:28 默认
edwardj 当前离线  

引用:
作者: zzhikang 查看帖子
我重新试了一下,已经可以正常登入了,但在抓去文件时出了问题。
我是用VBA下载程序如下:


试图抓取文件链接:


结果返回出错信息:




可是,此时在IE中地址栏输入这个地址,可以弹出保存文件的对话框来啊。
请问我哪里出错了吗?

谢谢!
用 XML 的 HTTPREQ 也行,不过你登录的时候用的啥?XML HTTPREQ 的 POST 方法吗?还是用 IE 对象?如果用的 IE,后续的下载操作就必须通过 IE,反之则必须用 HTTPREQ,否则就会造成 session 错误。
zzhikang
 
zzhikang 的头像
热心会员
 
资 料:
注册日期: Jun 2002
帖子: 5,351 声望值: 3
精华: 1,解答: 6
#5 旧 2011-12-13, 09:24:17 默认
zzhikang 当前离线  

引用:
作者: edwardj 查看帖子
用 XML 的 HTTPREQ 也行,不过你登录的时候用的啥?XML HTTPREQ 的 POST 方法吗?还是用 IE 对象?如果用的 IE,后续的下载操作就必须通过 IE,反之则必须用 HTTPREQ,否则就会造成 session 错误。
谢谢提醒,可能问题就出在这个地方,我登录时用的是IE的方法:
CreateObject("InternetExplorer.Application")

请问可有IE的下载的VBA参考方法吗?或者我应该用哪个对象去做呢?不用图形界面。
zzhikang
 
zzhikang 的头像
热心会员
 
资 料:
注册日期: Jun 2002
帖子: 5,351 声望值: 3
精华: 1,解答: 6
#6 旧 2011-12-13, 14:38:22 默认
zzhikang 当前离线  

在IE的对象里,获取下载地址后,用 URLDownloadToFile api下载,仍然是相同问题。
edwardj
 
edwardj 的头像
超级会员
 
资 料:
注册日期: Nov 2001
帖子: 1,745 声望值: 3
精华: 1,解答: 3
#7 旧 2011-12-13, 14:46:19 默认
edwardj 当前离线  

引用:
作者: zzhikang 查看帖子
谢谢提醒,可能问题就出在这个地方,我登录时用的是IE的方法:
CreateObject("InternetExplorer.Application")

请问可有IE的下载的VBA参考方法吗?或者我应该用哪个对象去做呢?不用图形界面。
那就用 HTTPREQ 的 POST 先登录。

代码:
dim sLogin as string
call oReq.open("POST", "YOUR_URL", false)
sLogin = "YOUR_POST_DATA"   'POST 的内容可以抓包看,如用 fiddler 抓
call oReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
call oReq.setRequestHeader("Content-length", Len(sLogin))
call oReq.setRequestHeader("Connection", "close")
call oReq.Send(sLogin)
zzhikang
 
zzhikang 的头像
热心会员
 
资 料:
注册日期: Jun 2002
帖子: 5,351 声望值: 3
精华: 1,解答: 6
#8 旧 2011-12-13, 15:34:47 默认
zzhikang 当前离线  

引用:
作者: edwardj 查看帖子
那就用 HTTPREQ 的 POST 先登录。

[code]
dim sLogin as string
call oReq.open("POST", "YOUR_URL", false)
sLogin = "YOUR_POST_DATA" 'POST 的......

请问 有能和InternetExplorer.Application共存的下载方法吗?
因为下载地址是动态生成的,也就是下载地址的组成有部分用到了sessionid。
目前我是通过InternetExplorer.Application对象 执行 javascript才能获取这个sessionid,如果改成Microsoft.XMLHTTP后,好像没办法动态获取sessionid啊
edwardj
 
edwardj 的头像
超级会员
 
资 料:
注册日期: Nov 2001
帖子: 1,745 声望值: 3
精华: 1,解答: 3
#9 旧 2011-12-13, 16:51:46 默认
edwardj 当前离线  

引用:
作者: zzhikang 查看帖子
请问 有能和InternetExplorer.Application共存的下载方法吗?
因为下载地址是动态生成的,也就是下载地址的组成有部分用到了sessionid。
目前我是通过InternetExplorer.Application对象 执行 javascript才能获取这个sessionid,如果改成Micros......
你可以尝试着自行解析,也就是用 VBA 写并跑一遍那段 JS code。或者用 fiddler 之类看看在 login 的时候,服务器返回的 http 头里面有木有你想要的 sid,或是 sid 相关的东西。如果有的话,可以通过 HttpReq 的 getResponseHeader 方法取出来, 如 oReq.getResponseHeader("Content-Length")

IE 对象的下载很不好控制,他弹出的那个另存为的对话框,好像木有太好的方法消除。偶试过用 AutoIt 的 ocx 版来自动点击按钮,输入文件名并保存,也不是很稳定。而用 XML HttpReq 木有这个问题,建个 Adodb.Stream 就可以把 responseBody 保存为你想要的文件了
hdbb2000
 
hdbb2000 的头像
支柱会员
 
资 料:
注册日期: Aug 2002
帖子: 6,898 声望值: 3
精华: 0
#10 旧 2011-12-14, 15:28:05 默认
hdbb2000 当前离线  

插句问一下,这样MSXML get回来的html文件有没有办法转换成xml格式来做后续处理的?
目前我是用正则来做,感觉挺麻烦的。
edwardj
 
edwardj 的头像
超级会员
 
资 料:
注册日期: Nov 2001
帖子: 1,745 声望值: 3
精华: 1,解答: 3
#11 旧 2011-12-14, 16:42:34 默认
edwardj 当前离线  

引用:
作者: hdbb2000 查看帖子
插句问一下,这样MSXML get回来的html文件有没有办法转换成xml格式来做后续处理的?
目前我是用正则来做,感觉挺麻烦的。
服务器返回啥就是啥。
zzhikang
 
zzhikang 的头像
热心会员
 
资 料:
注册日期: Jun 2002
帖子: 5,351 声望值: 3
精华: 1,解答: 6
#12 旧 2011-12-15, 09:58:51 默认
zzhikang 当前离线  

以前用 CreateObject("InternetExplorer.Application")对象时,
只要一个语句“.Navigate url”就会自动走到登录界面弹出来为止,所有http响应都是自动进行的。
但是用MSXML2.XMLHTTP时,每一个httprequest包都要写程序去做,似乎要好大一段程序啊。
(通过fiddler抓包,在输入网址到登录窗口自动弹出来,期间有N个http包交互啊).

有没有办法在MSXML2.XMLHTTP发起第一个httprequest后,在登录界面弹出前,期间的交互都自动完成啊?

此帖于 2011-12-15 10:03:28 被 zzhikang 编辑. .
edwardj
 
edwardj 的头像
超级会员
 
资 料:
注册日期: Nov 2001
帖子: 1,745 声望值: 3
精华: 1,解答: 3
#13 旧 2011-12-15, 10:58:45 默认
edwardj 当前离线  

引用:
作者: zzhikang 查看帖子
以前用 CreateObject("InternetExplorer.Application")对象时,只要一个语句“.Navigate url”就会自动走到登录界面弹出来为止,所有http响应都是自动进行的。但是用MSXML2.XMLHTTP时,每一个httprequest包都要写程序去做,似乎要......
基本上,只能自己处理。

不过,一般取得页面就行了,很多都是背景数据,比如图片之类的,不需要的。抓到登录页面就行。



额,你直接 post 一个登录信息给他看看。被你绕糊涂了。
发表新主题 关闭主题

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 05:29:42.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号