Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Класс cms_http_parse, Парсинг URL, обход followlocation
Форумы портала PHP.SU » PHP » Пользовательские функции » Класс cms_http_parse, Парсинг URL, обход followlocation

Страниц (1): [1]
 

1. ALEN - 06 Марта, 2011 - 21:11:28 - перейти к сообщению
- Класс обходит запрет некоторых хостеров на followlocation
- по желанию кэширует данные
- все данные возращаются в utf-8? автоопределение кодировки источника

!Данные кэшируются максимум на сутки и еще минут в том, что старые данные из папки нужно удалять ручками. Пока еще не реализована эта часть

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class cms_http_parse {
  3.  
  4.   protected $url;
  5.   public $user_agent='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
  6. rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1';
  7.   public $sleep_time=0; // пауза между запросами в секундах
  8.   public $HTTPHEADER=null; // для CURLOPT_HTTPHEADER
  9.   public $ENCODING=null; // для CURLOPT_ENCODING
  10.   public $CURLOPTHEADER=1; // для CURLOPT_ENCODING
  11.   public $COOKIE=''; // для CURLOPT_ENCODING
  12.   public $time_curl=5; // время ожидания запроса к одной странице
  13.   public $cache_dir=false; // папка с файлами кэша './tmp/cache_parser/'
  14.   public $file_coockies=false; // файл с куками './tmp/coockies_http_get.dat'
  15.   public $cache_time_limit=259200; // время хранения кэша в секундах (3 суток)
  16.   public $charset='utf-8'; // кодировка результата данных и хранения кэша
  17.   public $post_array;
  18.   public $charset_ifno='windows-1251';     // если не указана кодировка то считать,
  19.                     // что windows-1251
  20.   public $pref_file_b='.dat'; // Расширения файла с базой
  21.   public $pref_file_s='.html'; // Расширения файла кэша страницы
  22.   public $on_cached; // включение кэширование на +1
  23.  
  24. protected function get_parse($url){
  25.     $ch=curl_init ($url);
  26.     curl_setopt ($ch,CURLOPT_RETURNTRANSFER,1);
  27.     curl_setopt ($ch,CURLOPT_VERBOSE,1);
  28.     curl_setopt ($ch,CURLOPT_HEADER,$this->CURLOPTHEADER);
  29.     curl_setopt ($ch,CURLOPT_TIMEOUT,$this->time_curl);
  30.     curl_setopt ($ch,CURLOPT_USERAGENT,$this->user_agent);
  31.     if($this->COOKIE!=''){
  32.     curl_setopt($ch, CURLOPT_COOKIE, $this->COOKIE);
  33.     } elseif(file_exists($this->file_coockies)) {
  34.     curl_setopt ($ch,CURLOPT_COOKIEJAR,$this->file_coockies);
  35.     curl_setopt ($ch,CURLOPT_COOKIEFILE,$this->file_coockies);
  36.     }
  37.     if (isset($this->post_array)){
  38.        curl_setopt ($ch,CURLOPT_POST,1);
  39.        curl_setopt ($ch,CURLOPT_POSTFIELDS,$this->post_array);
  40.     }
  41.         if ($this->HTTPHEADER!=null){
  42.        curl_setopt ($ch,CURLOPT_HTTPHEADER,$this->HTTPHEADER);
  43.     }
  44.         if ($this->ENCODING!=null){
  45.        curl_setopt ($ch,CURLOPT_ENCODING,$this->ENCODING);
  46.     }
  47.     if($this->sleep_time>0){
  48.       sleep($this->sleep_time);
  49.     }
  50.     $page = curl_exec ($ch);
  51.     $this->pagetext=$page;
  52.     $this->ch_curl=$ch;
  53.     return $page;
  54.   }
  55.  
  56. protected function if_get_parse($url){
  57.     $path_file_bd=$this->cache_dir.md5($this->url).$this->pref_file_b;
  58.     $path_file_site=$this->cache_dir.md5($this->url).$this->pref_file_s;
  59.     if(file_exists($path_file_bd) and file_exists($path_file_site)){
  60.       $bd=unserialize(file_get_contents($path_file_bd));
  61.       if($bd['time']>time()){
  62.     $page=file_get_contents($path_file_site);
  63.     if($bd['charset']!=$this->charset){
  64.       iconv($bd['charset'],$this->charset,$page);
  65.     }
  66.       $this->pagetext='';
  67.       return $page;
  68.       } else {
  69.       unlink($path_file_bd); unlink($path_file_site);
  70.       $this->if_get_parse($url);
  71.       }
  72.     } else {
  73.       $page=$this->get_followlocation($url);
  74.       $page=preg_replace("#^([^\<]*)<(.*)#i","<\\2",$page);
  75.       $charset_page=$this->charset_page_parse();
  76.       if($this->charset!=''&&$charset_page!=$this->charset){
  77.     $page=iconv($charset_page,$this->charset,$page);
  78.       }
  79.       if($page!=''){
  80.         $this->puts_content($page);
  81.       }
  82.       $this->close_curle();
  83.       $this->pagetext='';
  84.       return $page;
  85.     }
  86.   }
  87.  
  88. protected function get_followlocation($url){
  89.     $page=$this->get_parse($url);
  90.     if(preg_match("#Location\:\s?(.+)\s#i",$page)){
  91.       preg_match_all("#Location\:\s?(.+)\s#isU",$page,$link);
  92.       $page=$this->get_followlocation(trim($link[1][0]));
  93.     }
  94.     return $page;
  95.   }
  96.  
  97. protected function puts_content($text){
  98.     if($this->on_cached==1){
  99.     $path_file_bd=$this->cache_dir.md5($this->url).$this->pref_file_b;
  100.     $path_file_site=$this->cache_dir.md5($this->url).$this->pref_file_s;
  101.     $bd['time']=time()+$this->cache_time_limit;
  102.     $bd['charset']=$this->charset;
  103.     $bd['url']=$this->url;
  104.     $bd['time_load']=time();
  105.     file_put_contents($path_file_site,$text);
  106.     file_put_contents($path_file_bd,serialize($bd));
  107.   }}
  108.  
  109. protected function charset_page_parse(){
  110.     $content_type=curl_getinfo($this->ch_curl,CURLINFO_CONTENT_TYPE);
  111.     if(preg_match("#charset=(.+)\s*#is",$content_type)){
  112.       preg_match_all("#charset=(.+)\s*#is",$content_type,$chars);
  113.       $charset=$chars[1][0];
  114.     } else {
  115.     if(preg_match("#charset=(\'?|\"?)(.+)(\'|\"|\s)#isU",$this->pagetext)){
  116.       preg_match_all("#charset=(\'?|\"?)(.+)(\'|\"|\s)#isU",$this->pagetext,$chars);
  117.       $charset=$chars[2][0];
  118.     } else {
  119.     $charset=$this->charset_ifno;
  120.     }
  121.     }
  122.     return $charset;
  123.   }
  124.  
  125. public function get($url,$CURLOPTHEADER=1){
  126.         $this->CURLOPTHEADER=$CURLOPTHEADER;
  127.     $this->url=$url;
  128.     if($this->cache_dir==false){
  129.                 return $this->get_parse($url);
  130.         } else {
  131.                 $namedirurl=parse_url($this->url);
  132.                 $this->cache_dir=$this->cache_dir.ceil(time()/86400);
  133.                 if(!file_exists($this->cache_dir)){ mkdir($this->cache_dir,0777); }
  134.                 $this->cache_dir=$this->cache_dir."/".$namedirurl['host']."/";
  135.                 if(!file_exists($this->cache_dir)){ mkdir($this->cache_dir,0777); }
  136.                 return $this->if_get_parse($this->url);
  137.         }
  138.   }
  139.  
  140. protected function close_curle(){
  141.     curl_close ($this->ch_curl);
  142.   }
  143. }
  144.  


