500分求解超难问题,能成功外理的再开4个贴给分
现有一.net做的网站,它是用__doPostBack做分页的,我通过一个程序,能访到到它的第一个页面如
http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9
我现在要访问他的第二个页面(远程程序访问,一般网站都有一个page参数如page=2)因为其分页是用__dopostback做的,url参数完全一样,我怎么样才能访问到他的第二页(程序自动访问,不是手动翻页,因为要从该网站获取数据是通过URL进行的,该地址第一页/第二页/__等等URL地址完全一样,故程序没法执行)?高手指点一下
问题点数:100、回复次数:34Top
1 楼lovelxj(伊斯人,吾谁与归)回复于 2005-09-06 10:37:48 得分 0
哈哈 看起来复杂 ,
难道要模拟点击么?
帮UPTop
2 楼iloveyour(爱老虎油)回复于 2005-09-06 10:43:58 得分 0
.net里面__dopostback的参数是存在一个名叫__VIEWSTATE的隐藏文本框中,如果不嫌麻烦可以用BASE64解码得到里面的内容,并不是如你上面所说的以URL参数来传递Top
3 楼brando_beat(Eの懒龙)回复于 2005-09-06 12:24:31 得分 0
不可以用模拟点击、会被当成病毒的、哈哈。
但是问题还没有看懂。Top
4 楼cuike519(I will be back!)回复于 2005-09-06 13:17:11 得分 0
你可以使用HttpSniffer这样的软件查看一下每次请求时的内容,这样你便可以模拟出来发送同样的请求到服务器上。Top
5 楼ccwq(Wind Love Rove Forever)回复于 2005-09-06 13:21:34 得分 0
呵呵,有意思,留个手印!!Top
6 楼xiaojiao52()回复于 2005-09-06 13:34:17 得分 0
楼主说的问题让人看不太懂Top
7 楼eyych(2006)回复于 2005-09-06 13:41:51 得分 0
upTop
8 楼sfwxw0456(全职杀手)回复于 2005-09-06 13:51:15 得分 0
帮顶!Top
9 楼jinjazz(近身剪)回复于 2005-09-06 13:54:46 得分 0
没用过Top
10 楼jamex(1 + 1 = 爱)回复于 2005-09-06 13:59:20 得分 0
Option Explicit
Dim Doc As MSHTML.HTMLDocument
Dim flag As Boolean
Private Sub Command1_Click()
flag = False
WebBrowser1.Navigate2 Text1.Text
End Sub
Private Sub Command2_Click()
Dim f As Object
Dim i As Integer
For i = 1 To 3
Set Doc = WebBrowser1.document
Set f = Doc.All("Form1")
flag = False
f.All("__EVENTTARGET").Value = "dgrdResultados1$_ctl54$_ctl" + CStr(i)
f.All("__EVENTARGUMENT").Value = ""
Debug.Print i
Debug.Print f.All("__EVENTTARGET").Value
Debug.Print f.All("__EVENTARGUMENT").Value
Call f.submit
While flag = False
DoEvents
Wend
Next
End Sub
Private Sub Form_Load()
ctl = "dgrdResultados1$_ctl54$_ctl"
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
flag = True
MsgBox "ok"
End Sub
Top
11 楼adandelion(水源是CSDN最黑的地方,但这个最黑是CSDN一手制造的!)回复于 2005-09-06 14:37:39 得分 0
UPTop
12 楼jamex(1 + 1 = 爱)回复于 2005-09-06 14:45:00 得分 0
我用vb6写的,花了我2个小时,这是修正版,你试试看,给我500分吧!呵呵
Option Explicit
Dim Doc As MSHTML.HTMLDocument
Dim script As MSHTML.HTMLWindow2
Dim ctl As String
Dim flag As Boolean
Private Sub Command1_Click()
flag = False
WebBrowser1.Navigate2 "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9
End Sub"
Private Sub Command2_Click()
Dim f As Object
Dim i As Integer
For i = 1 To 4 '这里轮询4页,你可以修改它
flag = False
Call WebBrowser1.document.parentWindow.execScript("__doPostBack('dgrdResultados1$_ctl54$_ctl" & CStr(i) & "', '')", "javascript")
Debug.Print i
While flag = False
DoEvents
Wend
Next
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
flag = True
MsgBox "ok"
End SubTop
13 楼jamex(1 + 1 = 爱)回复于 2005-09-06 14:46:44 得分 0
Option Explicit
Dim Doc As MSHTML.HTMLDocument
Dim script As MSHTML.HTMLWindow2
Dim ctl As String
Dim flag As Boolean
Private Sub Command1_Click()
flag = False
WebBrowser1.Navigate2 "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9"
End Sub
Private Sub Command2_Click()
Dim f As Object
Dim i As Integer
For i = 1 To 4 '这里轮询4页,你可以修改它
flag = False
Call WebBrowser1.document.parentWindow.execScript("__doPostBack('dgrdResultados1$_ctl54$_ctl" & CStr(i) & "', '')", "javascript")
Debug.Print i
While flag = False
DoEvents
Wend
Next
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
flag = True
MsgBox "ok"
End Sub
Top
14 楼flcandclf(怪手大分)回复于 2005-09-06 14:49:14 得分 0
看不懂Top
15 楼coldpanth(^War3^)回复于 2005-09-06 14:53:56 得分 0
Url不变,页码就应该是Post过去的.Top
16 楼jamex(1 + 1 = 爱)回复于 2005-09-06 15:01:03 得分 0
看不懂,试一下就知道了Top
17 楼wxq4100798(aa)回复于 2005-09-06 16:52:50 得分 0
to jamex(1 + 1 = 爱) 你是用WebBrowser模拟的啊?我本身的意思是不用手功点击,程序运行完一页之后,自动跳转到下面一读取运行Top
18 楼leisang(仰望深邃的星空)回复于 2005-09-06 17:08:37 得分 0
楼主的问题本身就有问题,用postback写的根本不适合用url传送
用 jamex(1 + 1 = 爱) 的方法也可以Top
19 楼dbserver(寻找完美的自我)回复于 2005-09-06 17:29:51 得分 0
帮楼主顶!
---------------
欢迊来到麦高网-私活兼职首选平台 www.mgao.netTop
20 楼tmfc()回复于 2005-09-06 17:51:24 得分 0
不模拟postback看来是不行了,手动改viewstate似乎是行不通的,那个结构还是比较复杂的,而且有放篡改措施.Top
21 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-09-06 18:31:38 得分 0
你就模拟_doPostBack进行HTTP Post咯,需要Post的数据其实比复杂的Form直接Submit还要简单呢,你把__VIEWSTATE等3个hidden的input模拟上对应的内容就可以了。Top
22 楼wxq4100798(aa)回复于 2005-09-06 20:19:50 得分 0
cat_hsfz ,兄弟能告诉我怎么模拟吗?偶不会搞啊,如果不在.net环境下,如asp下面,可以模拟吗?Top
23 楼jamex(1 + 1 = 爱)回复于 2005-09-06 21:11:47 得分 0
to wxq4100798(aa) :
这程序是自动执行的,程序运行完一页之后,它会自动跳转到下面一读取运行
一般的话,做网站机器人程序,都着这么做的。
或者也可用Inet控件,原理是一样的Top
24 楼jamex(1 + 1 = 爱)回复于 2005-09-06 21:13:09 得分 0
对了,执行时,可以将 MsgBox "ok" 这句话 去掉,我调试用的Top
25 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-09-06 23:36:29 得分 0
其实我不明白“我现在要访问他的第二个页面”是什么意思?你是用HttpWebRequest去抓取别人的网页,还是在你自己的网页上要进行某种操作?Top
26 楼rlqiang((不留)戒烟买房中。。。)回复于 2005-09-07 00:12:26 得分 0
我看明白了,不过不会。好问题,帮顶。Top
27 楼fletcher(fletcherx)回复于 2005-09-07 08:56:48 得分 0
upTop
28 楼wf5360308(冷月孤峰)回复于 2005-09-07 09:17:03 得分 0
帮顶一下,这个问题没有研究过。呵呵Top
29 楼lwx2523(林飞)回复于 2005-09-07 09:28:30 得分 0
UPTop
30 楼wxq4100798(aa)回复于 2005-09-07 13:02:15 得分 0
to cat_hsfz()
我程序的本意思就是用HttpWebRequest去抓取他网站上我所需要的信息,我现在已经能成功地抓取到第一页我所需要的信息,现在我想抓取第二页(因为其网站的URL第一页和第二页一样,所以我没法抓到第二页)Top
31 楼pignut_wang(花生米)回复于 2005-09-07 13:23:36 得分 0
好问题,up一下
Top
32 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-09-08 13:37:41 得分 0
那你就把HttpWebRequest.Method改为POST,然后通过拼接字符串的形式把要提交的Form的数据(其实就是三个hidden,其他字段一律不管)组合起来,然后把该字符串encode到HttpWebRequest的Stream里面,大概思路就是这样。例子你可以看MSDN的:
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnethttpwebrequestclassgetrequeststreamtopic.htmTop
33 楼wxq4100798(aa)回复于 2005-09-08 16:06:41 得分 0
我自已写的php取数据方法,虽然页面是翻过去了,但是我程序本身取数据就根据url来的,有什么方法解闷吗
<?php
set_time_limit(0);
$url = "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9";
$file = file_get_contents($url);
//取__VIEWSTATE
if(preg_match_all("|__VIEWSTATE\'?\"?\s+value\s*=\s*\"?\"(.+?)\"|is",$file,$viewStates))
{
$viewState = $viewStates[1][0];
}
//取得总页数
$page = 1;
if(preg_match_all("|javascript:__doPostBack\(\'dgrdResultados1$_ctl54$_ctl(.+?)\',\'\'\)\"|is",$file,$pages))
{
echo "go 2222 ";
print_r($pages[1]);
}
for($page=0;$page<7;$page++)
{
if($page != 0)
{
$file = file_get_contents($url);//还是取得一样的结果啊
}
if(preg_match_all("|<tr\s+onClick\s*=\s*\"?\'?\s*submitar\(\s*\'?([0-9]+)\'?\s*[^)]+\)[^>]+>(.*?)</tr>|is",$file,$matches))
{
for($i=0;$i<count($matches[2]);$i++)
{
//echo $matches[2][$i];
if(preg_match_all("|<td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td>|is",$matches[2][$i],$match1))
{
for($j=0;$j<count($match1[1]);$j++)
{
$location = $match1[2][$j];
$type = $match1[3][$j];
$roomNum = $match1[4][$j];
$area = $match1[5][$j];
$plant = $match1[6][$j];
$price = $match1[7][$j];
$state = $match1[8][$j];
//写入数据库
echo $location;
echo " ";
echo $type;
echo " ";
echo $roomNum;
echo " ";
echo $area ;
echo " ";
echo $plant;
echo " ";
echo $price;
echo " ";
echo $state;
echo "<br><br>";
}
}
}
}
//自动提交到下一个页面? 怎么样取下一页的数据呢?
?>
<form name="Form1" action="<?=$url?>" method="post">
<input type="hidden" name="__EVENTTARGET" value="" >
<input type="hidden" name="__EVENTARGUMENT" value="">
<input type="hidden" name="__VIEWSTATE" value="<?=$viewState?>">
</form>
<script language="javascript" type="text/javascript">
<!--
eventTarget = "dgrdResultados1$_ctl54$_ctl"+"<?=$page?>";
var theform;
if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
theform = document.Form1;
}
else {
theform = document.forms["Form1"];
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
// -->
</script>
<?php
}
?>Top
34 楼jamex(1 + 1 = 爱)回复于 2005-09-08 20:43:09 得分 0
搂主做这个程序的目的是自动获取别人网站上的信息,还是其他别的用途?
如果是自动获取别人网站上的信息,可以换一种思路Top




