问题分析:
请求抓取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状态。
最后再对目标页面内容进行抓取