phpCurl是一个在实战中运用非常多的和外部服务器进行交互的一个函数库。
先查看下cURL的函数库的版本信息print_r(curl_version())(版本信息透漏出了很多的功能介绍)
可以看到:
Array
(
//cURL的24位版本号
[version_number] => 468480
//出版时间
[age] => 3
//CURL_VERSION_XXX常量的位掩码
[features] => 3997
//OpenSSL 24 位版本号
[ssl_version_number] => 0
//cURL 版本号,字符串形式
[version] => 7.38.0
//关于编译cURL主机的信息
[host] => i386-pc-win32
//OpenSSL 版本号,字符串形式
[ssl_version] => OpenSSL/1.0.1i
//zlib 版本号,字符串形式
[libz_version] => 1.2.7.3
//一个cURL支持的协议名字的数组
[protocols] => Array
(
[0] => dict
[1] => file
[2] => ftp
[3] => ftps
[4] => gopher
[5] => http
[6] => https
[7] => imap
[8] => imaps
[9] => ldap
[10] => pop3
[11] => pop3s
[12] => rtsp
[13] => scp
[14] => sftp
[15] => smtp
[16] => smtps
[17] => telnet
[18] => tftp
)
)
支持的协议和版本可以描述大部分的功能范畴(大部分库的版本会随着时间慢慢更新,由于库版本不兼容的一些事情会在引用的时候,出现各种BUG问题)。从上述的介绍里,也可以看到curl支持的通讯协议达到了18种(基本涵盖了网络应用)在这节里我们重点使用的是http和https的支持(一般用来调用其他服务器上的接口用的比较多)。有关数据表明,Curl函数库的通讯效率是直接file_get_contents的4倍(所以比较专业抓取类都是用cURL库)。
使用该库前,需要初始化(当然更需要的一个前提是安装了该库,同时开启该库的支持,当前的php一般都支持开启该库)
标准使用三个参数:
$ch=curl_init("http://www.oschina.net");
$a =curl_exec($ch);
$b = curl_close($ch);
可以看到页面出了页面,该三个参数执行的目的就是读取http://www.oschina.net网页然后显示出来。
改进的写法:(因为我们可能是需要读取页面,但是不需要在浏览器里显示出来,比如抓去到某个页面后,我们需要对页面进行分析,分析完成后只告诉我们结果后就可以)
<?php $ch =curl_init(); //将需要抓去的url写入 curl_setopt($ch,CURLOPT_URL,"http://www.oschina.net"); //设置了该参数后,就可以达到获取上面url网页内容赋值给变量的目的 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //该变量进行调用 $txt=curl_exec($ch); curl_close($ch); ?>
上面这个过程可以完成了一个类似 file_get_contents(URL)的动作。现在对功能进行进一步的功能复杂化,
比如是否抓去头部
curl_setopt($ch,CURLOPT_HEADER,true) 这样url的头部信息也可以显示出来。
下面完成一个curl模拟发送表单的信息(用户登录情况下发送数据——最简单的可能是模拟登录用户数据自动提交表单,比如今目标的打卡)
<?php $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,"shuju"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //允许发送post数据 curl_setopt($ch,CURLOPT_POST,1) //发送post数据 curl_setopt($ch,CURLOPT_POSTFIELDS,array('test'=>1)); //模拟cookie的发送 curl_setopt($ch,CURLOPT_COOKIE,"name=test;logintest=1"); $output = curl_exec($ch); curl_close($ch); ?>
这样就完成了一个简单的在cookie情况下对数据表单的提交(如果身份验证通过了,可以在账户下做很多自动化的事情,发送一个这样的脚本即可)