Показать сообщение отдельно

  #5  
Старый 03.12.2008, 18:15
Chaak
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме:
5321514

Репутация: 3313


По умолчанию

Простенький парсер яндекс серча.

Создаем новый объект ->
PHP код:
setQuery('текст для поиска в утф-8''страница(0- по умолчанию)''сортировать результаты - yes/no');
$yd->ydSend(); //отправляем все 
В методе parse останется массив $resarr с результатами поиска.


PHP код:
<?php

/**
 * @name Yandex Xml parser
 * @author Chaak
 */


class yaXML
{
    private 
$query '';
    private 
$page 0;
    private 
$sort 'yes';
    private 
$xml '';
    private 
$result '';
    private 
$parsed = array();


    
/**
     * Отправляет заголовки на сервер
     * @param лень писать, рука отвалится :)
     */
    
private function socket_do($action,$method,$header false,$timeout 10,$params false,$follow false,$cookie false,$referer false)
    {
        
$ch curl_init();
        if(
strtoupper($method) == 'GET')
        {
            
$action .= '?'.$params;
            
curl_setopt($ch,CURLOPT_URL,$action);
            
curl_setopt($ch,CURLOPT_HTTPGET,1);
        } elseif(
strtoupper($method) == 'POST')
        {
            
curl_setopt($ch,CURLOPT_URL,$action);
            
curl_setopt($ch,CURLOPT_POST,true);
            
curl_setopt($ch,CURLOPT_POSTFIELDS,$params);
        }
        else
        {
            
curl_setopt($ch,CURLOPT_URL,$action);
        }

        if(@
$this->proxy)
        {
            
curl_setopt($ch,CURLOPT_PROXY,$proxy);
        }

        
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,$follow);
        
curl_setopt($ch,CURLOPT_FAILONERROR,false);
        
curl_setopt($ch,CURLOPT_HEADER,$header);
        
curl_setopt($ch,CURLOPT_USERAGENT,'Opera/9.62 (Windows NT 6.0; U; ru) Presto/2.1.1');
        
curl_setopt($ch,CURLOPT_REFERER,$referer);
        
curl_setopt($ch,CURLOPT_COOKIE,$cookie);
        
curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
        
$done curl_exec($ch);
        
curl_close($ch);
        return 
$done;
    }

    
/**
     * Подготавливает запрос
     * @access private
     * @return void
     */
    
private function prepareQuery()
    {
        
$this->query htmlspecialchars(stripslashes(substr($this->query,0,150)));
        
$this->page = (int)$this->page;
        
$this->sort = ((strtolower($this->sort) != 'yes') && (strtolower($this->sort) != 'no'))?('yes'):($this->sort);
        
$this->xml '<request><query>'.$this->query.'</query><page>'.$this->page.'</page><sort priority="'.$this->sort.'" /></request>';
    }

    
/**
     * Функция отправки данных на ЯД
     * @access private
     * @return void
     */
    
private function sendXMLData()
    {
        if(!
$this->result $this->socket_do('http://xmlsearch.yandex.ru/xmlsearch/','post',0,15,$this->xml,1))
        {
            die(
'Ошибка соединения');
        }
    }

    
/**
     * Парсит запрос
     * @return void
     */
    
private function parse()
    {
        if(
$this->result)
        {
            
//парсим урлы
            
preg_match_all('#<url>(.*?)</url>#i',$this->result,$urls);
            
$urls array_unique($urls['1']);
            
//парсим титлы
            
preg_match_all('#<title>(.*?)</title>#i',$this->result,$titles);
            
$titles $titles['1'];
            
//парсим примеры текстов
            
preg_match_all('#<passage>(.*?)</passage>#i',$this->result,$passage);
            
$passage $passage['1'];

            if(
$urls)
            {
                
$resarr = array();

                for(
$i 0,$c sizeof($urls); $i $c$i++)
                {
                    
$resarr[$i] = array('title' => strip_tags($titles[$i]),'passage' => strip_tags($passage[$i]),'url' => $urls[$i]);
                }
                echo 
'<pre>';
                
print_r($resarr);
                echo 
'</pre>';
            }
            else
            {
                echo 
$this->result;
            }
        }
        else
        {
            die(
'Запрос вернул пустое значение');
        }
    }

    
/**
     * Устанавливает неободимые параметры
     * @param (string)query - запрос, (int)page - страница, (string) sort - сортировать?
     * @access private
     * @return bool
     */
    
public function setQuery($query,$page 0,$sort 'yes')
    {
        
$this->query $query;
        
$this->page $page;
        
$this->sort $sort;
    }

    
/**
     * No comments
     */
    
public function ydSend()
    {
        
$this->prepareQuery();
        
$this->sendXMLData();
        
$this->parse();
    }
}


$yd = new yaXML();
$yd->setQuery(urldecode(iconv('windows-1251','utf-8',$_GET['text'])),$_GET['page'],$_GET['sort']);
$yd->ydSend();

?>
 
Ответить с цитированием