PHP curl函数采集 :xotao

2012年 22月 11日 18:15

curl代理,COOKIES,等参数
由于淘宝API的关系,打算用采集的方式弥补淘宝SDK的不足.
主要就是依靠CURL了

<?php
/**
 * 
 * 
 * @author [email protected]
 * @since 1.0, 2012-11-02 14:26:25
 * @link http://github.com/yingouqlj/xotao
 */
class xoTao{
    public $curlString=array();
    private $curl_option=array(
        'proxy'=>array(
                'proxyType'=>false,// 关闭为false 可选 HTTP,SOCKS5 
                'proxyHost'=>'127.0.0.1', //代理的主机地址
                'proxyPort'=>8087,    //代理主机的端口
                'proxyAuth'=>false,   //代理是否要身份认证(HTTP方式时)
                'proxyAuthType'=>'BASIC',  //认证的方式.可选择 BASIC 或 NTLM 方式
                'proxyAuthUser'=>'',  //认证的用户名
                'proxyAuthPwd'=>'', //认证的密码
        ),
        'useragent'=>'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11 xoTao',       
        'useCookies'=>true,
            );
        public function curl($url, $postFields = null) //函数来自TopClient,扩展了下
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FAILONERROR, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $this->curl_option['useragent']);
        if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {      //https 请求
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        if($this->curl_option['proxy']['proxyType'])
        {
            $proxyType = $this->curl_option['proxy']['proxyType']=='HTTP' ? CURLPROXY_HTTP : CURLPROXY_SOCKS5;
            curl_setopt($ch, CURLOPT_PROXYTYPE, $proxyType);
            curl_setopt($ch, CURLOPT_PROXY, $this->curl_option['proxy']['proxyHost']);
            curl_setopt($ch, CURLOPT_PROXYPORT, $this->curl_option['proxy']['proxyPort']);
            if($this->curl_option['proxy']['proxyAuth'])
            {
                $proxyAuthType = $this->curl_option['proxy']['proxyAuthType']=='BASIC' ? CURLAUTH_BASIC : CURLAUTH_NTLM;
                curl_setopt($ch, CURLOPT_PROXYAUTH, $proxyAuthType);
                $user = "[{$this->curl_option['proxy']['proxyAuthUser']}]:[{$this->curl_option['proxy']['proxyAuthPwd']}]";
                curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user);
            }
        }
        if($this->curl_option['useCookies'])
        {
            $cookfile = tempnam(sys_get_temp_dir(),'xotao');
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookfile);
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookfile);
        }
        if (is_array($postFields) && 0 < count($postFields))
        {
            $postBodyString = "";
            $postMultipart = false;
            foreach ($postFields as $k => $v)
            {
                if("@" != substr($v, 0, 1))//判断是不是文件上传
                {
                    $postBodyString .= "$k=" . urlencode($v) . "&"; 
                }
                else//文件上传用multipart/form-data,否则用www-form-urlencoded
                {
                    $postMultipart = true;
                }
            }
            unset($k, $v);
            curl_setopt($ch, CURLOPT_POST, true);
            if ($postMultipart)
            {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
            }
            else
            {
                curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1));
            }
        }
        $reponse = curl_exec($ch);

        if (curl_errno($ch))
        {
            throw new Exception(curl_error($ch),0);
        }
        else
        {
            $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if (200 !== $httpStatusCode)
            {
                throw new Exception($reponse,$httpStatusCode);
            }
        }
        curl_close($ch);
        return $reponse;
    }



}

curl函数库

这些资料网上很多,选择转过来是因为实在找不到哪个是最初的版本,而我转载的出处都是一些类似站长站的网站采集的,重新整理下 修正:建议资料参考PHP官方手册http://cn2.php.net/manual/zh/book.curl.php

  • curl_close — 关闭一个curl会话
  • curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
  • curl_errno — 返回一个包含当前会话错误信息的数字编号
  • curl_error — 返回当前会话错误信息
  • curl_exec — 执行一个curl会话
  • curl_getinfo — 获取一个curl连接资源句柄的信息
  • curl_init — 初始化一个curl会话
  • curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
  • curl_multi_close — 关闭一个批处理句柄资源
  • curl_multi_exec — 解析一个curl批处理句柄
  • curl_multi_getcontent — 返回获取的输出的文本流
  • curl_multi_info_read — 获取当前解析的curl的相关传输信息
  • curl_multi_init — 初始化一个curl批处理句柄资源
  • curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
  • curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
  • curl_setopt_array — 以数组的形式为一个curl设置会话参数
  • curl_setopt — 为一个curl设置会话参数,查阅参数请参考http://cn2.php.net/manual/zh/function.curl-setopt.php
  • curl_version — 获取curl相关的版本信息
  • curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址
  • curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
  • curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄
  • curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一個参数,不清楚是做什么的
  • curl_getinfo()函数的作用是获取一個curl連接資源句柄的信息 关于curl_getinfo中的参数请查阅PHP.NET官方手册http://cn2.php.net/manual/zh/function.curl-getinfo.php
tags: