php使用curl抓取网页自动跳转问题处理

问题分析:

请求抓取http://go.com数据:
function curlGet($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_HEADER, true);
        return curl_exec($ch);
}
$url = 'http://go.com';
echo curlGet($url), "\n";
结果响应:
    HTTP/1.1 301 Moved Permanently  
    Content-Length: 144  
    Content-Type: text/html  
    Location: http://www.go.com/  
    Server: Microsoft-IIS/6.0  
    X-Powered-By: ASP.NET  
    Date: Mon, 03 Sep 2012 04:25:22 GMT  
      
    <head><title>Document Moved</title></head>  
    <body><h1>Object Moved</h1>This document may be found <a HREF="http://www.go.com/">here</a></body>  

      结果中的http://go.com被重定向到了http://www.go.com/

处理方法:

     设置CURLOPT_FOLLOWLOCATION 属性,同时可选设置 CURLOPT_MAXREDIRS数值

curl_setopt($ch, CURLOPT_MAXREDIRS,20);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,ture);

     CURLOPT_FOLLOWLOCATION属性:true表示自动进行递归跳转抓取;
     CURLOPT_MAXREDIRS表示最多允许跳转多少次。
     当抓取次数超过CURLOPT_MAXREDIRS时,递归跳转抓取将终止

不过在使用时需要注意

CURLOPT_FOLLOWLOCATION需要在安全模式关闭和未设置open_basedir的情况下才能使用。
open_basedir是php.ini中的一项设置,功能是将用户可操作的文件限制在某目录下。

      如果开户了安全模式,或者设置了open_basedir,则无法使用自动跳转抓取,此时可以采用连续抓取的办法来抓取最终页面。为加快速度和减少不必要的

      开销,  可以在中间非目标页面的抓取过程中使用

curl_setopt($rch, CURLOPT_HEADER, TRUE);
curl_setopt($rch, CURLOPT_NOBODY, TRUE);

       只抓取头信息,并对header信息的状态码(301,302)进行判断。如需跳转,则从Location中获取到Location,再次进行抓取,直至状态码为200状态。

       最后再对目标页面内容进行抓取

posted @ 2018-03-20 10:36  初心未泯  阅读(735)  评论(0编辑  收藏  举报