php采集


一、 什么是php采集程序?

二、 為什么要采集?

三、 采集些什么?

四、 如何采集?

五、 采集思路

六、 采集范例程序

七、 采集心得

 

什么是php采集程序?

    php采集程序,也叫php小偷,主要是用於自動搜集網絡上web頁里特定內容,用php語言寫的web程序,運行於支持php的平台上。談到“自動搜集”,你可能聯想到百度goole,聯想到搜索引擎所做的事情。php采集程序,正是做類似的工作。

為什么要采集?

    互聯網正以飛快的速度在發展,web數據每天以幾何級數據量遞增,面對這龐大的數據,作為一個網站管理員的你,該如何搜集自己所需要的信息呢?特別對某個 或某幾個同類網站,你需要它們的大量信息,來充實你的網站內容,難道就只能復制粘貼的過日子嗎?一個網站管理員,你真的就得花大量時間去搞原創內容,而與整個互聯網信息量的發展速度脫節嗎?這些問題的解決方法只有一個:采集。如果有那么一個程序,你幫你的網站自動或半自動的采集你所需要的特定內容,即時更 新你網站的信息,是否是你夢寐以求的呢?這就是采集程序出現的原因所在。

采集些什么?

     這要看你做的什么類型的網站了。如果你做圖片站,就采集圖片;做音樂站,就采集mp3,做新聞站,就采集新聞等等。一切根據你網站的內容架構需要而定。確定你要采集的東西,才好寫出相應的采集程序。

如何采集?

    通常采集程序,都是有的放矢的。也就是需要有目標網站,搜集一些你需要的采集內容的網站,分別對其html代碼進行分析,找出規律性的東西,依據你要采集 的特定內容,寫出php代碼。采集到你要的東西以后,你可以選擇自己需要的存放方式。比如直接生成html頁面,或是放進數據庫,作進一步處理或是存放成 特定的形式,以備后用。

采集思路  

     采集程序的思路很簡單大體可以分為以下幾個步驟:

1. 獲取遠程文件源代碼(file_get_contents或用fopen).

     2.分析代碼得到自己想要的內容(這里用正則匹配,一般是得到分頁)。

     3.跟根得到的內容進行下載入庫等操作。

    在這里第二步有可能要重復的操作好幾次,比如說要先分析一下分頁地址,在分析一下內頁的內容才能取得我們想要的東西。

復制代碼
<?php
/* ***獲取遠程文件源代碼常用三種方法** */
/* **方法一、 fopen(),stream_context_create()方法*** */
$opts =  array(
  'http'=> array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);
$context =  stream_context_create( $opts);
$fp =  fopen('http://www.example.com', 'r',  false$context);
fpassthru( $fp);
fclose( $fp);

 

/******方法二、 socket*******/
function get_content_by_socket($url$host){
    $fp = fsockopen($host, 80) or die("Open ". $url ." failed");
    $header = "GET /".$url ." HTTP/1.1\r\n";
    $header .= "Accept: */*\r\n";
    $header .= "Accept-Language: zh-cn\r\n";
    $header .= "Accept-Encoding: gzip, deflate\r\n";
    $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n";
    $header .= "Host: ". $host ."\r\n";
    $header .= "Connection: Keep-Alive\r\n";
    //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n";
    $header .= "Connection: Close\r\n\r\n";
    fwrite($fp$header);
    while (!feof($fp)) {
        $contents .= fgets($fp, 8192);
    }
    fclose($fp);
    return $contents;
}

/******方法三、file_get_contents (),stream_context_create() 方法三********/
$opts = array(
        'http'=>array(
        'method'=>"GET",
        'header'=>"Content-Type: text/html; charset=utf-8" 
            )
        );        
$context = stream_context_create($opts);        
$file = file_get_contents('http://www.sohu.com/', false$context);        

/******方法四、 PHP的cURL http://www.chinaz.com/program/2010/0119/104346.shtml*******/
$ch = curl_init();
// 2. 設置選項,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.sohu.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch,CURLOPT_HTTPHEADER,array ("Content-Type: text/xml; charset=utf-8","Expect: 100-continue"));
// 3. 執行並獲取HTML文檔內容
$output = curl_exec($ch);
var_dump($output);
// 4. 釋放curl句柄
curl_close($ch);

/*注意
1.使用file_get_contents和fopen必須空間開啟allow_url_fopen。方法:編輯php.ini,設置 allow_url_fopen = On,allow_url_fopen關閉時fopen和file_get_contents都不能打開遠程文件。
2. 使用curl必須空間開啟curl。方法:windows下修改php.ini,將extension=php_curl.dll前面的分號去掉,而且需 要拷貝ssleay32.dll和libeay32.dll到C:/WINDOWS/system32下;Linux下要安裝curl擴展。
*/
?>

復制代碼

 

采集范例程序

 

復制代碼
/* 一個圖片下載函數 */
function getimg( $url, $filename){
     /* 判斷圖片的url是否為空,如果為空停止函數 */
     if( $url==""){
         return  false;
    }
     /* 取得圖片的擴展名,存入變量$ext中 */
     $ext= strrchr( $url,".");
     /* 判斷是否是合法的圖片文件 */
   if( $ext!=".gif" &&  $ext!=".jpg"){
         return  false;
    }
     /* 讀取圖片 */
     $img= file_get_contents( $url);
     /* 打開指定的文件 */
     $fp=@ fopen( $filename. $ext,"a");
     /* 寫入圖片到指點的文件 */
     fwrite( $fp, $img);
     /* 關閉文件 */
     fclose( $fp);
     /* 返回圖片的新文件名 */
     return  $filename. $ext;
}
復制代碼

 

