Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
ConChita
1 / 1 / 0
Регистрация: 21.02.2010
Сообщений: 142
1

Парсер поисковой выдачи яндекса

14.08.2014, 00:10. Просмотров 2196. Ответов 1
Метки нет (Все метки)

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

никогда раньше с этим не сталкивалась.
Нашла код парсера через curl'ы:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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(0)).

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

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
Подскажите, в чем же ошибка той части, где непосредственно выводятся результаты поиска?
Очень хотелось бы разобраться.

Добавлено через 1 час 34 минуты
Не понятна конкретно вот эта часть

PHP
1
2
3
4
5
6
7
8
9
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")]');
и регулярные выражения, которые непонятно откуда такие берутся!
Кажется, что именно в них то вся и загвоздка. потому как
print_r($serp_items) выводит
DOMNodeList Object
(
[length] => 0
)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2014, 00:10
Ответы с готовыми решениями:

Скопировать урл из поисковой строки
Привет, подскажите мне такую вещь если скажем ссылка в браузере вида ...

Постраничная навигация поисковой страницы
Добрый вечер! Возникла проблема с постраничной навигацией. С простым выводом...

Принцип работы поисковой системы
Кто-то знает в чем заключается принцип работы поисковой системы(таких как...

Написание собственной поисковой системы
Вот решили с другом написать поисковую систему типо рамблера. Но для начала...

Создание поисковой системы для сайта
Мне для сайта нужно сосздать поисковую систему. Я ее хотел сделать классной,...

1
NEbO
593 / 460 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 3
14.08.2014, 03:18 2
Цитата Сообщение от ConChita Посмотреть сообщение
регулярные выражения, которые непонятно откуда такие берутся!
это не регулярки, это xpath-выражения. спецификации гуглятся несложно. но если вам удобнее регулярками, то можете пользоваться ими -- кто ж запрещает?
сейчас у яндекса достаточно сильно сменился формат вывода. загрузите любую страницу поиска, да посмотрите, что у них там на странице, и попробуйте ее разобрать сначала локально, чего ее дергать каждый раз из инета, тем более если яндекс блочит...
не, реально там я не нашел ни одного элемента с классом "b-serp-item". не верите -- проверьте
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 03:18

Парсинг RSS по запросу из поисковой формы
# Что искать $search = 'Губернатор Харьковской области'; foreach...

Регулярное выражение для поисковой строки
В одном гайде в ютубе, парень сделал регулярку для поисковой строки, выглядит...

Получение и обработка результатов запроса к поисковой системе
Получение и обработка результатов запроса к поисковой системе. Web-интерфейс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru