如何用BCB向一个网站自动Post后,取到返回的html内容?
有一个据考试证号查小孩考试成绩的网站,
http://www.url.com/scorecx.asp, 手工输入证号参数后,点查询按钮,
它提交(Post)到(action="http://www.url.com/xscloginscore.asp")
后,自动返回http://www.url.com/xscuserloginscore.asp页面,
可看到姓名、成绩,这一切都是手动输入的!
我现在想取得所有学生的分数(已知道证号是连续范围),
想让程序自动提交证号,再从返回的页面中析取得成绩。
我已将提交的页面 http://www.url.com/scorecx.asp 保存到本机文件中:
C:\chaFS\chaFS.htm 并用文一编辑器将证号填入其中,
在IE中显示c:\chaFS\chaFS.htm,人工点"发送"(POST),
就能返回查询的分数结果;现在我的要求是,:
1. 如何自动POST c:\chaFS\chaFS.htm
2. 取得返回的: http://www.url.com/xscuserloginscore.asp内容
只要这两步,求助!!!!!
问题点数:100、回复次数:23Top
1 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-06-18 21:07:29 得分 0
提交的页面及返回的页面URL不一样,用TNMHTTP看样子不行,
可能要用CppWebBrowser,我并没用用过此控件,求助!
Top
2 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-06-18 21:53:00 得分 0
1.自动POST:
ccrun(老妖)(www.ccrun.com) :
取得该页面的IHTMLDocument2接口,然后通过get_forms和item方法取得表单,通过 IHTMLFormElement接口的的submit方法进行提交。
2。取返回新窗口中的HTML
http://community.csdn.net/Expert/topic/4335/4335257.xml?temp=.995434
非得老妖解决了
Top
3 楼ccrun(老妖)(www.ccrun.com)回复于 2006-06-19 00:08:48 得分 0
BCB老大也问问题啊?呵呵。
一般网页通过Form提交数据都可以直接以参数的形式来实现,比如:
www.url.com/scorecx.asp页面中有一个Form,Action是http://www.url.com/xscuserloginscore.asp,假设Form中有个<input type="text" name="StudentID" size="20">是用来填写学生的证件号,现在要获取证件号为123456的学生的成绩,那么可以直接访问http://www.url.com/xscuserloginscore.asp?StudentID=123456这个地址。这样的话呢,就可以不用CppWebBrowser,直接用Socket API或TNMHTTP组件,接收到服务器返回的内容以后,再通过IHTMLDocument2接口分析网页内容,找到显示成绩的元素索引或ID什么的,就可以通用了。
Top
4 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-06-19 12:44:27 得分 0
呵呵,老妖出山就有希望!
问题是用的是Post,不是Get,这下面是你在别的贴子中的留言:
取得该页面的IHTMLDocument2接口,然后通过get_forms和item方法取得表单,通过 IHTMLFormElement接口的的submit方法进行提交。
具体怎做呢?
Top
5 楼jcsun(超)回复于 2006-08-17 14:20:13 得分 0
请参见BCB自带的例子:
C:\Program Files\Borland\CBuilder6\Examples\FastNet\HTTPTop
6 楼revulet(云飞扬)回复于 2006-09-04 22:56:33 得分 0
使用indy idhttp应该很容易实现Top
7 楼netliuming(你有安全感吗?)回复于 2006-09-05 10:02:40 得分 0
确实使用indy idhttp很易实现。Top
8 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-09-05 10:27:03 得分 100
#include <Mshtml.h>
AnsiString __fastcall TForm3::Submit(void)
{
IHTMLDocument2 *pHTMLDoc = NULL;
LPDISPATCH pDisp = NULL;
pDisp =CppWebBrowser1->Document;
if(pDisp)
{
if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDoc)))
{
pDisp->Release();
IHTMLElementCollection *pelement;
if(pHTMLDoc->get_forms(&pelement)!=S_OK)
{
pHTMLDoc->Release();
pDisp->Release();
pelement->Release();
return "1发送失败";
}
pDisp->Release();
tagVARIANT a,i;
a.vt=VT_UI4;
a.lVal=0;//这个值为你所要填写的表单在整个网页中的顺序,0为第一个表单
if(pelement->item(a,i,&pDisp)!=S_OK)
{
pelement->Release();
pDisp->Release();
return "2发送失败";
}
pelement->Release();
IHTMLFormElement* pFormElem=NULL;
if(pDisp)
{
if(!SUCCEEDED(pDisp->QueryInterface(IID_IHTMLFormElement,(LPVOID*)&pFormElem)))
{
pFormElem->Release();
pDisp->Release();
return "3发送失败";
}
}
else
{
return "31发送失败";
}
pDisp->Release();
LPDISPATCH pDisp_msg = NULL;
tagVARIANT phone,msg,empty;
phone.vt=VT_UI4;
phone.lVal=0;//这个值为Input框在表单中的顺序
msg.vt=VT_UI4;
msg.lVal=1;//这个值为Text文本框在表单中的顺序
if((pFormElem->item(phone,empty,&pDisp)!=S_OK)||(pFormElem->item(msg,empty,&pDisp_msg)!=S_OK))
{
pFormElem->Release();
if(pDisp)
pDisp->Release();
if(pDisp_msg)
pDisp_msg->Release();
return "4发送失败";
}
IHTMLInputTextElement* phoneElem=NULL;
IHTMLTextAreaElement* msgElem;
if(!pDisp||!pDisp_msg)
return "11失败";
if (!SUCCEEDED(pDisp->QueryInterface(IID_IHTMLInputTextElement, (void**)&phoneElem))||(!SUCCEEDED(pDisp_msg->QueryInterface(IID_IHTMLTextAreaElement, (void**)&msgElem))))
{
if(phoneElem)
phoneElem->Release();
if(msgElem)
msgElem->Release();
if(pDisp)
pDisp->Release();
if(pDisp_msg)
pDisp_msg->Release();
return "5发送失败";
}
WideString s_phone,s_msg;
s_phone="888888"
s_msg="你好";
phoneElem->put_value(s_phone.c_bstr());//填写
msgElem->put_value(s_msg.c_bstr());//填写
pFormElem->submit();//提交
phoneElem->Release();
msgElem->Release();
pDisp->Release();
pDisp_msg->Release();
pFormElem->Release();
return "发送成功";
}
}
return "发送失败";
}Top
9 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-09-05 17:02:27 得分 0
呵呵,我以为这个贴子已无人解决,
我来看看,首先表示感谢!Top
10 楼truelove7283159(大头娃娃http://traversite.blog.sohu.com)回复于 2006-09-05 20:59:42 得分 0
首先学习一下Top
11 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-09-06 13:27:22 得分 0
大家也邦我试试,Top
12 楼daydayup234(关中刀客)回复于 2006-09-06 16:41:01 得分 0
蒋老大的代码怎样应用在
http://passport.csdn.net/UserLogin.aspx
只post
出错
Top
13 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-09-06 22:57:13 得分 0
CSDN那个有图片验证码的……Top
14 楼yhec(@_@ 俺是贫农俺怕谁)回复于 2006-09-07 08:22:11 得分 0
http://dev.csdn.net/develop/article/16/16129.shtmTop
15 楼daydayup234(关中刀客)回复于 2006-09-07 10:48:51 得分 0
TO jiangsheng(蒋晟.Net[MVP])
-------------------------------------------
Submit(void)针对
http://www.url.com/scorecx.asp如何用
如何改?
Top
16 楼wanglovec(阳光飞舞)回复于 2006-09-07 10:53:38 得分 0
呵呵, 这么多高手都来了.我原来用VB写了一个 .(网上抓取数据 写入数据库中)窃 楼主应该先分析 网页
希望高手们不要BS 呵呵Top
17 楼daydayup234(关中刀客)回复于 2006-09-07 11:00:10 得分 0
TO yhec
-------------------------------------------
WebPostData(CppWebBrowser1,"http://www.baidu.com/","太阳");
这个错
这个目标怎么调用WebPostData?Top
18 楼sncel(地狱情人-杨勇)回复于 2006-09-08 10:59:33 得分 0
留下mail,给你个http访问类,不用这些组件操作.Top
19 楼scsjs(闪电回归)回复于 2006-09-08 11:29:34 得分 0
IHTMLDocument2 接口,很煩人的說.
至少30行以上的代碼
更傾向與用 javascript 方法來實現. 一行就可以直接post了Top
20 楼wfhlxl(光明正大地偷......学)回复于 2006-09-08 11:33:51 得分 0
TIdHTTP 这个一定能行的
this->IdHTTP1->Post("");Top
21 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-09-22 16:40:39 得分 0
to 蒋老大
没有一点解释或注解,不知怎样用?Top
22 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2006-10-29 19:57:12 得分 0
蒋老大的这段代码到现在才明白一点,马上要总结一下Top
23 楼zxjrainbow(小笨象)回复于 2006-10-30 10:03:23 得分 0
这段代码,貌似以前看过。Top




