首页 > Web开发 > 详细

关于curl跳转抓取

时间:2016-10-25 23:59:22      阅读:370      评论:0      收藏:0      [点我收藏+]

今天在公司碰到了一个bug,就是以前一直用curl下载的MP3录音文件为空了,但是浏览器去get请求是有文件的,并且大小还不是0kb,但是我用curl下载下来就是0K,百思不得其解。终于功夫不负有心人,得到了方法,原来我一直要去第三方的接口拿到录音数据,但是今天的录音数据中地址跳转了,也就是第一次请求的地址返回的是302,

这是以前的代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$info = curl_exec($ch);

也就是说curl在第一次请求额时候,服务器返回302,其实是要跳转的,但是curl是默认没有跳转的,所以$info一直就是空的

改进之后

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$info = curl_exec($ch);

这次是多了 CURLOPT_FOLLOWLOCATION,表示允许curl去跳转。$info数据有了!

ps:关于资料

curl_setopt($ch, CURLOPT_MAXREDIRS,20);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
CURLOPT_FOLLOWLOCATION即表示自动进行跳转抓取,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中获取到跳转的地址,再次进行抓取,直至状态码为200状态。最后再对目标页面进行抓取

关于curl跳转抓取

原文:http://www.cnblogs.com/tianye8123/p/5998627.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!