http://zhaohongen.fu.cn8u.cn/a.html 这个页面很神奇,用curl抓取不到。那位大侠能帮帮小弟?
这个页面第一次打开要跳转,再次打开才能看到内容。必须是收到打开后再用下面的代码才能抓取。
但是当你更换ip或是这个空间重启后 下面代码就获取不到了!
现在我能获取的办法是:1、收到打开页面,再次打开看到页面内容。
                      2、再用下面的代码获取就可以了。
但是本地服务器一换ip或是重启此页面的服务器又要重复上面的步骤才能获取,请问为什么?请大侠支招!if(!file_exists($cookie_file)){
    $fp= fopen($cookie_file,"w");
    fclose($fp);
}
$url = "http://zhaohongen.fu.cn8u.cn/a.html";
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie_file); 
curl_exec($ch);
curl_close($ch);
$url = "http://zhaohongen.fu.cn8u.cn/a.html";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
$response = curl_exec($ch);
curl_close($ch);
echo('<pre>');
echo htmlspecialchars($response);
echo('</pre>');

解决方案 »

  1.   


    $url = "http://zhaohongen.fu.cn8u.cn/a.html";
    $curl = curl_init();// 设置你需要抓取的URL
    curl_setopt($curl, CURLOPT_URL, $url);// 设置header
    curl_setopt($curl, CURLOPT_HEADER, 1);// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 运行cURL,请求网页
    $data = curl_exec($curl);// 关闭URL请求
    curl_close($curl);// 显示获得的数据
    var_dump($data);
      

  2.   

    会跳转的。必须手动打开http://zhaohongen.fu.cn8u.cn/a.html 看到内容了 在用这个才能获取,就是能获取了,如果你换ip了,或是这个页面的服务器重启了,又不能获取了!你试试再说吧。
      

  3.   

    这个页面的服务器是记录ip和cookies的。楼上想的太简单了。
      

  4.   

    curl是主动请求被动接收的吧,
    那端无论记不记ip,只是影响显示内容而以
    有数据返回就说明请求成功了,至于重定向
    在数据返回头部会有被redirect信息提示,你没看到吗
      

  5.   

    当我获取cookies之后,再用获得的cookies请求时,就被指引到了这个页面,HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length: 320
    Prama: no-cache
    var mycookie="b4c1a6";var c1="96a446";var c2="1f1dd839eea3fa14d839379aa7f8eb7a2fe821d06d494e5574badd034308885bf21e96a446";mycookie+=c2;var td=new Date();td.setDate(td.getDate()+30);document.cookie="yetet3uu=checkcode="+mycookie+";expires="+td.toGMTString()+";path=/;";var myurl="/a.html";location=myurl;
    请大侠帮帮忙 搞了一天了 也不知是什么原因,你是说数据头部有redirect的,我用抓包了一遍并没有见啊
      

  6.   

    我用抓包工具检测用浏览器浏览http://zhaohongen.fu.cn8u.cn/a.html这个页面的情况 没有检测到第二次发送js产生cookies的代码,因此说用浏览器浏览没有被带到那个产生cookies的js代码的那个页面,直接跳转到了http://zhaohongen.fu.cn8u.cn/a.html。而用curl去被跳转到了上面那个有生成cookies的js代码页面,问题出在哪里呢?
      

  7.   

    测试过了,与你CURL无关,是服务器有意设置的:
    默认对新客户端显示广告页面,“老”客户端显示真实页面。
    那个广告你是屏蔽不掉的,是服务器的故意行为,本质js与cookie作用(而且实际测试,兼容性似乎也不好,在FF上不起效,跑到论坛去了,IE上可以验证)限制只对新客户端弹出广告
    解决办法:
    1、伪造cookie证明自己是个新客户端,去分析他们的COOKIE存储值去伪造
    2、换空间吧
      

  8.   

    我刚才找到解决办法了,就是伪造cookies。现在又不行了。我再看看
      

  9.   

    兄弟,问题已经完美解决。
    怎么会与curl无关?理论上curl能模仿浏览器任何动作,curl不能获取只能说明没有构造好。
    我也看到了它的不稳定性,对360兼容比较好,但是curl是和浏览器没有关系的,只要curl构造好,还是很稳定的。不稳定表现在第二次通过js发送cookies的阶段,但是有curl获取这个js还是几乎百发百中的。
    既然搞技术,不通过技术搞定它,交钱多没有意思。
    因为如果要说详细点,要配合抓包数据来说,所以下面大概说一下我解决思路:
    curl有两种获取和发送cookies的方式
    1、获取服务器通过HEADER发来的cookies,并以自己的方式保存起来,这个保存方式和c盘里的cookies保存方式不一样。发送时,再把cookies文件读取,以自己的方式还原发送,具体还原成什么样子,具体又以什么样的方式发送还没有研究;
    2、手工构造在curl参数里构造cookies,这个就像是通过asp、php产生cookies一样,构造cookies各个参数以明文发送,发送后是不是curl又做了什么处理不得而知。
    在第二步中正则到的js代码,拆开,组成js要产出的cookies。奇怪的是正则到的这个js代码,通过分析获得的cookies和抓包时,看到的send出去的js产生cookies有区别,所以就按照send出去的来构造这个cookies。
    将jscookies和第一次产生的cookies汇合成一个cookies(将jscookies当成第一个cookies的参数加入)
    这个cookies就是最后要发送的cookies了,由于是手工构造的,只能通过curl的第二种cookies发送的方式的。
    面临的问题:在最后要发送的这个cookies中,一部分是未加密的通过HEADER获得的,而js部分cookies是在服务端就加了密的。两个cookies组合在一起发送,能不能通过呢?
    如果想知道答案就来问我吧。