2018-02-23

/**

* 页面采集通用方法

*@authorZjmainstay

* @website http://www.zjmainstay.cn/php-curl

*

*@paramstring $url      采集的url

*@paramarray $postData  post提交的数据

*@paramarray $header    header头数组,curl命令里的-H参数组成的数组

*@paramarray $opts      option数组,供额外添加opt属性,key为curl_setopt第二参数,value为curl_setopt第三参数

*@paramstring $cookieSaveFile    存储cookie的文件

*@paramstring $cookieGetFile    读取cookie的文件(可以是上一个getPage存下来的cookie文件)

*@paramstring $timeout 超时时间

*@returnstring

*/

functioncurlPage($url,$postData=array(),$header=array(),$opts=array(),$cookieSaveFile='',$cookieGetFile='',$timeout=60) {

$ch=curl_init($url);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//返回数据不直接输出

curl_setopt($ch,CURLOPT_ENCODING,"gzip");//指定gzip压缩

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);//302/301

//SSL

if(substr($url,0,8)==='https://') {

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

//error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)解决

//值有0-6,请参考手册,值1不行试试其他值

//curl_setopt($ch, CURLOPT_SSLVERSION, 1);

    }

//post数据

if(!empty($postData)) {

curl_setopt($ch,CURLOPT_POST,1);//发送POST类型数据

curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);//POST数据,$post可以是数组(multipart/form-data),也可以是拼接参数串(application/x-www-form-urlencoded)

    }

/*

    //header demo

    $header = array(

                  'Host: www.zjmainstay.cn',

                  'Referer: http://www.zjmainstay.cn/',

                  'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:50.0) Gecko/20100101 Firefox/50.0',

              );

*/

//对cURL命令使用正则替换 -H 为 ,\n 即可得到数组项,一般移除其中的cookie,由上一个页面存储并使用,参考$cookieSaveFile/$cookieGetFile参数

//如果是json格式上传,其中的Content-Length需要针对提交内容用strlen计算得到并替换

//头信息

if(!empty($header)) {

curl_setopt($ch,CURLOPT_HTTPHEADER,$header);//使用header头信息

    }

//额外option

if(!empty($opts)) {

foreach($optsas$key=>$value) {

curl_setopt($ch,$key,$value);//自定义OPT

        }

    }

//存储cookie到文件

if(!empty($cookieSaveFile)) {

curl_setopt($ch,CURLOPT_COOKIEJAR,$cookieSaveFile);//存储提交后得到的cookie数据

    }

//使用存储的cookie内容(上一次请求得到的cookie文件)

if(!empty($cookieGetFile)) {

curl_setopt($ch,CURLOPT_COOKIEFILE,$cookieGetFile);//使用提交后得到的cookie数据做参数

    }

//超时时间

if(!empty($timeout)) {

curl_setopt($ch,CURLOPT_TIMEOUT, (int)$timeout);

    }

//执行

$content=curl_exec($ch);

if($error=curl_error($ch)) {

//log error

error_log($error);

    }

curl_close($ch);

return$content;

}

#测试http

$url='http://api.zjmainstay.cn';

echo"http url ok:", curlPage($url) ,"\n";

#测试https

$url='https://api.zjmainstay.cn';

echo"https url ok:", curlPage($url) ,"\n";

#测试缺少referere

$url='http://demo.zjmainstay.cn/php/curl/search_refer.php';

$post=array(

'wd'=>urlencode('php'),

);

echo"no referer fail:",substr(curlPage($url,$post),0,100) ,"\n";

#测试使用referer 和 post数据

$url='http://demo.zjmainstay.cn/php/curl/search_refer.php';

$post=array(

'wd'=>urlencode('php'),

);

$header=array(

'Referer: http://demo.zjmainstay.cn/',

                );

echo"referer in header ok:",preg_replace('#\s+#','',substr(curlPage($url,$post,$header),0,100)) ,"\n";

#测试超时

$url='http://demo.zjmainstay.cn/php/curl/sleep3seconds.php';

echo"timeout in 1's fail:",substr(curlPage($url,$post,$header,array(),false,false,1),0,100) ,"\n";

#测试gzip正常

$url='http://news.sohu.com/';

echo"gzip is ok:",substr(curlPage($url),0,100) ,"\n";

#测试301正常(没有看到301 Move)

$url='http://zjmainstay.cn';

echo"301 is ok:",substr(curlPage($url),0,100) ,"\n";

#测试存储cookie成功

$url='http://demo.zjmainstay.cn/jquery/autoCheckCaptcha/createcode.php?t='.rand(100000,999999);

$saveCookieFile=__DIR__.'/curlPage.cookie.txt';

if(file_exists($saveCookieFile)) {@unlink($saveCookieFile); }

$imgContent=curlPage($url,false,false,array(),$saveCookieFile);

$codeFile=__DIR__.'/code.png';

file_put_contents($codeFile,$imgContent);

echo"save cookie is ok:",file_get_contents($saveCookieFile) ,"\n";

echo"请输入一个验证码( {$codeFile} ):";

$code=trim(fgets(STDIN));

#测试使用cookie

$url='http://demo.zjmainstay.cn/jquery/autoCheckCaptcha/checkcode.php';

$post=array(

'code'=>$code,//手动填写验证码并提交运行

              );

echo"use cookie is ok when status=1:", curlPage($url,$post,false,array(),false,$saveCookieFile) ,"\n";

#测试添加额外opt

$url='http://zjmainstay.cn';

$content=curlPage($url,array(),false,array(

CURLOPT_FOLLOWLOCATION=>FALSE,

CURLOPT_HEADER=>TRUE,

                                        ));

echo"get url with no follow(302) and get header info:\n",substr($content,0,200),"\n";php curl学习

你可能感兴趣的:(2018-02-23)