Использование:

1)
PHP:
скопировать код в буфер обмена
  1. $parser=new cms_http_parse;
  2. $content=$parser->get("http://php.su/");



2)
PHP:
скопировать код в буфер обмена
  1. $parser=new cms_http_parse;
  2. $parser->on_cached=1;
  3. $parser->cache_dir='tmp/cache_parser/'; // папка с файлами кэша
  4. $parser->file_coockies='tmp/coockies_http_get.dat'; // файл с куками
  5. $content=$parser->get("http://php.su/");


P.S. Сразу говорю, что класс писал для своих задач, поэтому говорить, что не доработан не нужно, для меня все ок, где минусы знаю сам, главное что полностью решает мои потребности.
2. Champion - 06 Марта, 2011 - 21:17:53 - перейти к сообщению
А учел, что в Location иногда передается неполный URI ?
А еще редиректы могут делаться заголовками 302 Moved Temporarily,301 Moved Permanently.
3. ALEN - 06 Марта, 2011 - 21:25:24 - перейти к сообщению
Champion
Говорю же делал под свои узкие цели)))
Многим просто может решение подойти.

Если буду доводить до ума, то тут многое переделаю.

Тут самая страшная проблема в том, что кэш сам не чистится и нельзя хранить его более суток (не будет использоваться) - но это в моих задачах далеко не нужно. Поэтому даже в этом не довел до конца.
4. Champion - 07 Марта, 2011 - 09:18:32 - перейти к сообщению
Да не, я не критикую, я подсказал просто)
ALEN пишет:
coockies
что-то тут не то)
А еще с областями видимости членов класса прямо-таки не очень здорово. Всё кругом публичное.
(Добавление)
ALEN пишет:
поэтому говорить, что не доработан не нужно, для меня все ок, где минусы знаю сам
Только сейчас досюда дочитал. Ладно, не буду тогда больше умничать.

 

Powered by ExBB FM 1.0 RC1