美文网首页
关于CURL的几点基本知识

关于CURL的几点基本知识

作者: jiango0 | 来源:发表于2018-07-28 09:34 被阅读0次

    一、什么是cURL

    使用cURL可以实现网络数据的抓取,是一个包含诸多选项的强大接口

    cURL是client URL  Library Functions的缩写。它的底层是由一个命令行工具实现的、用于获取远程文件或传输文件,支持FTP/FTPS、HTTP/HTTPS、SCP/SFTP、Telnet、 DICT 和 File/LDAP等协议,通俗来讲,些类型的服务器,cURL都可以抓取。

    cURL的本质是一个命令行工具,如模拟一个正常用户在浏览器上访问一个网站,可以实现自动登录,或者自动抓取分析网页中的内容、二进制文件数据等。

    cURL是由瑞典的开发者Daniel Stenberg和一个开发小组用C开发的,名字称为LibCURL,是一个开源软件,遵守MIT协议。cURL相当于一个库/API,可单独打包到自己的应用程序中,所以并不是只有PHP语言才能使用cURL。

    有经验的程序员会同,我们为何没有用file_get_contents()这个函数来读取远端内容?实际上这个函数是file()函数的一系列包装,而且性能方面存在比较大的问题,在执行时较慢。也没办法完成更复杂些的任务,比如管理cookier,验证和表单提交,文件上传等等,这也是我们使用cURL的重要原因。

    二、安装和启用

    此处省略三百字,自行百度。。。

    三、PHP cURL选项

    1、CURL_OPT_FOLLOWLOCATION (是否重定向)和 CURLOPT_MAXREDIRS(最大重定向跟踪次数)

    eg.

    document.location='http://blog.fivetree.top';;

    CURL_OPT_FOLLOWLOCATION 目前只支持header头的重定向处理,对于js和meta跳转则无法识别

    CURLOPT_MAXREDIRS 用于定义重定向的跟踪次数,以防止抓取过程中,进入同一个网址,进人死循环。当多次抓取某个网站的内容,这种情况会被对方网管注意到、他会有被人为攻击或抓取数据的判断力,来自重复的请求会拒绝苾问或干脆重定向到一个404的员画上。如果拒绝访问,我们可以通过跟换IP地址或通过代理发起清求。如果是重定向、我们的爬虫程序会被引到个歧途,导致死循环和大量的带宽使用,且数据亦可能无法获取到,使用CURL_OPT_MAXREDIRS可以有效解决此间题。代码片断如下,

    curl_setopt($ch,CURL_OPT_FOLLOWLOCATION,TRUE); //跟随header头重定向

    curl_setopt($ch,CURLOPT_MAXREDIRS,5); //设置重定向跟随5次

    2、CURLOPT_USERAGENT

    用于定义户代理地名称,比如我们模拟微信的内核访问某个网站,代码片段如下

    $agnet = 'Mozillal5  (iphone; CPU iphone OS 5_1 like Mac OS X) APPleWebKit/534.46 (KHTMl like Gecko) Mobile/9B176 MicroMessenger/4. 2. 2';

    curl_setopt ($ch, CURLOPT_USERAGENT, $agnet);

    现在有一些网站会检测用户代理,然后再决定是否提供服务,或根据代理的不同,显示不同的页面,比如用PC浏览器访问某些手机或徽信端网站,它会拒绝显示或者重定向到PC端网站。

    用户代理名称随着移动端的浏览器版本升级而发生一些变化,我们需要自己取得这些标识的正确名称,比如用你的iphone、Android、ipad等设备访问自己的一个服务器页面,用如下代码即可获得

    echo $_SERVER['HTTP_USER_AGENT']

    3、CURLOPT_NOBODY(是否返回页面的主体内容) 与 CURLOPT_HEADER(是否返回页面的头内容)

    curl_setopt($ch,CURLOPT_NOBODY,TRUE); //返回的字符流包含标准头

    curl_setopt($ch,CURLOPT_HEADER,TRUE); //排除页面主体内容

    4、CURLOPT_TIMEOUT 与 CURLOPT_CONNECTTIMEOUT

    curl_setopt($ch,CURLOPT_TIMEOUT,30); //设置等待时长为30秒

    5、CURLOPT_C00KIEFILE 与 CURLOPT_C00KIEJAR

    这两个选项是PHP CURL库提供的强大且灵活的特性之一,它能够帮我在传输抓职过程中向服务器传递Cookie信息。

    我们可以使用CURLOPT_COOKIEFILE选项定义之前存储Cookie的文件位置。在会话完成时,cURL会把新的Cookie写入 CURLOPT_C00KIEJAR指定的文件中。代码片段如下:

    curl_setopt($ch,CURLOPT_C00KIEFILE,'/filename');//读取cookie文件

    curl_setopt($ch,CURLOPT_C00KIEJAR,'/filename'); //写入Cookie文件

    需要注意的有两点,一是文件一定要可读写,二指定的Cookie文件的路径一定要是绝对路径

    6、CURLOPT_HTTPHEADER

    它可以让我们定义目标服务器接受的header头内容,如告知MIME,内容类型,用户代理,及压缩类型

    $header_arr = array(

    'Mime-version:1.0',

    'Content-type:text/html;charset=utf-8',

    'Accept-encoding:compress,gzip'

    );

    curl_setopt($ch,CURLOPT_HTTPHEADER,$header_arr);

    7、CURLOPT_SSL_VERYFYPEER

    目标服务器使用了SSL加密,即访问协议是https时用到。

    curl_setopt($ch,CURLOPT_SSL_VERYFYPEER,FALSE); //没有使用证书

    8、CURLOPT_SSL_VERSION

    此选项用来定义与目标服务器的SSL版本相对应,使用的是SSL版本(2或3)。聚认情况下,pHp会自己检测这个值,尽管有些情况下需要手动地进行设置。代码如下

    curl_seopt($ch, CtMOPT_ssLVERSION, 3);

    特别是近两年的ssL出血漏洞,很多服务器又提高了安全等级,如连接微信的公众平台,腾讯已经废弃了2版和3版,改成了TLS。因此,需要设置成如下代码

    curl_setopt($curl,CURLOPT_SSL_VERSION, CURL_SSLVERSION_TLSv1);

    9、 CURLOPT_USERPWD和 CURLOPT_UNRESTRICTED_AUTH (加入基本认证的用户名和密码)

    此选项适合于对方服务器高基本认证的情况,这两个选项分别用于加入基本认证的用户名和密码。当访问存在基本认证时,每访问一个网页都提交一次用户名和密码,代码如下

    curl_setopt ($ch, CURI_USERPWD,"username:password");

    curl_setopt ($ch, CURLOPT_UNRESTRICTED_AUTH, TRUE);

    如果在整个cURL操作期间,我们还使用了CURL_OPT_FOLLOWLOCATION 选项,那么还应该配置CURLOPT_UNRESTRICTED_AUTH选项,以确保用户和密码会发送给所有重定向的页面(相同的域名)。

    注意,使用此选项需要谨慎,如果给服务器发送了过期错误的用户名会出现在目标服务器的访问日志中。

    10、 CURLOPT_POST 与 CURLOPT_POSTFILELDS

    这两个选项用于通过cURL来模拟提交表单时的重要选项。默认值为GET方法,提交处理前需要配置为POST方法,然后就可以向目标服务器发送POST数据了。帮如下代码:

    curl_seopt($ch,CURLOPT_POST,TRUE);

    $data = username:xiaojiang&password=admin //用于定义POST的数据字符串

    curl_setopt($ch,CURLOPT,CURLOPT_POSTFILELDS,$data);

    post的数据似乎看起来很像GET方法的查询字符串.如果使用GET方法提交表单信息的话,只需要在URL后加入查询的字符串就可以实现

    11.CURLOPT_VERBOSE (控制文件传输过程中产生的状态信息数量)

    该方法在调试中会比较实用.注意,在生产环境中只使用,也会在服务器日志中留下记录.可以关闭此详细模式

    curl_setopt($ch,CURLOPT_VERBOSE,FALSE); //日志最小化

    12.CURLOPT_PORT

    众所周知,在所有的HTTP会话中,默认采用8o端口,cuRL畎认值也为80。比如在连接SSL加密的服务器时,它的端口变成443,有的HTTP服务器为8080或7001,不一而足。因此如果连接到自定义协议或非标准的HTTp服务器,就可使用CURLOPT_PORT来设置相应的端口号。 curl_setopt($ch,CURLOPT_PORT,8080) 

    以上介绍了cURL最常用、也最核心的选项,需要注意,这里所示的配置选项必须为大写,也就是相当于PHP预定义的常量。如果换作小写,会产生错误.

    小结:主要介绍下核心的参数,完整部分请参考PHP手册.完整的cURL选项地址:

    http://cn2.php.net/manual/zh/function.curl-setopt.php

    后续会做一些cURL的事件,包含:

    1.检测curl错误与获取返回信息

    2.抓取远程图片

    3.实用cURL上传图片

    4.curl的批量处理

    5.实用cURL模拟Cookie登录

    更多精彩内容可前往zero的个人博客

    相关文章

      网友评论

          本文标题:关于CURL的几点基本知识

          本文链接:https://www.haomeiwen.com/subject/ovonmftx.html