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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Класс cms_http_parse, Парсинг URL, обход followlocation

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: PHP, CURL
ALEN Модератор
Отправлено: 06 Марта, 2011 - 21:11:28
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




- Класс обходит запрет некоторых хостеров на 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. Сразу говорю, что класс писал для своих задач, поэтому говорить, что не доработан не нужно, для меня все ок, где минусы знаю сам, главное что полностью решает мои потребности.
Скачать файл: cms_http_parse.php
Скачан раз: 292
 
 Top
Champion Супермодератор
Отправлено: 06 Марта, 2011 - 21:17:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




А учел, что в Location иногда передается неполный URI ?
А еще редиректы могут делаться заголовками 302 Moved Temporarily,301 Moved Permanently.
 
 Top
ALEN Модератор
Отправлено: 06 Марта, 2011 - 21:25:24
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Champion
Говорю же делал под свои узкие цели)))
Многим просто может решение подойти.

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

Тут самая страшная проблема в том, что кэш сам не чистится и нельзя хранить его более суток (не будет использоваться) - но это в моих задачах далеко не нужно. Поэтому даже в этом не довел до конца.
 
 Top
Champion Супермодератор
Отправлено: 07 Марта, 2011 - 09:18:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Да не, я не критикую, я подсказал просто)
ALEN пишет:
coockies
что-то тут не то)
А еще с областями видимости членов класса прямо-таки не очень здорово. Всё кругом публичное.
(Добавление)
ALEN пишет:
поэтому говорить, что не доработан не нужно, для меня все ок, где минусы знаю сам
Только сейчас досюда дочитал. Ладно, не буду тогда больше умничать.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB