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://m.survivalescaperooms.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')//開源代碼Vevb.com
- *例如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種方法.
分類目錄: 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('ADMIN_USERNAME','tank'); // Admin Username
- define('ADMIN_PASSWORD','tank'); // Admin Password
- //log check
- if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
- $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != 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://m.survivalescaperooms.com/”);
- curl_setopt ($ch, CURLOPT_HEADER, 0);
- curl_exec ($ch);
- curl_close ($ch);
新聞熱點
疑難解答