天天看點

php采集

一、 什麼是php采集程式?

二、 為什麼要采集?

三、 采集些什麼?

四、 如何采集?

五、 采集思路

六、 采集範例程式

七、 采集心得

什麼是php采集程式?

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

為什麼要采集?

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

采集些什麼?

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

如何采集?

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

采集思路  

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

1. 擷取遠端檔案源代碼(file_get_contents或用fopen).

     2.分析代碼得到自己想要的内容(這裡用正則比對,一般是得到分頁)。

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

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

php采集

<?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() 方法三********/

        '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擴充。

*/

?>

php采集

采集範例程式

php采集

/*一個圖檔下載下傳函數*/

function getimg($url,$filename){

    /*判斷圖檔的url是否為空,如果為空停止函數*/

    if($url==""){

        return false;

    }

    /*取得圖檔的擴充名,存入變量$ext中*/

    $ext=strrchr($url,".");

    /*判斷是否是合法的圖檔檔案*/

  if($ext!=".gif" && $ext!=".jpg"){

    /*讀取圖檔*/

    $img=file_get_contents($url);

    /*打開指定的檔案*/

    $fp=@fopen($filename.$ext,"a");

    /*寫入圖檔到指點的檔案*/

    fwrite($fp,$img);

    /*關閉檔案*/

    fclose($fp);

    /*傳回圖檔的新檔案名*/

    return $filename.$ext;

php采集

采集圖檔php程式

php采集

View Code

php采集

/**

*  采集圖檔php程式

*

*  Copyright(c) 2008 by 小超(ccxxcc) All rights reserved

*  To contact the author write to {@link mailto:[email protected]}

* @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>');

php采集

 除了以上方法還可以用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