现有一.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地址完全一样,故程序没法执行)?高手指点一下

解决方案 »

  1.   

    .net里面__dopostback的参数是存在一个名叫__VIEWSTATE的隐藏文本框中,如果不嫌麻烦可以用BASE64解码得到里面的内容,并不是如你上面所说的以URL参数来传递
      

  2.   

    你可以使用HttpSniffer这样的软件查看一下每次请求时的内容,这样你便可以模拟出来发送同样的请求到服务器上。
      

  3.   

    Option Explicit
    Dim Doc As MSHTML.HTMLDocument
    Dim flag As Boolean
    Private Sub Command1_Click()
        flag = False
        WebBrowser1.Navigate2 Text1.Text
    End SubPrivate 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 SubPrivate Sub Form_Load()
        ctl = "dgrdResultados1$_ctl54$_ctl"
    End SubPrivate Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
       flag = True
       MsgBox "ok"
    End Sub
      

  4.   

    我用vb6写的,花了我2个小时,这是修正版,你试试看,给我500分吧!呵呵Option Explicit
    Dim Doc As MSHTML.HTMLDocument
    Dim script As MSHTML.HTMLWindow2
    Dim ctl As String
    Dim flag As BooleanPrivate 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 SubPrivate Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
       flag = True
       MsgBox "ok"
    End Sub
      

  5.   

    Option Explicit
    Dim Doc As MSHTML.HTMLDocument
    Dim script As MSHTML.HTMLWindow2
    Dim ctl As String
    Dim flag As BooleanPrivate 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 SubPrivate 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 SubPrivate Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
       flag = True
       MsgBox "ok"
    End Sub
      

  6.   

    Url不变,页码就应该是Post过去的.
      

  7.   

    to  jamex(1 + 1 = 爱) 你是用WebBrowser模拟的啊?我本身的意思是不用手功点击,程序运行完一页之后,自动跳转到下面一读取运行
      

  8.   

    楼主的问题本身就有问题,用postback写的根本不适合用url传送用 jamex(1 + 1 = 爱) 的方法也可以
      

  9.   

    帮楼主顶!---------------
    欢迊来到麦高网-私活兼职首选平台 www.mgao.net
      

  10.   

    不模拟postback看来是不行了,手动改viewstate似乎是行不通的,那个结构还是比较复杂的,而且有放篡改措施.
      

  11.   

    你就模拟_doPostBack进行HTTP Post咯,需要Post的数据其实比复杂的Form直接Submit还要简单呢,你把__VIEWSTATE等3个hidden的input模拟上对应的内容就可以了。
      

  12.   

    cat_hsfz ,兄弟能告诉我怎么模拟吗?偶不会搞啊,如果不在.net环境下,如asp下面,可以模拟吗?
      

  13.   

    to wxq4100798(aa) :这程序是自动执行的,程序运行完一页之后,它会自动跳转到下面一读取运行一般的话,做网站机器人程序,都着这么做的。或者也可用Inet控件,原理是一样的
      

  14.   

    对了,执行时,可以将 MsgBox "ok" 这句话 去掉,我调试用的
      

  15.   

    其实我不明白“我现在要访问他的第二个页面”是什么意思?你是用HttpWebRequest去抓取别人的网页,还是在你自己的网页上要进行某种操作?
      

  16.   

    to  cat_hsfz()  
       我程序的本意思就是用HttpWebRequest去抓取他网站上我所需要的信息,我现在已经能成功地抓取到第一页我所需要的信息,现在我想抓取第二页(因为其网站的URL第一页和第二页一样,所以我没法抓到第二页)
      

  17.   

    那你就把HttpWebRequest.Method改为POST,然后通过拼接字符串的形式把要提交的Form的数据(其实就是三个hidden,其他字段一律不管)组合起来,然后把该字符串encode到HttpWebRequest的Stream里面,大概思路就是这样。例子你可以看MSDN的:
    ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnethttpwebrequestclassgetrequeststreamtopic.htm
      

  18.   

    我自已写的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 "&nbsp;&nbsp;";
    echo $type;
    echo "&nbsp;&nbsp;";
    echo $roomNum;
    echo "&nbsp;&nbsp;";
    echo $area ;
    echo "&nbsp;&nbsp;";
    echo $plant;
    echo "&nbsp;&nbsp;";
    echo $price;
    echo "&nbsp;&nbsp;";
    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
    }
    ?>