愿闻其详,我没有接触过curl。是不是php的扩展功能,需手动打开的那个。请提供一个思路或者相似的使用例子。非常感谢。

解决方案 »

  1.   

    要抓的是一个动态网页(比如a.php)返回结果页,仍然叫a.php。这个抓取html源文件的目的,主要是为了分析,然后得出最新更新信息的详情。
      

  2.   

    $str = file_get_contents("url");
    preg_match("/<title>(.*?)<\/title>/",$str,$arrStr);
    var_dump($arrStr);
      

  3.   

    据说用Curl最好,但没用过
    用ajax也可,即xmlhttp,可以用post提交,但能否用session不清楚
    对于返回的html,可以用正则,
    也可用解析成DOM(不知道PHP可以不可以)
      

  4.   

    curl的一个简单用法<?php  
    $data = array('__EVENTTARGET'   => '',  
                  '__EVENTARGUMENT' => '',  
                  '__VIEWSTATE'     => 'dDwxNzYwNDY0MjA4O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDEzPjs+O2w8dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+PjtsPEltYWdlQnV0dG9uMTs+PvHJ+cz  7Hh6RMvGhVdpCm66xWrhx', 
                  'drpwnls1'        => '0',  
                  'txbNumber'       => '1501905056', 
                  'ImageButton1.x'    => '31', 
                  'ImageButton1.y'    => '6');  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL,'http://www.xxx.com/ZFGJJSearch.aspx?tabId=84&menuId=43');  
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,false);  
    echo curl_exec($ch);  
    curl_close($ch);  
    ?>$data为POST的数据
    首先curl_init返回一个curl的句柄
    接下来curl_setopt设置CURL的一些option...
    然后curl_exec返回结果 
    LZ这里就需要对结果进行正则匹配 正则怎么写就得根据内容了
    最后curl_close关闭curl句柄
      

  5.   

    要用curl的话需要PHP.INI的extention下打开php_curl.dll另外网上有些类也可以满足LZ的要求比如SNOOPY类具体可以google一下
      

  6.   

    提交以后,获取动态页面的html静态源文件,然后用正则搜索,匹配则抓取并存入数据库*****网上现成的类都不可能完全提供楼主的匹配要求,自己写吧
      

  7.   

    动态页面的意思是,要抓的是结果页。比如我提交一个表单,对方服务器回应并返回一些信息,然后给出一个结果页面。比如我提交报名信息,报名时间为7月与8月(checkbox),报名地点为北京和河北省(Checkbox)。提交往某个网址。(我这个是:http://toefl.etest.edu.cn/cn/SeatsQuery)然后会给我一个结果页面,但网址仍然是http://toefl.etest.edu.cn/cn/SeatsQuery。我需要抓的是给我的静态页面中的注册状态为“有名额”的行。并得到那行的机构名。正则我自己写没事,我需要知道的是怎么获取这个结果静态页面。    我用curl和snoopy试过。好像返回的页面都是提交的表单页。
      

  8.   

    所要提交的checkbox值是:  
     name=mvfAdminMonths   value=200707  value=200708
     name=mvfSiteProvinces value=Beijing value=Hebei提交完以后,需要得到结果页。问题的核心是:如何得到结果页的信息
      

  9.   

    用post!
    看表单的action="XXX.php"用get方式传递值即XXX.php?mvfAdminMonths=200707  
    如对方接收是post,则用post提交
      

  10.   

    问题不在于提交,而在于如何获取提交以后的查询结果。因为服务器端用的session,方法是POST,这些数据传递中间的过程是完全无法获取的。如果没有权限,比如只是普通浏览者的话,只能根据查询结果页来间接取得查询结果。当然我可以一整天坐在电脑前每隔15秒刷一次,但是这是无比痛苦的事。 
         所以我希望写个小程序,代替这个工作。php应该能实现,其实以前有个vb小程序可以用在雅思的报名上。但是托福的系统做得严密比较麻烦,而且有重重的防刷新机制,所以只能绕弯子,取结果静态页来获取最新消息。
      

  11.   

    你是不是没POST全数据啊?mvfAdminMonths 200706
    mvfAdminMonths 200707
    mvfSiteProvinces Beijing
    whichFirst AS
    __act __id.22.SeatsQuery.adp.actList
    submit.x 28
    submit.y 9点查询时有如上数据POST过去的
      

  12.   

    submit.x 和submit.y是什么作用?我调整了一下传值过去,发现:“
    访问被限制
    为防止自动注册机器人反复登录刷新,
    在您打开当前浏览器并第一次访问此服务器(或者退出后重新登录)后的 30 秒内不得访问此页面。违反此规则将被视为“盲抢”,来自同一个IP地址的反复“盲抢”行为将导致IP地址被封禁。 
    ”打开浏览器并第一次访问此服务器后30秒,,,才能访问,,,这个怎么实现?1.curl访问服务器?
    2.然后setTimeout(xx,3000)>?
    3.运行上面的curl代码
      

  13.   

    submit.x 和submit.y是什么作用?好像没啥作用 .net写的经常有这两个值第一次访问服务器30秒后
    用sleep(30)函数停止30s再循环执行代码应该可以吧
      

  14.   

    问题仍然很多,尝试好几天了。 哪位高手把关键代码写一下,我直接给分吧- -#
      
       实在折腾得不行。正则不用写,只要写到获取并返回结果源文件即可。就是托福报名的网站,http://toefl.estest.edu.cn提供一个登录帐号 183939 密码是abc!123
      

  15.   

    不是我不去试,snoopy和curl我都试过了。   现在返回的是:

    访问被限制
    为防止自动注册机器人反复登录刷新,
    在您打开当前浏览器并第一次访问此服务器(或者退出后重新登录)后的 30 秒内不得访问此页面。违反此规则将被视为“盲抢”,来自同一个IP地址的反复“盲抢”行为将导致IP地址被封禁。 
    ”    解决下实际问题,思路没有问题。但是没法实现,sleep(30)我试过了,整个程序停止了,30秒以后,回来的仍然是相同的消息,sleep(30)以后的代码没有执行。======================================
    1.流程控制的问题   登录->填写选择项->提交->获取结果信息->正则匹配处理每进行一步服务器都会返回信息,如果跳转到这个页面则下面代码皆无效,因为页面不存在了。  怎样实现在同一页面间只获取返回信息并处理后进行跳转。2.登录状态的问题,比如post以后,如果是浏览器则正常,如果是php页面则会返回上述的“访问被限制”的提示
      

  16.   

    如果以方用session,一般没法解决,据说curl可模拟,没试过
    实在不行的话只有手动了
    技术太复杂了
      

  17.   

    这个网站用了session..session id是通过cookie传递的以下例子已经过测试可以获得查询结果
    <?php 
    $cookie_jar = 'cookie.txt';
    $data = array('mvfAdminMonths'   => '200706', 
                  'mvfSiteProvinces' => 'Beijing', 
                  'whichFirst'     => 'AS',
                  '__act'        => '__id.22.SeatsQuery.adp.actList', 
      'submit.x' => '28',
      'submit.y' => '9'); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,'http://toefl.etest.edu.cn/cn/SeatsQuery'); 
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,false); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
    echo curl_exec($ch);
    sleep(30);
    $data = array('mvfAdminMonths'   => '200706', 
                  'mvfSiteProvinces' => 'Beijing', 
                  'whichFirst'     => 'AS',
                  '__act'        => '__id.22.SeatsQuery.adp.actList', 
      'submit.x' => '28',
      'submit.y' => '9'); 
    $ch2 = curl_init(); 
    curl_setopt($ch2, CURLOPT_URL,'http://toefl.etest.edu.cn/cn/SeatsQuery'); 
    curl_setopt($ch2, CURLOPT_POSTFIELDS,$data); 
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER,false); 
    curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar); 
    echo curl_exec($ch2);
    curl_close($ch); 
    ?>第一次curl提交时 用curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
    获得cookie内容第二次curl提交时 用curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar); 
    提交cookie内容需要注意的是cookie.txt这个文件需要手动建立 curl并不会替你建立
    并且要给php对当前目录的写权限,不然可能cookie无法被写入
      

  18.   

    非常感谢楼上的,我测试了以后可以了,我还想问个问题:  1.curl传值的时候,如果把checkbox的多选值传过去。比如 mvfAdminMonths mvfSiteProvinces有多个值,在这个例子中如何传过去?  2.cookie.txt在代码运行完以后仍然为0字节。不知道是否没有写入东西。
      

  19.   

    1.
    $data = array('mvfAdminMonths'   => array('200706','200707'),
                  'mvfSiteProvinces' => 'Beijing', 
                  'whichFirst'     => 'AS',
                  '__act'        => '__id.22.SeatsQuery.adp.actList', 
      'submit.x'=> '28',
      'submit.y'=> '9'); 类似于这样2.cookie.txt我这边测试时是有值得 里面记录了session_id
    第一次没写权限的时候 我测试是失败的 不知道你那边是怎么成功的 赫赫
      

  20.   

    cookie.txt自动生成到apache的安装目录了,我们的配置环境不一样。还有,你说的方法不行,用array()传值以后显示input value not long enough for date format