采集圖片 php 程序

 

View Code
復制代碼
<?php
/* *
*  采集圖片php程序
*
*  Copyright(c) 2008 by 小超(ccxxcc) All rights reserved
*
*  To contact the author write to {@link mailto:ucitmc@163.com}
*
* @author ccxxcc
* @version $Id: {filename},v 1.0 {time} $
* @package system
*/

set_time_limit(0);
/* *
* 寫文件
* @param    string  $file   文件路徑
* @param    string  $str    寫入內容
* @param    char    $mode   寫入模式
*/
function wfile( $file, $str, $mode='w')
{
     $oldmask = @ umask(0);
     $fp = @ fopen( $file, $mode);
    @ flock( $fp, 3);
     if(! $fp)
    {
         Return  false;
    }
     else
    {
        @ fwrite( $fp, $str);
        @ fclose( $fp);
        @ umask( $oldmask);
         Return  true;
    }
}

function savetofile( $path_get, $path_save)
{
        @ $hdl_read =  fopen( $path_get,'rb');
         if( $hdl_read ==  false)
        {
                 echo("<span style='color:red'> $path_get can not get</span>");
                 Return ;
        }
         if( $hdl_read)
        {
                @ $hdl_write =  fopen( $path_save,'wb');
                 if( $hdl_write)
                {
                         while(! feof( $hdl_read))
                        {
                                 fwrite( $hdl_write, fread( $hdl_read,8192));
                        }
                         fclose( $hdl_write);
                         fclose( $hdl_read);
                         return 1;
                }
                 else
                         return 0;
        }
         else
                 return -1;
}

function getExt( $path)
{
         $path =  pathinfo( $path);
         return  strtolower( $path['extension']);
}

/* *
* 按指定路徑生成目錄
*
* @param    string     $path    路徑
*/
function mkDirs( $path)
{
     $adir =  explode('/', $path);
     $dirlist = '';
     $rootdir =  array_shift( $adir);
     if(( $rootdir!='.'|| $rootdir!='..')&&! file_exists( $rootdir))
    {
        @ mkdir( $rootdir);
    }
     foreach( $adir  as  $key=> $val)
    {
         if( $val!='.'&& $val!='..')
        {
             $dirlist .= "/". $val;
             $dirpath =  $rootdir. $dirlist;
             if(! file_exists( $dirpath))
            {
                @ mkdir( $dirpath);
                @ chmod( $dirpath,0777);
            }
        }
    }
}

/* *
* 從文本中取得一維數組
*
* @param    string     $file_path    文本路徑
*/
function getFileListData( $file_path)
{
     $arr = @ file( $file_path);
     $data =  array();
     if( is_array( $arr) && ! empty( $arr))
    {
         foreach( $arr  as  $val)
        {
             $item =  trim( $val);
             if(! empty( $item))
            {
                 $data[] =  $item;
            }
        }
    }
     Return  $data;
}

// 采集開始

//傳入自己的需要采集的圖片url列表文本文件 每個圖片url寫一行

$url_file =  isset( $_GET['file'])&&! empty( $_GET['file'])? $_GET['file']: null;
$txt_url = "txt/". $url_file;

$urls =  array_unique(getFileListData( $txt_url));
if( empty( $urls))
{
         echo('<div style="color:red">無鏈接地址</div>');
         die();
}
$save_url = "images/". date("y_m_d", time())."/";
mkDirs( $save_url);   // 按日期建立文件夾
$i = 1;
if( is_array( $urls)&& count( $urls))
{
         foreach( $urls  as  $val)
        {
                savetofile( $val, $save_url. date("His", time())."_". $i.".".getExt( $val));
                 echo( $i.".".getExt( $val)." got\n");
                 $i++;
        }
}

echo('<div style="color:green">finish</div>');

?>
復制代碼

 

 除了以上方法還可以用Snoopy,也不錯。

 

Snoopy是什么? (下載 snoopy
 
Snoopy是一個php類,用來模仿web瀏覽器的功能,它能完成獲取網頁內容和發送表單的任務。
 
Snoopy的一些特點:
 
* 方便抓取網頁的內容
 
* 方便抓取網頁的文本內容 (去除HTML標簽)
 
* 方便抓取網頁的鏈接
 
* 支持代理主機
 
* 支持基本的用戶名/密碼驗證
 
* 支持設置 user_agent, referer(來路), cookies 和 header content(頭文件)
 
* 支持瀏覽器轉向,並能控制轉向深度
 
* 能把網頁中的鏈接擴展成高質量的url(默認)
 
* 方便提交數據並且獲取返回值
 
* 支持跟蹤HTML框架(v0.92增加)
 
* 支持再轉向的時候傳遞cookies (v0.92增加)

 

 

采集心得

共享一下個人的采集心德:

  1.不采那些作防盜鏈了的站,其實可以作假來路但是這樣的站采集成本太高

  2.采集盡量快的站,最好在本地進行采集

  3.采集時有很多時候可以先把一部分數據存入數據庫,等以后進行下一步的處理。

  4.采集的時候一定要作好出錯處理,我一般都是如果采集三次沒有成功就跳過。以前經常就因為一條內容不能采就卡在那里一直的采。

  5.入庫前一定要作好判斷,檢查內容的合法,過濾不必要的字符串。

 

來源:http://www.cnblogs.com/mo-beifeng/articles/2457463.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM