Rumah >php教程 >php手册 >php curl 抓取页面几种方法介绍

php curl 抓取页面几种方法介绍

WBOY
WBOYasal
2016-05-25 16:39:351585semak imbas

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

例 1,使用PHP的CURL模块取回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://www.phprm.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, &#39;user:password&#39;);如果要密码的话,加上这个 
$result=curl_exec($ch); 
curl_close($ch);

3,post数据后,抓取数据

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

<?php 
$ch = curl_init(); 
/*在这里需要注意的是,要提交的数据不能是二维数组或者更高 
*例如array(&#39;name&#39;=>serialize(array(&#39;tank&#39;,&#39;zhang&#39;)),&#39;sex&#39;=>1,&#39;birth&#39;=>&#39;20101010&#39;)//开源代码phprm.com 
*例如array(&#39;name&#39;=>array(&#39;tank&#39;,&#39;zhang&#39;),&#39;sex&#39;=>1,&#39;birth&#39;=>&#39;20101010&#39;)这样会报错的*/ 
$data = array(&#39;name&#39; => &#39;test&#39;, &#39;sex&#39;=>1,&#39;birth&#39;=>&#39;20101010&#39;); 
curl_setopt($ch, CURLOPT_URL, &#39;http://localhost/mytest/curl/upload.php&#39;); 
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种方法.

分类目录: apache/nginx

apache 页面访问控制:为什么要进行这样的控制呢,给不同的人看不同的东西,对信息进行保护,虽然这种保护比较低级,多多少少还是有点用的.

一,用htpasswd命令,产生权限控制文件,代码如下:

1.[zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看    

2.New password:            //提示输入密码    

3.Re-type new password:        //重复密码    

4.Adding password for user tank    

5.[zhangy@BlackGhost test]$ cat access    //查看一下密码文件    

6.tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。   

[zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看 

New password:            //提示输入密码 

Re-type new password:        //重复密码 

Adding password for user tank 

[zhangy@BlackGhost test]$ cat access    //查看一下密码文件 

tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。到这儿密码文件是生成好了。 

二,页面访问控制方法

1,能过修改httpd.conf或者是httpd-vhosts.conf来进行配置,代码如下:

listen 10004 
NameVirtualHost *:10004 
<VirtualHost *:10004> 
DocumentRoot "/home/zhangy/www/test" 
ServerName *:10004 
BandwidthModule On 
ForceBandWidthModule On 
Bandwidth all 1024000 
MinBandwidth all 50000 
LargeFileLimit * 500 50000 
MaxConnection all 2 
ErrorLog "/home/zhangy/apache/blog.51yip.com.com-error.log" 
CustomLog "/home/zhangy/apache/blog.51yip.com-access.log" common

//看一下,下面的配置 

<Directory /home/zhangy/www/test> 
AuthType Basic 
AuthName "access test" 
AuthUserFile /home/zhangy/www/test/access 
Require valid-user 
</Directory> 
</VirtualHost>

2,我们可以利用.htaccess文件来进行控制,在test的根目录下面建一个.htaccess的文件,代码如下:

[zhangy@BlackGhost test]$ vi .htaccess   //打开个文件 ,添加权限内容 
[zhangy@BlackGhost test]$ cat .htaccess  //下面就是.htaccess的内容 
AuthType Basic 
AuthName "access test" 
AuthUserFile /home/zhangy/www/test/access 
Require valid-user

3,不用密码文件,也可以进行访问控制,代码如下:

define(&#39;ADMIN_USERNAME&#39;,&#39;tank&#39;); // Admin Username 
define(&#39;ADMIN_PASSWORD&#39;,&#39;tank&#39;); // Admin Password 
//log check 
if (!isset($_SERVER[&#39;PHP_AUTH_USER&#39;]) || !isset($_SERVER[&#39;PHP_AUTH_PW&#39;]) || 
$_SERVER[&#39;PHP_AUTH_USER&#39;] != ADMIN_USERNAME ||$_SERVER[&#39;PHP_AUTH_PW&#39;] != ADMIN_PASSWORD) { 
Header("WWW-Authenticate: Basic realm="access test""); 
Header("HTTP/1.0 401 Unauthorized"); 
echo <<<EOB 
<html><body>; 
<h1>Rejected!</h1>
<big>Wrong Username or Password!</big>; 
</body></html>; 
EOB;
exit; 
}

curl相关函数列表:

curl_init — 初始化一个CURL会话
curl_setopt — 为CURL调用设置一个选项
curl_exec — 执行一个CURL会话
curl_close — 关闭一个CURL会话
curl_version — 返回当前CURL版本
curl_init — 初始化一个CURL会话

描述:int curl_init ([string url])

curl_init()函数将初始化一个新的会话,返回一个CURL句柄供 curl_setopt(), curl_exec(),和 curl_close() 函数使用,如果可选参数被提供,那么CURLOPT_URL选项将被设置成这个参数的值,你可以使用curl_setopt()函数人工设置.

例 1.初始化一个新的CURL会话,且取回一个网页,代码如下:

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, "http://www.phprm.com/"); 
curl_setopt ($ch, CURLOPT_HEADER, 0); 
curl_exec ($ch); 
curl_close ($ch);


永久地址:

转载随意~请带上教程地址吧^^

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn