curl

来源:互联网 发布:从零开始学python 编辑:程序博客网 时间:2024/06/05 10:15

使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网
页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一
个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。

PHP中的CURL函数库(Client URL Library Function)
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

基本例子﹤?php// 初始化一个 cURL 对象$curl = curl_init();// 设置你需要抓取的URLcurl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn');// 设置headercurl_setopt($curl, CURLOPT_HEADER, 1);// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 运行cURL,请求网页$data = curl_exec($curl);// 关闭URL请求curl_close($curl);// 显示获得的数据var_dump($data);?>
POST数据sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容。﹤?php$phoneNumber = '13812345678';$message = 'This message was generated by curl and php';$curlPost = 'pNUMBER=' . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) . '&SUBMIT=Send';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.lxvoip.com/sendSMS.php');curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec();curl_close($ch);?﹥
例子三:使用代理服务器使用代理服务器﹤?php $ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.cmx8.cn');curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);curl_setopt($ch, CURLOPT_PROXY, 'proxy.lxvoip.com:1080');curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');$data = curl_exec();curl_close($ch);?﹥
例子四: 模拟登录Curl 模拟登录 discuz 程序,适合DZ7.0,将username改成你的用户名,userpass改成你的密码就可以了.Curl 模拟登录 discuz 程序<?php    /**   * Curl 模拟登录 discuz 程序   * 尚未实现开启验证码的的论坛登录功能   */   !extension_loaded('curl') && die('The curl extension is not loaded.');    $discuz_url = 'http://www.lxvoip.com';//论坛地址    $login_url = $discuz_url .'/logging.php?action=login';//登录页地址    $get_url = $discuz_url .'/my.php?item=threads'; //我的帖子    $post_fields = array();    //以下两项不需要修改    $post_fields['loginfield'] = 'username';    $post_fields['loginsubmit'] = 'true';    //用户名和密码,必须填写    $post_fields['username'] = 'lxvoip';    $post_fields['password'] = '88888888';    //安全提问    $post_fields['questionid'] = 0;    $post_fields['answer'] = '';    //@todo验证码    $post_fields['seccodeverify'] = '';    //获取表单FORMHASH    $ch = curl_init($login_url);    curl_setopt($ch, CURLOPT_HEADER, 0);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    $contents = curl_exec($ch);    curl_close($ch);    preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);    if(!empty($matches)) {        $formhash = $matches[1];    } else {        die('Not found the forumhash.');    }    //POST数据,获取COOKIE    $cookie_file = dirname(__FILE__) . '/cookie.txt';    //$cookie_file = tempnam('/tmp');    $ch = curl_init($login_url);    curl_setopt($ch, CURLOPT_HEADER, 0);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_POST, 1);    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);    curl_exec($ch);    curl_close($ch);    //带着上面得到的COOKIE获取需要登录后才能查看的页面内容    $ch = curl_init($get_url);    curl_setopt($ch, CURLOPT_HEADER, 0);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);    $contents = curl_exec($ch);    curl_close($ch);    var_dump($contents);    ?>
php curl常用的5个例子我用php ,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。1,抓取无访问控制文件    <?php       $ch = curl_init();       curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/phpinfo.php");       curl_setopt($ch, CURLOPT_HEADER, false);       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出       $result=curl_exec($ch);       curl_close($ch);       ?>  2,使用代理进行抓取为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。google对你的ip地址做限制这个时候,你可以换代理重新抓。    <?php       $ch = curl_init();       curl_setopt($ch, CURLOPT_URL, "http://blog.51yip.com");       curl_setopt($ch, CURLOPT_HEADER, false);       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);       curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);       curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080);       //url_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');如果要密码的话,加上这个       $result=curl_exec($ch);       curl_close($ch);       ?>  3,post数据后,抓取数据单独说一下数据提交数据,因为用 curl的时候,很多时候会有数据交互的,所以比较重要的。    <?php       $ch = curl_init();       /*在这里需要注意的是,要提交的数据不能是二维数组或者更高      *例如array('name'=>serialize(array('tank','zhang')),'sex'=>1,'birth'=>'20101010')      *例如array('name'=>array('tank','zhang'),'sex'=>1,'birth'=>'20101010')这样会报错的*/      $data = array('name' => 'test', 'sex'=>1,'birth'=>'20101010');       curl_setopt($ch, CURLOPT_URL, 'http://localhost/mytest/curl/upload.php');       curl_setopt($ch, CURLOPT_POST, 1);       curl_setopt($ch, CURLOPT_POSTFIELDS, $data);       curl_exec($ch);       ?>  在 upload.php文件中,print_r($_POST);利用curl就能抓取出upload.php输出的内容Array ( [name] => test [sex] => 1 [birth] => 20101010 )4,抓取一些有页面访问控制的页面以前写过一篇,页面访问控制的3种方法有兴趣的可以看一下。如果用上面提到的方法抓的话,会报以下错误You are not authorized to view this pageYou do not have permission to view this directory or page using the credentials that you supplied because your Web browser is sending a WWW-Authenticate header field that the Web server is not configured to accept.这个时候,我们就要用CURLOPT_USERPWD来进行验证了    <?php       $ch = curl_init();       curl_setopt($ch, CURLOPT_URL, "http://club-china");       /*CURLOPT_USERPWD主要用来破解页面访问控制的      *例如平时我们所以htpasswd产生页面控制等。*/      //curl_setopt($ch, CURLOPT_USERPWD, '231144:2091XTAjmd=');       curl_setopt($ch, CURLOPT_HTTPGET, 1);       curl_setopt($ch, CURLOPT_REFERER, "http://club-china");       curl_setopt($ch, CURLOPT_HEADER, 0);       $result=curl_exec($ch);       curl_close($ch);       ?>  5,模拟登录到sina我们要抓取数据,可能是登录以后的内容,这个时候我们就要用到curl的模拟登录功能了。   <?php       function checklogin( $user, $password )       {       if ( emptyempty( $user ) || emptyempty( $password ) )       {       return 0;       }       $ch = curl_init( );       curl_setopt( $ch, CURLOPT_REFERER, "http://mail.sina.com.cn/index.html" );       curl_setopt( $ch, CURLOPT_HEADER, true );       curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );       curl_setopt( $ch, CURLOPT_USERAGENT, USERAGENT );       curl_setopt( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );       curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );       curl_setopt( $ch, CURLOPT_URL, "http://mail.sina.com.cn/cgi-bin/login.cgi" );       curl_setopt( $ch, CURLOPT_POST, true );       curl_setopt( $ch, CURLOPT_POSTFIELDS, "&logintype=uid&u=".urlencode( $user )."&psw=".$password );       $contents = curl_exec( $ch );       curl_close( $ch );       if ( !preg_match( "/Location: (.*)\\/cgi\\/index\\.php\\?check_time=(.*)\n/", $contents, $matches ) )       {       return 0;       }else{       return 1;       }       }        define( "USERAGENT", $_SERVER['HTTP_USER_AGENT'] );       define( "COOKIEJAR", tempnam( "/tmp", "cookie" ) );       define( "TIMEOUT", 500 );        echo checklogin("zhangying215","xtaj227");       ?>  打开/tmp下面的cookie文件看一下# Netscape HTTP Cookie File# http://curl.haxx.se/rfc/cookie_spec.html# This file was generated by libcurl! Edit at your own risk.mail.sina.com.cn    FALSE    /    FALSE    0    SINAMAIL-WEBFACE-SESSID    65223c4bd8900284ed463d2a3e1ac182#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SUE    es%3D8d96db0820c6c79922ad57d422f575e8%26ev%3Dv0%26es2%3Dcddfb8400dc5ca95902367ddcd7f57dd.sina.com.cn    TRUE    /    FALSE    0    SUP    cv%3D1%26bt%3D1286900433%26et%3D1286986833%26lt%3D1%26uid%3D1445632344%26user%3D%25E5%25BC%25A0%25E6%2598%25A02001%26ag%3D2%26name%3Dzhangying20015%2540sina.com%26nick%3D%25E5%25BC%25A0%25E6%2598%25A02001%26sex%3D1%26ps%3D0%26email%3Dzhangying20015%2540sina.com%26dob%3D1982-07-18#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SID    BihcallomxMx-QZxzGrOlcSQx%2F0B%2F0cmr.NyQ%2F0B%2FcmGGalmarlmcHrcGlSmrmxmfxal_CBZ%2F_afugCmmGirBYHm0Bc%40fr5ciZiGG5i#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SPRIAL    bfb4102951fd5892a3fd5b42d442cd26#HttpOnly_.sina.com.cn    TRUE    /    FALSE    0    SINA_USER    %D5%C5%D2001
0 0
原创粉丝点击