CURL
CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 CURL 库。使用PHP的CURL 库可以简单和有效地去抓网页。
你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。
无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,CURL 是一个功能强大的PHP库。
PHP建立CURL请求的基本步骤
①:初始化 curl_init() ②:设置属性 curl_setopt().有一长串CURL 参数可供设置,它们能指定URL请求的各个细节。 ③:执行并获取结果 curl_exec() ④:释放句柄 curl_close()
如果获得的数据时json格式的,使用json_decode函数解释成数组。 $output_array = json_decode($data,true); //如果第二个参数为true,就转为数组的形式。如果不填就为对象的形式 如果使用json_decode($data)解析的话,将会得到object类型的数据。
CURL实现GET和POST
原生的curl
1 /** 2 * ①:GET方式实现 3 * @param [type] $url 访问的url 4 * @return [type] [description] 5 */ 6 public function curl_get($url) 7 { 8 //初始化 9 $curl = curl_init(); 10 //设置抓取的url 11 curl_setopt($curl, CURLOPT_URL, $url); 12 //设置头文件的信息作为数据流输出 13 curl_setopt($curl, CURLOPT_HEADER, 1); 14 //设置获取的信息以文件流的形式返回,而不是直接输出。 15 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 16 //执行命令 17 $data = curl_exec($curl); 18 //关闭URL请求 19 curl_close($curl); 20 //显示获得的数据 21 print_r($data); 22 return $data; 23 } 24 /** 25 * ②:POST方式实现 26 * @param [type] $url 访问的url 27 * @param array $post_data 设置post数据 28 * @return [type] [description] 29 */ 30 public function curl_post($url,$post_data=array()) 31 { 32 //初始化:创建一个新cURL资源 33 $curl = curl_init(); 34 //设置抓取的url 35 curl_setopt($curl, CURLOPT_URL, $url); 36 //curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); //超时设置,用来告诉 PHP 在成功连接服务器前等待多久(连接成功之后就会开始缓冲输出),这个参数是为了应对目标服务器的过载,下线,或者崩溃等可能状况。 37 //设置头文件的信息作为数据流输出 38 //curl_exec()返回值类型:1获取的信息以文件流的形式返回,而不是直接输出。0如果成功只返回TRUE,自动输出返回的内容 39 curl_setopt($curl, CURLOPT_HEADER, 1); 40 //设置获取的信息以文件流的形式返回,而不是直接输出。 41 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 42 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。当CURLOPT_SSL_VERIFYPEER启用,并验证失败,证明证书是真实的,连接失败。当选项为零时,对等证书验证无论如何都成功。 43 44 //设置post数据 45 // $post_data = array( "username" => "coder", "password" => "12345"); 46 // if (!empty($post_data)) { 47 //设置post方式提交 48 curl_setopt($curl, CURLOPT_POST, 1); 49 curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); 50 // } 51 //执行命令 52 $data = curl_exec($curl); 53 //关闭URL请求 54 curl_close($curl); 55 //显示获得的数据 56 print_r($data); 57 return $data; 58 } 59 /** 60 * 方法3: 61 * 参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$cookies 62 * @param [type] $url 访问的URL 63 * @param string $post post数据(不填则为GET) 64 * @param string $cookie 提交的$cookies 65 * @param integer $returnCookie 是否返回$cookies 66 * @return [type] [description] 67 */ 68 public function curl_request($url,$post='',$cookie='', $returnCookie=0){ 69 $curl = curl_init(); 70 curl_setopt($curl, CURLOPT_URL, $url); 71 curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'); 72 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 73 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); 74 curl_setopt($curl, CURLOPT_REFERER, "http://XXX"); 75 if($post) { 76 curl_setopt($curl, CURLOPT_POST, 1); 77 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); 78 } 79 if($cookie) { 80 curl_setopt($curl, CURLOPT_COOKIE, $cookie); 81 } 82 curl_setopt($curl, CURLOPT_HEADER, $returnCookie); 83 curl_setopt($curl, CURLOPT_TIMEOUT, 10); 84 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 85 $data = curl_exec($curl); 86 if (curl_errno($curl)) { 87 return curl_error($curl); 88 } 89 curl_close($curl); 90 if($returnCookie){ 91 list($header, $body) = explode("\r\n\r\n", $data, 2); 92 preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches); 93 $info['cookie'] = substr($matches[1][0], 1); 94 $info['content'] = $body; 95 return $info; 96 }else{ 97 return $data; 98 } 99 } 100 101 /** 102 * 方法四: 103 * 获取通过curl 方式获取的数据 104 * @param [type] $url 访问的URL 105 * @param array $options post数据(不填则为GET) 106 * @param [type] &$httpCode http状态码 107 * @return [type] [description] 108 */ 109 public function req_curl($url, $options = array(), &$httpCode = null) 110 { 111 $res = ''; 112 $options = array_merge(array( 113 'follow_local' => true, 114 'timeout' => 30, 115 'max_redirects' => 4, 116 'binary_transfer' => false, 117 'include_header' => false, 118 'no_body' => false, 119 'cookie_location' => dirname(__FILE__) . '/cookie', 120 'useragent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1', 121 'post' => array() , 122 'referer' => null, 123 'ssl_verifypeer' => 0, 124 'ssl_verifyhost' => 0, 125 //PHP CURL库默认1024字节的长度不等待数据的返回,所以你那段代码需增加一项配置 126 'headers' => array( 127 'Expect:' 128 ) , 129 'auth_name' => '', 130 'auth_pass' => '', 131 'session' => false 132 ) , $options); 133 $options['url'] = $url; 134 135 $s = curl_init(); 136 137 if (!$s) return false; 138 139 curl_setopt($s, CURLOPT_URL, $options['url']); 140 curl_setopt($s, CURLOPT_HTTPHEADER, $options['headers']); 141 curl_setopt($s, CURLOPT_SSL_VERIFYPEER, $options['ssl_verifypeer']); 142 curl_setopt($s, CURLOPT_SSL_VERIFYHOST, $options['ssl_verifyhost']); 143 curl_setopt($s, CURLOPT_TIMEOUT, $options['timeout']); 144 curl_setopt($s, CURLOPT_MAXREDIRS, $options['max_redirects']); 145 curl_setopt($s, CURLOPT_RETURNTRANSFER, true); 146 curl_setopt($s, CURLOPT_FOLLOWLOCATION, $options['follow_local']); 147 curl_setopt($s, CURLOPT_COOKIEJAR, $options['cookie_location']); 148 curl_setopt($s, CURLOPT_COOKIEFILE, $options['cookie_location']); 149 if (!empty($options['auth_name']) && is_string($options['auth_name'])) 150 { 151 curl_setopt($s, CURLOPT_USERPWD, $options['auth_name'] . ':' . $options['auth_pass']); 152 } 153 if (!empty($options['post'])) 154 { 155 curl_setopt($s, CURLOPT_POST, true); 156 curl_setopt($s, CURLOPT_POSTFIELDS, $options['post']); 157 //curl_setopt($s, CURLOPT_POSTFIELDS, array('username' => 'aeon', 'password' => '111111')); 158 } 159 if ($options['include_header']) 160 { 161 curl_setopt($s, CURLOPT_HEADER, true); 162 } 163 if ($options['no_body']) 164 { 165 166 curl_setopt($s, CURLOPT_NOBODY, true); 167 } 168 if ($options['session']) 169 { 170 curl_setopt($s, CURLOPT_COOKIESESSION, true); 171 curl_setopt($s, CURLOPT_COOKIE, $options['session']); 172 } 173 curl_setopt($s, CURLOPT_USERAGENT, $options['useragent']); 174 curl_setopt($s, CURLOPT_REFERER, $options['referer']); 175 $res = curl_exec($s); 176 $httpCode = curl_getinfo($s, CURLINFO_HTTP_CODE); //最后一个收到的HTTP代码 177 curl_close($s); 178 return $res; 179 }
Yii2.0 -- 自带
use linslin\yii2\curl;
$username= 'your name';
$url = 'http://www.localhost.com';
$data = ['username'=>$username];
$curl = new curl\Curl();
$res = $curl->setPostParams($data)->post($url);
var_dump($res);
Yii2.0 自带
use linslin\yii2\curl;
$username= 'your name';
$url = 'http://www.localhost.com?username=' . $username;
$curl = new curl\Curl();
$s = $curl->post($url); // 必须使用 post 提交,协议使用 https,关闭 CURLOPT_SSL_VERIFYPEER 证书
var_dump($s);
Yii2.0 自带(二)
浙公网安备 33010602011771号