На днях заметил что мой сервис анализа сайта перестал правильно определять количество страниц в индексе Яндекса. Собственно решил это исправить и наткнулся на Яндекс XML — интерфейс который позволяет узнавать различную информацию — данные по сайтам из Яндекс веб-мастера, позиции по конкретным запросам и т.п. Меня конечно же это заинтересовало и я решил поковыряться с этим.
До этого количество проиндексированных страниц я узнавал с помощью простой функции, которая получала страницу выдачи с запросом типа ‘site:wooden-stool.ru’ и простой регуляркой выдирала от туда число страниц в индексе, всё просто. Но тут есть одно но — если очень часто проверять сайт на индекс, другими словами — обращаться к Яндексу, то он начинает выдавать капчу, что конечно же мешает. Яндекс XML в свою очередь таких недостатков не имеет, но тут тоже есть одно но, большое НО — лимиты. Каждому сайту выделяется некоторое число лимитов, которые представляют из себя возможное число запросов к Яндекс XML.
Если у вас есть свой, открытый для всех сервис, который имеет функционал получения позиций в Яндексе, то лимитов не хватит. Возможно вы заметили что многие конторки которые работают с Яндекс XML, в последнее время просят своих пользователей перевести на них лимиты. Ну вот про это я и говорю — лимитов не хватает, каждому сайту (ну не каждому, сайт должен быть более менее приличный) выделяется некоторое число лимитов, другими словами возможных запросов к Яндекс XML.
В общем, заинтересовался я этим интерфейсом и решил накатать небольшой скрипт на PHP, который сейчас мы и рассмотрим. Состоит он из непосредственно запроса к XML Яндекса на curl, регулярки для получения количества проиндексированных страниц и получения позиций с помощью разбора XML ответа.
Получение позиций и числа проиндексированных страниц в Яндекс с помощью PHP и Yandex.XML
Приступим к кодингу, отправлять запросы к XML интерфейсу мы будем с помощью curl. Но прежде, составим наш XML запрос
$postdata = '<?xml version="1.0" encoding="UTF-8"?><request><query>Блог сеошника</query><sortby></sortby><maxpassages>1</maxpassages><page>0</page><groupings><groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="3" /></groupings></request>';
тут простой запрос в формате XML, где в качестве искомой фразы для поиска выступает ‘блог сеошника’, естественно вы можете поменять запрос Ну а далее выполняем простой запрос с помощью cURL.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://xmlsearch.yandex.ru/xmlsearch?user=ТУТ_ВАШ_НИКНЕЙМ&key=ТУТ_ВАШ_КЛЮЧ"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt($ch, CURLOPT_TIMEOUT, 20); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_ENCODING, ""); $data = curl_exec($ch); curl_close($ch);
остановимся на этом моменте, как вы видите запрос идёт на страницу:
- http://xmlsearch.yandex.ru/xmlsearch?user=ТУТ_ВАШ_НИКНЕЙМ&key=ТУТ_ВАШ_КЛЮЧ
в запросе можно наблюдать передаваемый параметр key и никнейм аккаунта. Для каждого сайта он разный, для того что-бы узнать адрес для запроса к Yandex XML, идём на страницу настройки Яндекс.XML и берём этот адрес из строки ‘Ваш адрес для совершения запроса’:
- 1. Тут вводим айпи сервера откуда будет запускаться скрипт, узнать его можно на: 2ip.ru/lookup/
- 2. Ваша строка для запроса, копируем её и вставляем в скрипт что выше.
Далее начинаем разбор полётов, а именно — узнаём позицию нашего сайта по запросу ‘блог сеошника‘. Выглядит это так
$pos = 0; $xml = simplexml_load_string($data); foreach ($xml->response->results->grouping->group as $urldata) { $pos++; $name = $urldata->doc->url; $poss = strripos($name, 'wooden-stool.ru'); if ($poss > 0) { echo 'Позиция: '.$pos; break; } }
тут схема простая: проходим по xml документу который нам возвратил Яндекс и выдираем урлы, затем проверяем — если там присутствует наш домен, то мы определили позицию, выходим из цикла и показываем её (переменная $pos). В этом фрагменте кода необходимо поменять значение ‘wooden-stool.ru’ на ваш домен. Вот в принципе и всё, теперь небольшая регулярка, которая и сподвигла меня на написание этой простыни текста выдираем количество проиндексированных страниц
preg_match('!<found priority="phrase">[0-9]+</found>\s*!s', $data, $posdata); echo $posdata[0];
$posdata[0] — будет содержать число страниц в индексе. Данный пример успешно работает у меня на сервисе ‘анализ сайта‘. На этом у меня всё, покеда.
Все сделал, но почему то появляется ошибка
Warning: Invalid argument supplied for foreach()
подскажите что не так? Спасибо
-
alex Говорит:
10.11.2013 at 1:38 пп
Такая же лажа.
Не могу понять в чем проблема
-
gloys Говорит:
10.11.2013 at 1:44 пп
у меня отлично всё работает, но логика кода думаю понятна, перепишите по своему
-
Anonymous Говорит:
10.02.2014 at 1:56 пп
У кого не работает — сохраните файл в UTF-8, всё заработает. Либо выведите print_r($xml) чтобы понять причину ошибки.
если пишет такую ошибку
Warning: Invalid argument supplied for foreach()
значит яндекс не чего не вернул или нету сайтов, надо сделать проверку, а потом запускать foreach
Спасибо!
Очень простой пример. за 5 минут помог разобраться, будет тестировать.
Правда есть вопрос, можно ка-кто указать регион при снятии позиций?
Если я делаю запрос и не укажу город, оно же снимет общую позицию, или по ip выдаст мне мою? Непонятно.
-
gloys Говорит:
23.11.2013 at 9:01 дп
Не за что, пользуйтесь = )
Насчёт региона, добавьте в конец запроса параметр «lr», т.е. что-бы получилось что-то типа
http://xmlsearch.yandex.ru/xmlsearch?user=ТУТ_ВАШ_НИКНЕЙМ&key=ТУТ_ВАШ_КЛЮЧ&lr=РЕГИОН
где вместо ‘РЕГИОН’ подставляем номер региона, номера можно посмотреть тут:
http://api.yandex.ru/xml/doc/dg/reference/regions.xml
про доп. параметры помимо lr можно почитать тут:
http://api.yandex.ru/xml/doc/dg/concepts/post-request.xml
Респект!!!
Самому думать было лень, и тут такой подарок!
Спасибо.