»ùÓÚSnoopyµÄPHP½üËÆÍêÃÀ»ñÈ¡ÍøÕ¾±àÂëµÄ´úÂë

¡¡¡¡ÏÈÒªµ½ÍøÉÏÏÂÔØSnoopy.class.php

¡¡¡¡µ÷Ó÷½·¨£º

¡¡¡¡

¸´ÖÆ´úÂë ´úÂëÈçÏÂ:

¡¡¡¡<?php

¡¡¡¡require 'lib/Snoopy.class.php';

¡¡¡¡require 'lib/WebCrawl.class.php';//°üº¬ÏÂÃæ´úÂë

¡¡¡¡$go=new WebCrawl('http://www.baidu.com');

¡¡¡¡echo $go->getCharset();

¡¡¡¡?>

¡¡¡¡

¸´ÖÆ´úÂë ´úÂëÈçÏÂ:

¡¡¡¡<?php

¡¡¡¡class WebCrawl

¡¡¡¡{

¡¡¡¡private $url;

¡¡¡¡private $request;

¡¡¡¡public $charset_arr=array(

¡¡¡¡'gb2312',

¡¡¡¡'utf-8',

¡¡¡¡'big5',

¡¡¡¡'gbk',

¡¡¡¡'ascii',

¡¡¡¡'cp936',

¡¡¡¡'ibm037',

¡¡¡¡'ibm437',

¡¡¡¡'ibm500',

¡¡¡¡'asmo-708',

¡¡¡¡'dos-720',

¡¡¡¡'ibm737',

¡¡¡¡'ibm775',

¡¡¡¡'ibm850',

¡¡¡¡'ibm852',

¡¡¡¡'ibm855',

¡¡¡¡'ibm857',

¡¡¡¡'ibm00858',

¡¡¡¡'ibm861',

¡¡¡¡'ibm860',

¡¡¡¡'dos-862',

¡¡¡¡'ibm863',

¡¡¡¡'ibm864',

¡¡¡¡'ibm865',

¡¡¡¡'cp866',

¡¡¡¡'ibm869',

¡¡¡¡'ibm870',

¡¡¡¡'windows-874',

¡¡¡¡'cp875',

¡¡¡¡'shift_jis',

¡¡¡¡'ks_c_5601-1987',

¡¡¡¡'ibm1026',

¡¡¡¡'ibm01047',

¡¡¡¡'ibm01047',

¡¡¡¡'ibm01040',

¡¡¡¡'ibm01041',

¡¡¡¡'ibm01042',

¡¡¡¡'ibm01043',

¡¡¡¡'ibm01044',

¡¡¡¡'ibm01045',

¡¡¡¡'ibm01046',

¡¡¡¡'ibm01047',

¡¡¡¡'ibm01048',

¡¡¡¡'ibm01049',

¡¡¡¡'utf-16',

¡¡¡¡'unicodefffe',

¡¡¡¡'windows-1250',

¡¡¡¡'windows-1251',

¡¡¡¡'windows-1252',

¡¡¡¡'windows-1253',

¡¡¡¡'windows-1254',

¡¡¡¡'windows-1255',

¡¡¡¡'windows-1256',

¡¡¡¡'windows-1257',

¡¡¡¡'windows-1258',

¡¡¡¡'johab',

¡¡¡¡'macintosh',

¡¡¡¡'x-mac-japanese',

¡¡¡¡'x-mac-chinesetrad',

¡¡¡¡'x-mac-korean',

¡¡¡¡'x-mac-arabic',

¡¡¡¡'x-mac-hebrew',

¡¡¡¡'x-mac-greek',

¡¡¡¡'x-mac-cyrillic',

¡¡¡¡'x-mac-chinesesimp',

¡¡¡¡'x-mac-romanian',

¡¡¡¡'x-mac-ukrainian',

¡¡¡¡'x-mac-thai',

¡¡¡¡'x-mac-ce',

¡¡¡¡'x-mac-icelandic',

¡¡¡¡'x-mac-turkish',

¡¡¡¡'x-mac-croatian',

¡¡¡¡'x-chinese-cns',

¡¡¡¡'x-cp20001',

¡¡¡¡'x-chinese-eten',

¡¡¡¡'x-cp20003',

¡¡¡¡'x-cp20004',

¡¡¡¡'x-cp20005',

¡¡¡¡'x-ia5',

¡¡¡¡'x-ia5-german',

¡¡¡¡'x-ia5-swedish',

¡¡¡¡'x-ia5-norwegian',

¡¡¡¡'us-ascii',

¡¡¡¡'x-cp20261',

¡¡¡¡'x-cp20269',

¡¡¡¡'ibm273',

¡¡¡¡'ibm277',

¡¡¡¡'ibm278',

¡¡¡¡'ibm280',

¡¡¡¡'ibm284',

¡¡¡¡'ibm285',

¡¡¡¡'ibm290',

¡¡¡¡'ibm420',

¡¡¡¡'ibm423',

¡¡¡¡'ibm424',

¡¡¡¡'x-ebcdic-koreanextended',

¡¡¡¡'ibm-thai',

¡¡¡¡'koi8-r',

¡¡¡¡'ibm871',

¡¡¡¡'ibm880',

¡¡¡¡'ibm905',

¡¡¡¡'ibm00924',

¡¡¡¡'x-cp20936',

¡¡¡¡'x-cp20949',

¡¡¡¡'cp1025',

¡¡¡¡'koi8-u',

¡¡¡¡'iso-8859-1',

¡¡¡¡'iso-8859-2',

¡¡¡¡'iso-8859-3',

¡¡¡¡'iso-8859-4',

¡¡¡¡'iso-8859-5',

¡¡¡¡'iso-8859-6',

¡¡¡¡'iso-8859-7',

¡¡¡¡'iso-8859-8',

¡¡¡¡'iso-8859-9',

¡¡¡¡'iso-8859-13',

¡¡¡¡'iso-8859-15',

¡¡¡¡'x-europa',

¡¡¡¡'iso-8859-8-i',

¡¡¡¡'iso-2022-jp',

¡¡¡¡'csiso2022jp',

¡¡¡¡'iso-2022-jp',

¡¡¡¡'iso-2022-kr',

¡¡¡¡'x-cp50227',

¡¡¡¡'euc-jp',

¡¡¡¡'euc-cn',

¡¡¡¡'euc-kr',

¡¡¡¡'hz-gb-2312',

¡¡¡¡'gb18030',

¡¡¡¡'x-iscii-de',

¡¡¡¡'x-iscii-be',

¡¡¡¡'x-iscii-ta',

¡¡¡¡'x-iscii-te',

¡¡¡¡'x-iscii-as',

¡¡¡¡'x-iscii-or',

¡¡¡¡'x-iscii-ka',

¡¡¡¡'x-iscii-ma',

¡¡¡¡'x-iscii-gu',

¡¡¡¡'x-iscii-pa',

¡¡¡¡'utf-7',

¡¡¡¡'utf-32',

¡¡¡¡'utf-32be'

¡¡¡¡);

¡¡¡¡public function __construct($url)

¡¡¡¡{

¡¡¡¡$this->url=$url;

¡¡¡¡}

¡¡¡¡//´ò¿ªÍøÕ¾

¡¡¡¡private function open($url)

¡¡¡¡{

¡¡¡¡if($this->request!==null)

¡¡¡¡{

¡¡¡¡if($this->request->status==200)

¡¡¡¡{

¡¡¡¡return true;

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡$this->request=new Snoopy();

¡¡¡¡$this->request->fetch($url);

¡¡¡¡if($this->request->status==200)

¡¡¡¡{

¡¡¡¡$this->request->results=strtolower($this->request->results);

¡¡¡¡$charset=$this->getCharset();

¡¡¡¡if($charset!="utf-8")

¡¡¡¡{

¡¡¡¡if($charset=="windows-1252")

¡¡¡¡{

¡¡¡¡$this->request->results=$this->uni_decode($this->request->results);

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡$this->request->results=mb_convert_encoding($this->request->results,"UTF-8",$charset);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡return true;

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡//»ñÈ¡ÍøÕ¾title,keywords,description

¡¡¡¡public function getWebinfo()

¡¡¡¡{

¡¡¡¡$info=array(

¡¡¡¡'title'=>'',

¡¡¡¡'keywords'=>'',

¡¡¡¡'desc'=>'',

¡¡¡¡'ip'=>''

¡¡¡¡);

¡¡¡¡if(!$this->open($this->url)){return $info;exit;}

¡¡¡¡// print_r($this->request->results);exit;

¡¡¡¡preg_match('/<title>([^>]*)<\/title>/si', $this->request->results, $titlematch );

¡¡¡¡if (isset($titlematch) && is_array($titlematch) && count($titlematch) > 0)

¡¡¡¡{

¡¡¡¡$info['title'] = strip_tags($titlematch[1]);

¡¡¡¡}

¡¡¡¡preg_match_all('/<[\s]*meta[\s]*name="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $this->request->results, $match);

¡¡¡¡$ft=0;

¡¡¡¡foreach($match[1] as $mt)

¡¡¡¡{

¡¡¡¡if($mt=="keywords" || $mt=="description")

¡¡¡¡{

¡¡¡¡$ft=1;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡if($ft==0)

¡¡¡¡{

¡¡¡¡preg_match_all('/<[\s]*meta[\s]*content="?([^>"]*)"?[\s]*name="?' . '([^>"]*)"?[\s]*[\/]?[\s]*>/si', $this->request->results, $match);

¡¡¡¡if (isset($match) && is_array($match) && count($match) == 3)

¡¡¡¡{

¡¡¡¡$originals = $match[0];

¡¡¡¡$names = $match[2];

¡¡¡¡$values = $match[1];

¡¡¡¡if (count($originals) == count($names) && count($names) == count($values))

¡¡¡¡{

¡¡¡¡$metaTags = array();

¡¡¡¡for ($i=0, $limiti=count($names); $i < $limiti; $i++)

¡¡¡¡{

¡¡¡¡$metaTags[$names[$i]] = array (

¡¡¡¡'html' => htmlentities($originals[$i]),

¡¡¡¡'value' => $values[$i]

¡¡¡¡);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡if (isset($match) && is_array($match) && count($match) == 3)

¡¡¡¡{

¡¡¡¡$originals = $match[0];

¡¡¡¡$names = $match[1];

¡¡¡¡$values = $match[2];

¡¡¡¡if (count($originals) == count($names) && count($names) == count($values))

¡¡¡¡{

¡¡¡¡$metaTags = array();

¡¡¡¡for ($i=0, $limiti=count($names); $i < $limiti; $i++)

¡¡¡¡{

¡¡¡¡$metaTags[$names[$i]] = array (

¡¡¡¡'html' => htmlentities($originals[$i]),

¡¡¡¡'value' => $values[$i]

¡¡¡¡);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡$result = array (

¡¡¡¡'metaTags' => $metaTags

¡¡¡¡);

¡¡¡¡if(isset($result['metaTags']['keywords']['value']))

¡¡¡¡{

¡¡¡¡$info['keywords']=$result['metaTags']['keywords']['value'];

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡$info['keywords']="";

¡¡¡¡}

¡¡¡¡if(isset($result['metaTags']['description']['value']))

¡¡¡¡{

¡¡¡¡$info['desc']=$result['metaTags']['description']['value'];

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡$info['desc']="";

¡¡¡¡}

¡¡¡¡$domain=preg_replace('/http\:\/\//si', '', $this->url);

¡¡¡¡$ip=@gethostbyname($domain);

¡¡¡¡$ip_arr=explode(".", $ip);

¡¡¡¡if(count($ip_arr)==4)

¡¡¡¡{

¡¡¡¡$info['ip']=$ip;

¡¡¡¡}

¡¡¡¡return $info;

¡¡¡¡}

¡¡¡¡public function t($string,$o)

¡¡¡¡{

¡¡¡¡for($i=0;$i<strlen($string);$i++)

¡¡¡¡{

¡¡¡¡if(ord($string{$i})<128)

¡¡¡¡continue;

¡¡¡¡if((ord($string{$i})&224)==224)

¡¡¡¡{

¡¡¡¡//µÚÒ»¸ö×Ö½ÚÅжÏͨ¹ý

¡¡¡¡$char = $string{++$i};

¡¡¡¡if((ord($char)&128)==128)

¡¡¡¡{

¡¡¡¡//µÚ¶þ¸ö×Ö½ÚÅжÏͨ¹ý

¡¡¡¡$char = $string{++$i};

¡¡¡¡if((ord($char)&128)==128)

¡¡¡¡{

¡¡¡¡$encoding = "UTF-8";

¡¡¡¡break;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡if((ord($string{$i})&192)==192)

¡¡¡¡{

¡¡¡¡//µÚÒ»¸ö×Ö½ÚÅжÏͨ¹ý

¡¡¡¡$char = $string{++$i};

¡¡¡¡if((ord($char)&128)==128)

¡¡¡¡{

¡¡¡¡//µÚ¶þ¸ö×Ö½ÚÅжÏͨ¹ý

¡¡¡¡$encoding = "GB2312";

¡¡¡¡break;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡return strtolower($encoding);

¡¡¡¡}

¡¡¡¡function uni_decode ($str, $code = 'utf-8'){

¡¡¡¡$str = json_decode(preg_replace_callback('/&#(\d{5});/', create_function('$dec', 'return \'\\u\'.dechex($dec[1]);'), '"'.$str.'"'));

¡¡¡¡if($code != 'utf-8'){ $str = iconv('utf-8', $code, $str); }

¡¡¡¡return $str;

¡¡¡¡}

¡¡¡¡//»ñÈ¡ÍøÕ¾±àÂë

¡¡¡¡public function getCharset()

¡¡¡¡{

¡¡¡¡if(!$this->open($this->url)){return false;exit;}

¡¡¡¡//Ê×ÏÈ´Óhtml»ñÈ¡±àÂë

¡¡¡¡preg_match("/<meta.+?charset=[^\w]?([-\w]+)/i",$this->request->results,$temp) ? strtolower($temp[1]):"";

¡¡¡¡if($temp[1]!="")

¡¡¡¡{

¡¡¡¡if(in_array($temp[1], $this->charset_arr))

¡¡¡¡{

¡¡¡¡if($temp[1]=="gb2312")

¡¡¡¡{

¡¡¡¡$tmp_charset=$this->t($this->request->results,$temp[1]);

¡¡¡¡if($tmp_charset==$temp[1])

¡¡¡¡{

¡¡¡¡return $temp[1];

¡¡¡¡}

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡return $temp[1];

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡if(!empty($this->request->headers))

¡¡¡¡{

¡¡¡¡//´ÓheaderÖлñÈ¡±àÂë

¡¡¡¡$hstr=strtolower(implode("|||",$this->request->headers));

¡¡¡¡preg_match("/charset=[^\w]?([-\w]+)/is",$hstr,$lang) ? strtolower($lang[1]):"";

¡¡¡¡if($lang[1]!="")

¡¡¡¡{

¡¡¡¡return $lang[1];

¡¡¡¡}

¡¡¡¡}

¡¡¡¡$encode_arr=array("UTF-8","GB2312","GBK","BIG5","ASCII","EUC-JP","Shift_JIS","CP936","ISO-8859-1","JIS","eucjp-win","sjis-win");

¡¡¡¡$encoded=mb_detect_encoding($this->request->results,$encode_arr);

¡¡¡¡if($encoded)

¡¡¡¡{

¡¡¡¡return strtolower($encoded);

¡¡¡¡}

¡¡¡¡else

¡¡¡¡{

¡¡¡¡return false;

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡?>