標籤:php單線程爬蟲類
代碼:/*** @desc:單線程爬蟲類* @author [Lee] <[<[email protected]>]>* @property* 1、callcontent 擷取給定url頁面中的內容的回呼函數* 2、calltodo 處理商務邏輯的回呼函數 如:把抓取到的內容處理後存到資料庫* @method* run 執行爬蟲程式* @param depth 深度 預設2* @return void*/class crawl{public $callcontent = ‘getcontent‘; # 擷取給定url頁面中的內容的回呼函數public $calltodo = ‘todo‘; # 處理商務邏輯的回呼函數 如:把抓取到的內容處理後存到資料庫private $url; # 內部屬性:當前處理中的url/* @desc:內部方法,調用回呼函數擷取頁面內容 @param url 傳入到回呼函數的參數 @return ret 頁面內容 */private function getcontent($url){ $callback = $this->callcontent; $ret = call_user_func($callback,$url); return $ret;}/* @desc:內部方法,調用回呼函數進行業務處理 @param content 傳入到回呼函數的參數 */private function todo($content){ $callback = $this->calltodo; call_user_func($callback,$content);}/* @desc:內部方法,擷取頁面中的超連結 @param content 頁面內容 @return urls 擷取到的超連結 */private function geturl($content){ $preg = ‘/<[a|A].*?href=[\‘\"]{0,1}([^>\‘\"\ ]*).*?>/‘; $bool = preg_match_all($preg,$content,$res); $urls = array(); if($bool){ $urls = $res[1]; } $urls = array_unique($urls); return $urls;}/* @desc:內部方法,修複不完整的url @param url 原始url @param url 修複好的url */private function reviseurl($url){ $info = parse_url($url); $scheme = $info["scheme"]?:‘http‘; $user = $info["user"]; $pass = $info["pass"]; $host = $info["host"]; $port = $info["port"]; $path = $info["path"]; $url = $scheme . ‘://‘; if ($user && $pass) { $url .= $user . ":" . $pass . "@"; } $url .= $host; if ($port) { $url .= ":" . $port; } $url .= $path; return $url;}/* @desc:構造方法,初始化url */public function __construct($url){ $this->url = $url;}/* @desc:主方法,執行程式 @param depth 挖掘深度 預設2 */public function run($depth = 2){ $url = $this->url; if($depth > 0){ $depth--; $content = $this->getcontent($url); // 業務處理開始 $this->todo($content); // 業務處理結束 $urls = $this->geturl($content); $url = $this->reviseurl($url); if (is_array($urls) && !empty($urls)) { foreach ($urls as $u) { if (preg_match(‘/^http/‘, $u)) { $returl = $u; } else { $real = $url . ‘/‘ . $u; $returl = $real; } $crawl = new crawl($returl); $crawl->run($depth); } } }}}
測試:$crawl = new crawl(‘www.baidu.com‘);$crawl->run();/*@desc:擷取內容的回調*/function getcontent($url){$http = new http($url);$ret = $http->get()->run();return $ret;}/*@desc:處理商務邏輯的回調*/function todo($content){echo ‘執行內容‘.PHP_EOL;}
輸出:執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容執行內容
php單線程爬蟲類