建议lz用Zend_Http,操作起来比较方便以下是手册
http://framework.zend.com/manual/zh/zend.http.html

解决方案 »

  1.   

    楼主可以下载个监视的软件,自己像操作网页那样,提交一次表单,然后截取那个请求,看看请求的真实样子,按照这个样子创建一个HTTP头。
      

  2.   


    我下载了一个软件叫:HTTP Analyzer V2, 能偷看POST出去的数据,对解决本题目是否有帮助,正在研究中,不过首先要感谢777!
      

  3.   

    经过用 HTTP Analyzer V2 的分析,POST的数据包含一个名叫ASP.NET_SessionId的Cookie和在界面是隐藏属性的几十k大小的文本。<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="很大">
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="很大">所以写了如下的分析文件,模仿在浏览器输入网址,然后点击表中的view按钮:
    <?php
    $data="";  // 保存各参数组合
    $html_1="";  // 返回的网页保存于此
    $fp = fsockopen("info.vcbs.com.vn", 80, $errno, $errstr);
    if ($fp)
    {
    $write = "GET /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1\r\n";
    $write .= "Host: info.vcbs.com.vn\r\n";
    $write .= "Connection: Close\r\n\r\n";
    fwrite($fp, $write);
    while(!feof($fp))
    {
    $html_1 .= fgets($fp, 128);
    }
    fclose($fp);
    }
    // 上述的代码是获取默认状态下(即今天)的网页
    $str="ASP.NET_SessionId=";  // 取cookie的关键词
    $cookie_str="Cookie: ".$str;  // 组成cookie字符串,供后面使用
    $html_2=strchr($html_1,$str);  // 扫描ASP.NET_SessionId=关键词
    $pos=strpos($html_2,';');  // 扫描结束符
    $len=strlen($str);  // 得到长度
    $cookie_str.=substr($html_2,$len,$pos-$len);  // 组成cookie字符串,供后面使用
    echo "[".$cookie_str."]<br>";  // 输出这句cookie
    //
    $data = "__EVENTTARGET=&__EVENTARGUMENT=&";  // 两个空的参数
    $str = "__VIEWSTATE";  // 扫描这个关键词
    $data .= $str."=";  // 将关键词合并到参数中
    $html_2=strchr($html_1,$str);  // 扫描关键词
    $str = 'value="';  // 再次扫描关键词后的value=字样
    $html_1=strchr($html_2,$str);  // html_1,html_2轮流使用,缩小长度
    $html_2=substr($html_1,strlen($str));  // 去掉关键词后的字符串
    $pos=strpos($html_2,'"');  // 找到value的结尾
    $data .= substr($html_2,0,$pos);  // 找到__VIEWSTATE的值
    $data .= "&ctl00\$Header1\$keywords=";
    $data .= "&ctl00\$PageContent\$ToDay=20&ctl00\$PageContent\$ToMonth=1&ctl00\$PageContent\$ToYear=2009";
    $data .= "&ctl00\$PageContent\$Button1=View&ctl00\$Header1\$keywords=";
    $str = "__EVENTVALIDATION";  // 后面是寻找____EVENTVALIDATION的值
    $html_1=strchr($html_2,$str);
    $str = 'value="';
    $html_2=strchr($html_1,$str);
    $html_1=substr($html_2,strlen($str));
    $pos=strpos($html_1,'"');
    $data .= substr($html_1,0,$pos);
    $data .= "\r\n\r\n";   // 参数值结束
    $fp = fsockopen("info.vcbs.com.vn", 80, $errno, $errstr);
    $html_1=""; // 网页清空,准备接收新网页
    if ($fp)
    {
    $write = "POST /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1\r\n";
    $write .= "Host: info.vcbs.com.vn\r\n";
    $write .= "Content-Type:application/x-www-form-urlencoded\r\n";
    $write .= "Referer: http://info.vcbs.com.vn/English/MarketInformation/StockQuotesBySession.aspx\r\n";
    $write .= "Content-Length:".strlen($data)."\r\n";
    $write .= $cookie_str."\r\n";
    $write .= "Connection: Close\r\n\r\n";
    $write .= $data;
    fwrite($fp, $write);
    while(!feof($fp))
    {
    $html_1 .= fgets($fp, 128);
    }
    fclose($fp);
    }
    echo $html_1;  // 输出后面得到的网页
    ?>
    但是运行后还是被跳转了,请教高手!
      

  4.   

    楼主有没有看看PHP发送的HTTP请求与正常操作的是否相同??
      

  5.   


    我是将php文件上载到服务器上执行的,所以看不到自己POST出去的数据,应该在自己本机装一个PHP解释器,通过localhost运行上面的文件。
      

  6.   

    请问一下777:为什么我只能使用Connection: Close\r\n\r\n据说可以使用Connection: Keep Alive\r\n\r\n,但是如果我的网页这么写,读取网页一直不结束,不知道什么原因?
      

  7.   

    Connection: Keep-Alive\r\n\r\n中间有一杠
      

  8.   

    $write .= "POST /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1\r\n";$write .= "Host: info.vcbs.com.vn\r\n";$write .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3\r\n";$write .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";$write .= "Accept-Language: zh-cn,zh;q=0.5\r\n";$write .= "Accept-Encoding: gzip,deflate\r\n";$write .= "Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7\r\n";$write .= "Keep-Alive: 300\r\n";$write .= "Connection: keep-alive\r\n";$write .= "Referer: http://info.vcbs.com.vn/English/MarketInformation/StockQuotesBySession.aspx\r\n";$write .= "Cookie: __utma=245029981.1371710382874126600.1232906884.1232906884.1232906884.1; __utmz=245029981.1232906884.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ASP.NET_SessionId=b5r4cjjy2nkf5455hsnvxt45\r\n";$write .= "Content-Type: application/x-www-form-urlencoded\r\n";$write .= "Content-Length: 45083\r\n\r\n";
      

  9.   

    这是我通过firefox的一个组件获取的头部信息的字符串(,经过测试,是可以正常获取网页内容的,它的POST参数有些长,也可能很多用不上,但是太长了,没法发上来,我想你获取失败的原因应该是http协议要求的有些参数没有传过去,希望对你有所帮助。
      

  10.   

    关键点应该是这个:$write .= "Cookie: __utma=245029981.1371710382874126600.1232906884.1232906884.1232906884.1; __utmz=245029981.1232906884.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ASP.NET_SessionId=b5r4cjjy2nkf5455hsnvxt45\r\n"; 并且是动态的,要通过第一次的访问结果提取。
      

  11.   


    看来还要模拟第一次访问的结果,提取Cookie,然后再发一次请求,发送刚获取的Cookie值,才可以模拟。
      

  12.   

    可能是记录密码和用户名的吧,像Discuz那种登录机制。
      

  13.   

    1、在浏览器直接输入:
    http://info.vcbs.com.vn/English/MarketInformation/StockQuotesBySession.aspx 
    通过Http analyzer 监测得到如下的头:(Request-Line):GET /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1
    Accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Accept-Language:zh-cn
    UA-CPU:x86
    Accept-Encoding:gzip, deflate
    User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host:info.vcbs.com.vn
    Connection:Keep-Alive2、Cookie只有一个:ASP.NET_SessionId  ok3aqirmsvg52k55hm3lry45 3、楼上看到的cookie: __utmb=17226283, 好像这是CSDN的cookie4、通过网页修改日期,点击view后,检查头的结果是:(Request-Line):POST /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1
    Accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Referer:http://info.vcbs.com.vn/English/MarketInformation/StockQuotesBySession.aspx
    Accept-Language:zh-cn
    Content-Type:application/x-www-form-urlencoded
    UA-CPU:x86
    Accept-Encoding:gzip, deflate
    User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host:info.vcbs.com.vn
    Content-Length:45083
    Connection:Keep-Alive
    Cache-Control:no-cache
    Cookie:ASP.NET_SessionId=ok3aqirmsvg52k55hm3lry455、检查POST的数据:__EVENTTARGET=
    __EVENTARGUMENT=
    __VIEWSTATE=/wEPDwUJMjA0ODM2NDAzD2QWAmYPZBYCAgMPZBYEAgEPZBYYAgUPDxYCHgRUZXh0BQQxOTYwZGQCBw8PFgIfAAUJMS8yMy8yMDA5ZGQCCQ8PFgIfAAUGMzAzLjIxZGQCCw8PFgIfAAVBIDxmb250IGNvbG9yPSMwMDAwRkY+JiM5NjUwPC9mb250Pjxmb250IGNvbG9yPSMwMDAwRkY+Mi4wOTwvZm9udD5kZAINDw8WAh8ABSIgPGZvbnQgY29s...
    ctl00$Header1$keywords=
    ctl00$PageContent$ToDay=26
    ctl00$PageContent$ToMonth=1
    ctl00$PageContent$ToYear=2009
    ctl00$PageContent$Button1=View
    __EVENTVALIDATION=/wEWOgLg7qzjBQKk4KTTBAKttMKDAwKX74GzBwLQnfbWBALRnfbWBALSnfbWBALTnfbWBALUnfbWBALVnfbWBALWnfbWBALHnfbWBALInfbWBALQnbbVBALQnbrVBALQnb7VBALQnYLVBALQnYbVBALQnYrVBALQnY7VBALQnZLVBALQndbWBALQndrWBALRnbbVBALRnbrVBALRnb7VBALRnYLVBALRnYbVBALRnYrVBALRnY7VBALRnZLVBALR...整个POST过去的数据应该是45083大小,上面的复制已经截断了。
      

  14.   

    __VIEWSTATE__EVENTVALIDATION
    这两个参数是很大的。
    有意思,一定要啃下这个网页!
      

  15.   

    好像问题在于:在很大的数据中存在加号,如果从表单里面,可以把加号post过去,但是自己填头部是,加号会当作空格处理。不知道谁能解决这个问题?
      

  16.   

    以下代码可以使用,要点就是将+改成%2B,同时还有几个小错误,仅供参考:
    <?php$data="";  // 保存各参数组合
    $html_1="";  // 返回的网页保存于此
    $fp = fsockopen("info.vcbs.com.vn", 80, $errno, $errstr);
    if ($fp)
    {
    $write = "GET /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1\r\n";
    $write .= "Host: info.vcbs.com.vn\r\n";
    $write .= "Connection: Close\r\n\r\n";
    fwrite($fp, $write);
    while(!feof($fp))
    {
    $html_1 .= fgets($fp, 128);
    }
    fclose($fp);
    }
    // 上述的代码是获取默认状态下(即今天)的网页
    $str="ASP.NET_SessionId=";  // 取cookie的关键词
    $cookie_str="Cookie: ".$str;  // 组成cookie字符串,供后面使用
    $html_2=strchr($html_1,$str);  // 扫描ASP.NET_SessionId=关键词
    $pos=strpos($html_2,';');  // 扫描结束符
    $len=strlen($str);  // 得到长度
    $cookie_str.=substr($html_2,$len,$pos-$len);  // 组成cookie字符串,供后面使用
    //echo "[".$cookie_str."]<br>";  // 输出这句cookie
    //
    $data = "__EVENTTARGET=&__EVENTARGUMENT=&";  // 两个空的参数
    $str = "__VIEWSTATE";  // 扫描这个关键词
    $data .= $str."=";  // 将关键词合并到参数中
    $html_2=strchr($html_1,$str);  // 扫描关键词
    $str = 'value="';  // 再次扫描关键词后的value=字样
    $html_1=strchr($html_2,$str);  // html_1,html_2轮流使用,缩小长度
    $html_2=substr($html_1,strlen($str));  // 去掉关键词后的字符串
    $pos=strpos($html_2,'"');  // 找到value的结尾
    //echo "[len1=".$pos."]<br>";  // 输出这句cookie
    $str=str_replace('+','%2B',substr($html_2,0,$pos));  // 将加号换成 %2B
    $data .= $str;  // 找到__VIEWSTATE的值
    $data .= "&ctl00\$Header1\$keywords=";
    $data .= "&ctl00\$PageContent\$ToDay=20&ctl00\$PageContent\$ToMonth=1&ctl00\$PageContent\$ToYear=2009";
    $data .= "&ctl00\$PageContent\$Button1=View&";
    $str = "__EVENTVALIDATION";  // 后面是寻找____EVENTVALIDATION的值
    $data .= $str."=";
    $html_1=strchr($html_2,$str);
    $str = 'value="';
    $html_2=strchr($html_1,$str);
    $html_1=substr($html_2,strlen($str));
    $pos=strpos($html_1,'"');
    //echo "[len2=".$pos."]<br>";  // 输出这句cookie
    $str=str_replace('+','%2B',substr($html_1,0,$pos));  // 将加号换成 %2B
    $data .= $str;
    $data .= "\r\n\r\n";   // 参数值结束
    //echo "[".strlen($data)."]<br>";  // 输出这句cookie$fp = fsockopen("info.vcbs.com.vn", 80, $errno, $errstr);
    $html_1=""; // 网页清空,准备接收新网页
    if ($fp)
    {
    $write = "POST /English/MarketInformation/StockQuotesBySession.aspx HTTP/1.1\r\n";
    $write .= "Host: info.vcbs.com.vn\r\n";
    $write .= "Content-Type:application/x-www-form-urlencoded\r\n";
    $write .= "Referer: http://info.vcbs.com.vn/English/MarketInformation/StockQuotesBySession.aspx\r\n";
    $write .= "Content-Length:".strlen($data)."\r\n";
    $write .= $cookie_str."\r\n";
    $write .= "Connection: Close\r\n\r\n";
    $write .= $data;
    fwrite($fp, $write);
    while(!feof($fp))
    {
    $html_1 .= fgets($fp, 128);
    }
    fclose($fp);
    }
    echo $html_1;  // 输出后面得到的网页
    ?>
      

  17.   

    最简单的 ASP.NET 网页
    只有几个主要参数,其它都是.NET自动加上去的用curl , HTTP_Client 之类的都可以很容易取得
    完全没反复制代码可以说是抽取难度最低的网页之一
      

  18.   

    核心就是这个函数:
    $fp = fsockopen("info.vcbs.com.vn", 80, $errno, $errstr);
    好好查查用法。
      

  19.   

    这个一个asp.net的webform,你注意一下form里的hidden类型的input,这几个在asp.net处理webform时会用到,如果这些字段的验证通不过,就会出现页面不能正常访问的