curl常用的5个经典例子,函数对比

复制代码
代码如下://最近需要用到curl测试代理是否可用,代理是sock5非http的
所以需要在curl中增加几句。 curl_setopt($ch, CURLOPT_PROXYTYPE,
CURLPROXY_SOCKS5); curl_setopt($ch, CURLOPT_PROXY, “0.0.0.0:8080”);
curl_setopt($ch,CURLOPT_PROXYUSERPWD, “username:pwd”); //测试ok
速度很快 哈哈

下面是curl扩展开启的步骤:

我用php
,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。

1、将PHP文件夹下的三个文件php_curl.dll,libeay32.dll,ssleay32.dll复制到system32下;
2、将php.ini(c:WINDOWS目录下)中的;extension=php_curl.dll中的分号去掉;

1,抓取无访问控制文件

3、重启apache或者IIS。

 

我们先来看看两个函数的简单实例

 代码如下

curl()函数

<?php

 代码如下

 $ch= curl_init();

$ch = curl_init(“”);
curl_exec($ch);
curl_close($ch);

 curl_setopt($ch, CURLOPT_URL,””);

//$ch = curl_init(“要采集的网址”); 
curl_init()函数的作用初始化一个curl会话

 curl_setopt($ch, CURLOPT_HEADER, false);

//curl_exec($ch);执行$ch

 curl_setopt($ch, CURLOPT_RETURNTRANSFER,
1);//如果把这行注释掉的话,就会直接输出

//curl_close($ch); 关闭$ch

 $result=curl_exec($ch);

file_get_contents函数

 curl_close($ch);

例子

 ?>

 代码如下

 

<?php
echo
file_get_contents(“http://www.111cn.net”);
?>

2,使用代理进行抓取

输出:

为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。google对你的ip地址做限制这个时候,你可以换代理重新抓。

 代码如下

 

This is a test file with test text.

 代码如下

总结

<pre name=”code”class=”php”><?php

fopen / file_get_contents
每次请求都会重新做DNS查询,并不对DNS信息进行缓存。
但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。
所以CURL的性能比fopen / file_get_contents 好很多。

 $ch= curl_init();

file_get_contents与curl效率及稳定性问题

 curl_setopt($ch, CURLOPT_URL,””);

 代码如下

 curl_setopt($ch, CURLOPT_HEADER, false);

$config[‘context’] = stream_context_create(array(‘http’ =>
array(‘method’ => “GET”,’timeout’ => 5))); 

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 
‘timeout’ =>
5//这个超时时间不稳定,经常不好使。这时候,看一下服务器的连接池,会发现一堆类似下面的错误,让你头疼万分:

 curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);

 代码如下

 curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080);

file_get_contents(): failed to open stream… 

 //url_setopt($ch, CURLOPT_PROXYUSERPWD,
‘user:password’);如果要密码的话,加上这个

 

 $result=curl_exec($ch);

不得已,安装了curl库,写了一个函数替换:

 curl_close($ch);

 代码如下

 ?>

function curl_get_contents($url)  
{  
   $ch = curl_init();  
   curl_setopt($ch,
CURLOPT_URL, $url);            //设置访问的url地址  
   //curl_setopt($ch,CURLOPT_HEADER,1);           
//是否显示头部信息  
   curl_setopt($ch, CURLOPT_TIMEOUT, 5);           //设置超时  
   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);  
//用户访问代理 User-Agent  
   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);        //设置
referer  
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);      //跟踪301  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果  
    $r = curl_exec($ch);  
    curl_close($ch);  
    return $r;  

 

如此,除了真正的网络问题外,没再出现任何问题。
这是别人做过的关于curl和file_get_contents的测试:
file_get_contents抓取google.com需用秒数:

3,post数据后,抓取数据

 代码如下

单独说一下数据提交数据,因为用
curl的时候,很多时候会有数据交互的,所以比较重要的。

1.2.31319094  
2.2.30374217  
3.2.21512604  
4.3.30553889  
5.2.30124092 

 

curl使用的时间:

 代码如下

1.0.68719101  
2.0.64675593  
3.0.64326  
4.0.81983113  
5.0.63956594 

<?php

那么如何根据服务器情况来使用file_get_contents还是curl()呢,下面我们可以利用function_exists函数来判断php是否支持一个函数可以轻松写出下面函数

 $ch= curl_init();

 代码如下

 /*在这里需要注意的是,要提交的数据不能是二维数组或者更高

< ?php
 function vita_get_url_content($url) {
 if(function_exists(‘file_get_contents’)) {
 $file_contents = file_get_contents($url);
 } else {
 $ch = curl_init();
 $timeout = 5; 
 curl_setopt ($ch, CURLOPT_URL, $url);
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
 $file_contents = curl_exec($ch);
 curl_close($ch);
 }
 return $file_contents;
 }
 ?>

 *例如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,”);

 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,抓取一些有页面访问控制的页面

图片 1

以前写过一篇,页面访问控制的3种方法有兴趣的可以看一下。

如果用上面提到的方法抓的话,会报以下错误

You are not authorized to view this page
You 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,””);

 /*CURLOPT_USERPWD主要用来破解页面访问控制的

 *例如平时我们所以htpasswd产生页面控制等。*/

 //curl_setopt($ch, CURLOPT_USERPWD, ‘user:password’);

 curl_setopt($ch, CURLOPT_HTTPGET, 1);

 curl_setopt($ch, CURLOPT_REFERER,””);

 curl_setopt($ch, CURLOPT_HEADER, 0);

 $result=curl_exec($ch);

 curl_close($ch);

 ?>