Предположим у нас стоит задача собрать контактные данные организаций с какого то сайта. Для примера возьмём сайт
«Желтые страницы Рунета» http://www.yellowpagesrussia.ru. Нам нужно собрать данные организаций из раздела
«Морской транспорт – организации» http://www.yellowpagesrussia.ru/190/154/.
Для начала работы нам понадобится стандартная заготовка скрипта. Её можно создать по нажатию в меню Файл->Новый->Скрипт
или по нажатию «горячих» клавиш «Ctrl+N». После чего создать папку в папке My Scripts с именем нашего будущего
скрипта в нашем случае yellowpages и переместить наш скрипт в эту папку через меню «Файл->Сохранить как» yellowpages.php.
Далее мы вставляем шапку с настройками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$xhe_host ="127.0.0.1:7010"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // //////////////////////// настройки скрипта ///////////////////////// // файл с результатами $str_res="res/result.txt"; // скрипт работает в режиме отладки $dbg = true; // сайт $site = "http://www.yellowpagesrussia.ru/190/154/"; // ожидание $wt = 5; $wt_long = 10; // текущая страница $crnt_page = 1; // количество страниц $cnt_pages = -1; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // /////////////////////// скрипт /////////////////////////////////////////// |
Примечание: Файл functions.php можно взять из любого скрипта, который вы можете скачать у нас на сайте.
Его нужно поместить в папку tools, которую создать в папке со скриптом.
Для начала работы перейдем на нужный нам сайт для этого используем команду хумана:
1 |
$browser->navigate($site); |
Далее нам нужно через правую панель «Дерево элементов» найти общий id контекста
кликаем по данным правой кнопкой и выбираем «посмотреть в дереве элементов»
находим наиболее подходящий элемент, подглядывая в «инспектор», чтобы внутренний текст
(или html код) содержал максимум нужной нам информации!
Найдя нужным идентификатор, с помощью функции Human Emulator выпарсиваем все данные со страницы
в нашем случае это id = content для объекта $div
пишем в скрипте(либо правой кнопкой мыши вызываем контекстное меню и кликаем на нужный нам контент и выбираем нужный пункт):
1 |
$content = $div->get_all_inner_texts_by_attribute("id","content"); |
после выполнения этого шага хуманом мы получаем массив с данными,
которые сохраним с помощью функции добавления строки в файл:
1 |
$textfile->add_string_to_file($str_res,$content."\r\n"); |
данные будут добавлены в указанный текстовый файл. Тело скрипта теперь выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 |
// /////////////////////// скрипт /////////////////////////////////////////// // переходим на сайт $browser->navigate("$site"); sleep($wt); // получаем нужные данные со страницы $content = $div->get_all_inner_texts_by_attribute("id","content"); sleep($wt); // записываем в файл $textfile->add_string_to_file($str_res,$content); sleep($wt); |
Далее проверяем результат…и видим, что записались лишние данные!
используем для решения этой проблемы заранее написанную нами функцию get_string().
Исходники её лежат в файле «tools/functions.php».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// получение строки по префиксам function get_string($str1, $pr1, $pr2, &$ind_st = 0) { //echo $str1.'<br>'; $ind1 = strpos($str1, $pr1, $ind_st); // echo "index 1 ".$ind1.'<br>'; if($ind1 === false) return ""; $ind2 = strpos($str1, $pr2, $ind1+ strlen($pr1)); //echo "index 2 ".$ind2.'<br>'; if ($ind2 === false) return ""; // запомним стартовый индекс $ind_st = $ind2 + 1; // $sres = substr($str1, $ind1 + strlen($pr1), $ind2 - $ind1-strlen($pr1)); return trim($sres); } |
C помощью этой функции выкусываем нужные данные:
1 2 3 |
$text = get_string($content[0],"Морской транспорт – организации","Страницы"); затем записываем полученные данные в файл $textfile->add_string_to_file($str_res,$text); |
В итоге у нас должен получится следующий скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// переходим на сайт $browser->navigate("$site"); //sleep($wt); // получаем нужные данные со страницы $content = $div->get_all_inner_texts_by_attribute("id","content"); sleep($wt); // удаляем лишнее echo $text = get_string($content[0],"Морской транспорт – организации","Страницы" ); sleep($wt); // записываем данные в файл $textfile->add_string_to_file($str_res,$text); sleep($wt); |
Так же можно использовать заранее написанную нами функцию для перехода на следующую страницу
next_page();, которая так же находится в файле «tools/functions.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 |
// функция осуществляющая переход со страницы на страницу // $crnt_page - текущая страница // $cnt_pages - количество страниц для обработки function next_page() { global $anchor, $browser, $app,$crnt_page, $cnt_pages; // количество поисковых страниц $crnt_page = $crnt_page + 1; // если $cnt_pages == -1, значит скрипт будет искать все страницы до конца поиска if ($cnt_pages != -1) { // если обработали все нужные нам страницы - останавливаем скрипт if ($crnt_page>$cnt_pages) { debug_mess("обработали все заданные страницы ".($crnt_page - 1)); $crnt_page = 1; return false; } } // перейдём на следующую страницу if (!$anchor->click_by_inner_text($crnt_page, true)) { debug_mess("обработали все доступные страницы " . ($crnt_page - 1)); $crnt_page = 1; return false; } debug_mess("обработали страницу " . ($crnt_page - 1)); return true; } |
С её помощью можно пропарсить все доступные страницы, запихнув ее в бесконечный цикл,
который будет выглядеть примерно так:
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 |
debug_mess(" скрипт запустили"); // переходим на сайт $browser->navigate("$site"); sleep($wt); while(true) { // получаем нужные данные со страницы $content = $div->get_all_inner_texts_by_attribute("id","content"); sleep($wt); // удаляем лишнее echo $text = get_string($content[0],"Морской транспорт – организации","Страницы" ); sleep($wt); // записываем данные в файл $textfile->add_string_to_file($str_res,$text); sleep($wt); // перейти на следующую страницу debug_mess(" <b>переходим на следующую страницу</b> "); next_page(); sleep($wt_long); } debug_mess("скрипт закончил работу"); // Quit $app->quit(); |
В итоге за 15 минут мы накидали скрипт парсер, который собирает данные со всех страниц, либо только с заданных.
Если бы мы стали писать парсер на php, то это заняло у нас гораздо больше времени.