|
Познавший АНТИЧАТ
Регистрация: 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();
?>
|