关于CURL的几点基本知识

一、什么是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的个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容