<?php
define('DOMAIN','yandex.ua'); // Важено домен
define('SCHEME','http://');
define('NUMDOC','50');
define('SPRAVKA', ''); // Этот код можно получить если пройти капчу. Я удмаю можно сгенерить его самому. Это обычный base64
// t=UNIX_TIMESTAMP;i=ВАШ_IP;u=1424447588654410059;h=a9251aa16f61cdf3763cc5b1c28bff88
// Нужно только узнать как генерится u и хеш. Просто впадло ковырять. Этот код можно получить и долго рубить. Его так же можно получить если пройти капчу. По факту можно подключить антикапчу, эта капча вылазит редко если запрос подписан
$region = 143; // Киев, 213 Москоу
$query = 'парсер яндекса';
$url = SCHEME . DOMAIN . '/yandsearch?text='. urlencode($query) ."&lr={$region}&numdoc=" . NUMDOC . "&ncrnd=" . rand(100,999);
function get_page($url)
{
$ch = curl_init();
$headers = array(
'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2',
'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36',
// 'Cookie: spravka=' . SPRAVKA . ';', // было бы больше времени, можно разобраться как получить автоматом.
);
$options = array(
CURLOPT_TIMEOUT => 15,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => $headers,
);
curl_setopt_array($ch, $options);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$page = get_page($url);
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->resolveExternals = false;
$dom->validateOnParse = false;
$dom->loadHTML($page);
$xpath = new DOMXpath($dom);
$serp_items = $xpath->query('//div[contains(@class, "serp-block") and not(contains(@class, "-adv"))]//*[contains(@class, "serp-item__wrap")]');
$links = array();
foreach ($serp_items as $k=>$item)
{
$_tmp = array();
$header_obj = $xpath->query('./h2', $item)->item(0);
$_tmp['position'] = $k+1;
$link_obj = $xpath->query('./a', $header_obj)->item(0);
$_tmp['url'] = $link_obj->getAttribute('href');
$_tmp['url_text'] = trim(preg_replace('/\s+/i', ' ', $link_obj->nodeValue));
$links[] = $_tmp;
}
var_dump($links);