Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2014, 22:59   #1
ConChita
 
Аватар для ConChita
 
Регистрация: 14.11.2008
Сообщений: 5
По умолчанию Парсер поисковой выдачи яндекса

здравствуйте.
совершенно новая тема для меня парсеры. мне надо написать как через curl'ы так и через яндекс.xml.

никогда раньше с этим не сталкивалась.
Нашла код парсера через curl'ы:

PHP код:
function get_page($url)
{
 
$ch curl_init();
 
$options = array(
  
CURLOPT_TIMEOUT => 15,
  
CURLOPT_RETURNTRANSFER => TRUE,
  
CURLOPT_FOLLOWLOCATION => TRUE,
  
CURLOPT_URL => $url,
  
CURLOPT_USERAGENT => 'Google Chrome'
 
);
 
 
curl_setopt_array($ch$options);
 
$data curl_exec($ch);
 
 
curl_close($ch);
 return 
$data;
}
 
function 
set_utf8_meta($page)
{
 return 
preg_replace('/<head[^>]*>/',
   
'<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">',
   
$page);
}
 
$query 'парсер яндекса'// запрос
$url 'http://yandex.ru/yandsearch?text='.urlencode($query).'&lr=213&numdoc=50';
// 213 - регион (Москва) / numdoc=50 - на первой странице выдачи будет 50 позиций, а не 10
 
$page get_page($url); // скачиваем страницу
$page set_utf8_meta($page); // выставляем нужный нам meta content
 
 
libxml_use_internal_errors(true); // дает нам управление над ошибками
$dom = new DOMDocument(); // создаем объект класса и выставляем немного настроек
$dom->preserveWhiteSpace false;
$dom->resolveExternals false
$dom->validateOnParse false;
$dom->loadHTML($page);
$xpath = new DOMXpath($dom); // создаем объект класса DOMXpath
 
$serp_items $xpath->query('//li[contains(@class, "b-serp-item")]');
//$serp_items->length; // кол-во результатов на странице
 
$links = array();
 
foreach (
$serp_items as $item)
{
 
$_tmp = array();
 
$header_obj $xpath->query('./h2'$item)->item(0);
 
 
$_tmp['position'] = (int)$xpath->query('./b'$header_obj)->item(0)->nodeValue;
 
 
$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); // тут-то и находятся первые 10 результатов со страницы 
но возвращает он пустой массив (array (size=0)
empty).

print_r($serp_items) выводит
DOMNodeList Object
(
[length] => 0
)

Однако, вот эта часть работает: (работает несколько раз, а потом яндекс начинает думать, что я робот и выдает станицу с капчей)


PHP код:
function get_page($url)
{
 
$ch curl_init();
 
$options = array(
  
CURLOPT_TIMEOUT => 15,
  
CURLOPT_RETURNTRANSFER => TRUE,
  
CURLOPT_FOLLOWLOCATION => TRUE,
  
CURLOPT_URL => $url,
  
CURLOPT_USERAGENT => 'Google Chrome'
 
);
 
 
curl_setopt_array($ch$options);
 
$data curl_exec($ch);
 
 
curl_close($ch);
 return 
$data;
}
 
$query 'парсер яндекса'// запрос
$url 'http://yandex.ru/yandsearch?text='.urlencode($query).'&lr=213&numdoc=50';
 
$page get_page($url); // скачиваем страницу
 
echo $page
Подскажите, в чем же ошибка той части, где непосредственно выводятся результаты поиска?
Очень хотелось бы разобраться.
М.

Последний раз редактировалось ConChita; 14.08.2014 в 00:07.
ConChita вне форума Ответить с цитированием
Старый 14.08.2014, 00:08   #2
ConChita
 
Аватар для ConChita
 
Регистрация: 14.11.2008
Сообщений: 5
По умолчанию

Не понятна конкретно вот эта часть

libxml_use_internal_errors(true); // дает нам управление над ошибками
$dom = new DOMDocument(); // создаем объект класса и выставляем немного настроек
$dom->preserveWhiteSpace = false;
$dom->resolveExternals = false;
$dom->validateOnParse = false;
$dom->loadHTML($page);
$xpath = new DOMXpath($dom); // создаем объект класса DOMXpath

$serp_items = $xpath->query('//li[contains(@class, "b-serp-item")]');

и регулярные выражения, которые непонятно откуда такие берутся!
М.
ConChita вне форума Ответить с цитированием
Старый 14.08.2014, 00:13   #3
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Сообщений: 278
По умолчанию

На этом этапе:
PHP код:
$xpath = new DOMXpath($dom); // создаем объект класса DOMXpath
$serp_items $xpath->query('//li[contains(@class, "b-serp-item")]'); 
Уже ничего не работает.

Вариант с cURL обречён на неудачу. Помимо того, что надо сохранять куки, например как-то так:
PHP код:
curl_setopt($chCURLOPT_COOKIEJAR'cookie.txt'); 
нужно будет всё равно что-то делать с капчей. Например, использовать платный сервис распознавания (тот же rucaptcha.com).

Яндексу не надо, чтобы его просто так курлом штормили. Используйте Yandex.XML, как и собирались. И будет вам счастье.
ATL вне форума Ответить с цитированием
Старый 14.08.2014, 07:38   #4
ConChita
 
Аватар для ConChita
 
Регистрация: 14.11.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от ATL Посмотреть сообщение
Используйте Yandex.XML, как и собирались. И будет вам счастье.
яндекс.xml мне уже с порога заявляет, что "Лимит запросов исчерпан у пользователя..." нет у меня сайтов на веб-мастере
М.
ConChita вне форума Ответить с цитированием
Старый 14.08.2014, 10:32   #5
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

Есть биржи где можно недорого купить эти лимиты
ADSoft вне форума Ответить с цитированием
Старый 11.09.2014, 13:35   #6
Дмиртий
Новичок
Джуниор
 
Регистрация: 11.09.2014
Сообщений: 2
По умолчанию

Я извращался с file_get_contents, обрабатывал simplehtmldom`ом. Обрабатывало долго и до первой капчи.
Дмиртий вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен скрипт Парсер выдачи яндекса webbaster Фриланс 1 29.06.2012 21:52
Выравнивание кнопки в поисковой форме zelja HTML и CSS 11 27.12.2011 12:06
Создание поисковой системы L_Anya Помощь студентам 1 28.10.2011 23:18
троян в поисковой системе? connstantin Безопасность, Шифрование 6 11.01.2011 00:56
Запрос поисковой системе Лубышев Общие вопросы .NET 9 16.03.2009 11:48