用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下:
- <?php
- 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://144go.com';
- echo curlGet($url), "\n";
执行上述代码,得到的结果:
- HTTP/1.1 301 Moved Permanently
- Content-Length: 144
- Content-Type: text/html
- Location: http://www.144go.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.144go.com/">here</a></body>
Location: http://www.144go.com/
可知 http://144go.com 被重定向到了 http://www.144go.com/
怎么办呢,要用正则分析出Location部分的链接,重复执行执行curlGet吗?行到是行,就是有点麻烦。
其实只要加一条语就可以了:
- <?php
- function curlGet($url) {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_HEADER, true);
- //函数中加入下面这条语句
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
- return curl_exec($ch);
- }
CURLOPT_FOLLOWLOCATION指明:
让curl递归的抓取http头中Location中指明的url。
当抓取次数超过CURLOPT_MAXREDIRS时,递归将终止。
在抓取中任何跳转带来的问题,都可通过设置此参数解决。
Curl 中有一个 CURLOPT_FOLLOWLOCATION 参数可以用来跟随重定向页面
这是可以通过使用-L选项进行强制重定向
1 # 让curl使用地址重定向,此时会查询google.com.hk站点 2 curl -L http://www.google.com
断点续传
通过使用-C选项可对大文件使用断点续传功能,如:
303是一个特殊的
/*
*功能:php完美实现下载远程图片保存到本地
*参数:文件url,保存文件目录,保存文件名称,使用的下载方式
*当保存文件名称为空时则使用远程文件原来的名称
*/
function getImage($url,$save_dir='',$filename='',$type=0){
if(trim($url)==''){
return array('file_name'=>'','save_path'=>'','error'=>1);
}
if(trim($save_dir)==''){
$save_dir='./';
}
if(trim($filename)==''){//保存文件名
$ext=strrchr($url,'.');
if($ext!='.gif'&&$ext!='.jpg'){
return array('file_name'=>'','save_path'=>'','error'=>3);
}
$filename=time().$ext;
}
if(0!==strrpos($save_dir,'/')){
$save_dir.='/';
}
//创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
return array('file_name'=>'','save_path'=>'','error'=>5);
}
//获取远程文件所采用的方法
if($type){
$ch=curl_init();
$timeout=3;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$img=curl_exec($ch);
//amazon https://forums.aws.amazon.com/message.jspa?messageID=196878
curl_close($ch);
}else{
ob_start();
readfile($url);
$img=ob_get_contents();
ob_end_clean();
}
//$size=strlen($img);
//文件大小
$fp2=@fopen($save_dir.$filename,'w');
fwrite($fp2,$img);
fclose($fp2);
unset($img,$url);
return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}