PHP curl是什么
一、总结
一句话总结:PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl库 允许你与各种的服务器使用各种类型的协议进行连接和通讯 cookie 密码认证 get请求 post请求
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
PHP中使用cURL实现Get和Post请求的方法
1、HTTP协议和HTTPS协议的各自优点?
HTTP快 HTTPS安全
http比https快
https比http安全
2、cURL发送请求主要使用哪些函数?
curl_init() curl_setopt() curl_exec() curl_close()
发送get请求
1 function geturl($url){ 2 $headerArray =array("Content-type:application/json;","Accept:application/json"); 3 $ch = curl_init(); 4 curl_setopt($ch, CURLOPT_URL, $url); 5 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 6 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 7 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 8 curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray); 9 $output = curl_exec($ch); 10 curl_close($ch); 11 $output = json_decode($output,true); 12 return $output; 13 }
二、PHP爬虫技术(转)
转自:PHP爬虫技术(一) - 军报应用开发 - 博客园
https://www.cnblogs.com/jbexploit/p/4553219.html
摘要:本篇文章介绍PHP抓取网页内容技术,利用PHP cURL扩展获取网页内容,还可以抓取网页头部,设置cookie,处理302跳转。
一、cURL安装
采用源码安装PHP时,需要在configure时添加配置项,
cd php
./configure --with-curl
安装完毕,可以利用php -m命令查看,是否已经支持cURL扩展。
php -m | grep curl
也可以利用phpinfo查看,是否已经支持cURL扩展。
二、获取网页内容
cURL支持很多网络协议,如HTTP、HTTPS、FTP等。普通网页采用HTTP协议,一些安全性高的网页采用HTTPS(HTTPS协议采用数据加密技术,通过公钥技术交换密钥,加密传输内容。因此采用HTTPS协议的网页,在整个链路上传输的都是加密后的数据。例如Baidu采用HTTPS协议,你输入的关键字被网络传输协议加密,即使是运营商可以获得全部数据,也无法获得数据的内容。HTTPS协议也有缺点,就是加解密需要耗费计算时间,因此HTTPS网站会慢一些,而大多数网站都是采用HTTP协议)。HTTP协议中,定义了两种方法GET和POST。POST方法通常用于表单提交,能够提交文件等大数据。GET方法用来获取网页数据,也可以提交少量数据。本文主要介绍利用GET协议获取网页数据,将来再详细讲解cURL POST技术。
我们先看一些浏览器是怎么工作的,打开chrome浏览器,F12进入开发者模式,将工具栏切换到network,如下图,利用chrome工具可以查看每个文件的传输信息。
浏览器要加载一个网页,首先下载html文件,再下载js、css、图片等资源文件再进行渲染加载。通常数据抓取只需要抓取html文件,下图是chrome工具显示下载http文件的内容。
三、PHP实现
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "www.qq.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $html = curl_exec($ch); curl_close($ch); var_dump($html); ?>
基本设置,返回网页内容。
四、获得HTTP头部设置cookie
有些网站,会采用cookie技术。当采集程序没带有相关cookie时,很容易被网站认定是“机器人”,拒绝对其服务。通过chrome调试www.sogou.com,发现cookie是包含在网页头信息中的。因此,我们需要两个步骤(1)HTTP头信息中获取cookie(2)发送请求时添加cookie。
头信息包含设置cookie,
刷新网页,查看头信息,请求包含cookie信息
获取cookie
<?php $url = "www.sogou.com"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$setcookie) { // 第一个参数是curl资源,第二个参数是每一行独立的header! list ($name, $value) = array_map('trim', explode(':', $str, 2)); $name = strtolower($name); if('set-cookie'==$name) { $setcookie[]=$value; } return strlen($str); }); curl_exec($ch); curl_close($ch); $cookie = array(); foreach($setcookie as $c) { $tmp = explode(";",$c); $cookie[] = $tmp[0]; } $cookiestr = "Cookie:".implode(";", $cookie); echo $cookiestr; ?>
返回结果
Cookie:ABTEST=0|1433425917|v17;IPLOC=CN1100;SUID=3295CB6F1220920A00000000557057FD
设置cookie
<?php $url = "www.sogou.com"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $headers[] = $cookie; curl_setopt($ci, CURLOPT_HTTPHEADER, $headers); $html = curl_exec($ch); curl_close($ch); var_dump($html); ?>
五、抓取302跳转
在Baidu中搜索关键词,返回的结果链接是一个Baidu加密过的链接,通过二次跳转才是真正的网址。(Baidu为了防止360抓取,把结果都加密了)。
我们可以抓取头部中的location信息找到真实地址,
<?php $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&wd=&eqid=c89cf372000002cc0000000255705961&ie=utf-8"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$location) { // 第一个参数是curl资源,第二个参数是每一行独立的header! list ($name, $value) = array_map('trim', explode(':', $str, 2)); $name = strtolower($name); if('location'==$name) { $location = $value; return 0; } return strlen($str); }); curl_exec($ch); curl_close($ch); echo $location; ?>
抓取302跳转还有另外一种方式,利用ob重定向流的方式,并且设置允许curl跳转到新地址。代码如下
<?php function getContents($url){ $header = array("Referer: http://www.baidu.com/"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_HTTPHEADER,$header); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); //能无法 抓取跳转后的页面 ob_start(); curl_exec($ch); $contents = ob_get_contents(); ob_end_clean(); curl_close($ch); return $contents; } $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&wd=&eqid=c89cf372000002cc0000000255705961&ie=utf-8"; $contents = getContents($url); echo $contents; ?>
(三)、php cURL函数简介
1、PHP cURL 函数
函数 | 描述 |
---|---|
curl_close() | 关闭一个cURL会话。 |
curl_copy_handle() | 复制一个cURL句柄和它的所有选项。 |
curl_errno() | 返回最后一次的错误号。 |
curl_error() | 返回一个保护当前会话最近一次错误的字符串。 |
curl_escape() | 返回转义字符串,对给定的字符串进行URL编码。 |
curl_exec() | 执行一个cURL会话。 |
curl_file_create() | 创建一个 CURLFile 对象。 |
curl_getinfo() | 获取一个cURL连接资源句柄的信息。 |
curl_init() | 初始化一个cURL会话。 |
curl_multi_add_handle() | 向curl批处理会话中添加单独的curl句柄。 |
curl_multi_close() | 关闭一组cURL句柄。 |
curl_multi_exec() | 运行当前 cURL 句柄的子连接。 |
curl_multi_getcontent() | 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。 |
curl_multi_info_read() | 获取当前解析的cURL的相关传输信息。 |
curl_multi_init() | 返回一个新cURL批处理句柄。 |
curl_multi_remove_handle() | 移除curl批处理句柄资源中的某个句柄资源。 |
curl_multi_select() | 等待所有cURL批处理中的活动连接。 |
curl_multi_setopt() | 设置一个批处理cURL传输选项。 |
curl_multi_strerror() | 返回描述错误码的字符串文本。 |
curl_pause() | 暂停及恢复连接。 |
curl_reset() | 重置libcurl的会话句柄的所有选项。 |
curl_setopt_array() | 为cURL传输会话批量设置选项。 |
curl_setopt() | 设置一个cURL传输选项。 |
curl_share_close() | 关闭cURL共享句柄。 |
curl_share_init() | 初始化cURL共享句柄。 |
curl_share_setopt() | 设置一个共享句柄的cURL传输选项。 |
curl_strerror() | 返回错误代码的字符串描述。 |
curl_unescape() | 解码URL编码后的字符串。 |
curl_version() | 获取cURL版本信息。 |
2、PHP 利用 curl 发送 post get del put patch 请求
因为需要在 php 开发中对接其它接口需要用 php curl 去对接其它接口 我把他们封装成函数 希望能对大家有所帮助。
这里面是封装好的会自动把 data 进行转成 json 格式,同时解码成 php 数组输出。
1 <?php 2 function geturl($url){ 3 $headerArray =array("Content-type:application/json;","Accept:application/json"); 4 $ch = curl_init(); 5 curl_setopt($ch, CURLOPT_URL, $url); 6 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 7 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 8 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 9 curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray); 10 $output = curl_exec($ch); 11 curl_close($ch); 12 $output = json_decode($output,true); 13 return $output; 14 } 15 16 17 function posturl($url,$data){ 18 $data = json_encode($data); 19 $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json"); 20 $curl = curl_init(); 21 curl_setopt($curl, CURLOPT_URL, $url); 22 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 23 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE); 24 curl_setopt($curl, CURLOPT_POST, 1); 25 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 26 curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray); 27 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 28 $output = curl_exec($curl); 29 curl_close($curl); 30 return json_decode($output,true); 31 } 32 33 34 function puturl($url,$data){ 35 $data = json_encode($data); 36 $ch = curl_init(); //初始化CURL句柄 37 curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL 38 curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json')); 39 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 40 curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式 41 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串 42 $output = curl_exec($ch); 43 curl_close($ch); 44 return json_decode($output,true); 45 } 46 47 function delurl($url,$data){ 48 $data = json_encode($data); 49 $ch = curl_init(); 50 curl_setopt ($ch,CURLOPT_URL,$put_url); 51 curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json')); 52 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 53 curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); 54 curl_setopt($ch, CURLOPT_POSTFIELDS,$data); 55 $output = curl_exec($ch); 56 curl_close($ch); 57 $output = json_decode($output,true); 58 } 59 60 function patchurl($url,$data){ 61 $data = json_encode($data); 62 $ch = curl_init(); 63 curl_setopt ($ch,CURLOPT_URL,$url); 64 curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json')); 65 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 66 curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH"); 67 curl_setopt($ch, CURLOPT_POSTFIELDS,$data); //20170611修改接口,用/id的方式传递,直接写在url中了 68 $output = curl_exec($ch); 69 curl_close($ch); 70 $output = json_decode($output); 71 return $output; 72 } 73 ?>
参考:PHP cURL 函数 | 菜鸟教程
http://www.runoob.com/php/php-ref-curl.html