CURL页面采集通用方法

2018-09-14 10:55:00
小熊
原创
9617
摘要:我们在分析网页数据的时候,通常会采用CURL来获取网页数据,本文主要介绍CURL采集的使用方法。

首先,你要使用CURL的话,需要开启CURL扩展,即在php.ini文件把curl拓展开启,即取消extension=php_curl.dll的分号。

php.ini位置

打开php.ini文件,开启扩展。

vi php.ini

取消extension=php_curl.dl前的逗号

CURL的具体使用方法就不多说了,先上函数。

/**
 * 页面采集通用方法
 * @param  string $url      采集的url
 * @param  array $postData  post提交的数据
 * @param  array $header    header头数组,curl命令里的-H参数组成的数组
 * @param  array $opts      option数组,供额外添加opt属性,key为curl_setopt第二参数,value为curl_setopt第三参数
 * @param  string $cookieSaveFile    存储cookie的文件
 * @param  string $cookieGetFile     读取cookie的文件(可以是上一个getPage存下来的cookie文件)
 * @param  string $timeout 超时时间
 * @return string
 * @author itbear <admin@cnsite.org>
 * @link  www.beatmoon.com
 */
function curlPage( $url, $postData = array(), $header = array(), $opts = array(), $cookieSaveFile = '', $cookieGetFile = '' , $timeout = 0 ) {
    $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($opts as $key => $value) {
            curl_setopt($ch, $key, $value);      //使用header头信息
        }
    }
    //存储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;
}

函数的具体使用方法,备注的很明确,就不多说了。

我们在采集网页的时候,通常我们也会用file_get_contents(),fopen()。它们的优点是使用比较简单,但是也有一些缺点,如下。

PHP中fopen,file_get_contents,curl函数的区别:

1.fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。

2.fopen /file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。

3.fopen / file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。

4.curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。
file_get_contents 获取远程文件时会把结果都存在一个字符串中 fiels函数则会储存成数组形式,因此,我还是比较建议使用curl来访问远程url。Php有curl模块扩展,功能很是强大。

网上大家都说,CURL性能要比file_get_contents()等要高得多,所以在采集大量网页的时候,还是建议大家使用curl。


文章分类
联系我们
联系人: 小熊
电话: 18037578880
Email: admin@cnsite.org
QQ: 929410000
微信: itseor
微博: itseoer
网址: www.beatmoon.com