• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

问题分析:

请求抓取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状态。

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php关于always_populate_raw_post_data报错的解决方案发布时间:2022-07-10
下一篇:
PHP编程中10个最常见的错误发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap