Предположим у нас стоит задача собрать контактные данные организаций с какого то сайта. Для примера возьмём сайт
«Желтые страницы Рунета» http://www.yellowpagesrussia.ru. Нам нужно собрать данные организаций из раздела
«Морской транспорт – организации» http://www.yellowpagesrussia.ru/190/154/.

Для начала работы нам понадобится стандартная заготовка скрипта. Её можно создать по нажатию в меню Файл->Новый->Скрипт
или по нажатию «горячих» клавиш «Ctrl+N». После чего создать папку в папке My Scripts с именем нашего будущего
скрипта в нашем случае yellowpages и переместить наш скрипт в эту папку через меню «Файл->Сохранить как» yellowpages.php.

Далее мы вставляем шапку с настройками:

$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, которую создать в папке со скриптом.

Для начала работы перейдем на нужный нам сайт для этого используем команду хумана:

$browser->navigate($site);

Далее нам нужно через правую панель «Дерево элементов» найти общий id контекста
кликаем по данным правой кнопкой и выбираем «посмотреть в дереве элементов»
находим наиболее подходящий элемент, подглядывая в «инспектор», чтобы внутренний текст
(или html код) содержал максимум нужной нам информации!
Найдя нужным идентификатор, с помощью функции Human Emulator выпарсиваем все данные со страницы
в нашем случае это id = content для объекта $div
пишем в скрипте(либо правой кнопкой мыши вызываем контекстное меню и кликаем на нужный нам контент и выбираем нужный пункт):

$content = $div->get_all_inner_texts_by_attribute("id","content");

после выполнения этого шага хуманом мы получаем массив с данными,
которые сохраним с помощью функции добавления строки в файл:

$textfile->add_string_to_file($str_res,$content."\r\n");

данные будут добавлены в указанный текстовый файл. Тело скрипта теперь выглядит следующим образом:

// /////////////////////// скрипт ///////////////////////////////////////////
// переходим на сайт
$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».

// получение строки по префиксам
function get_string($str1, $pr1, $pr2, &$ind_st = 0)
{
   //echo $str1.'
'; $ind1 = strpos($str1, $pr1, $ind_st); // echo "index 1 ".$ind1.'
'; if($ind1 === false) return ""; $ind2 = strpos($str1, $pr2, $ind1+ strlen($pr1)); //echo "index 2 ".$ind2.'
'; if ($ind2 === false) return ""; // запомним стартовый индекс $ind_st = $ind2 + 1; // $sres = substr($str1, $ind1 + strlen($pr1), $ind2 - $ind1-strlen($pr1)); return trim($sres); }

C помощью этой функции выкусываем нужные данные:

$text = get_string($content[0],"Морской транспорт – организации","Страницы");
затем записываем полученные данные в файл
$textfile->add_string_to_file($str_res,$text);

В итоге у нас должен получится следующий скрипт:

// переходим на сайт
$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».

// функция осуществляющая переход со страницы на страницу
// $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;
}

С её помощью можно пропарсить все доступные страницы, запихнув ее в бесконечный цикл,
который будет выглядеть примерно так:

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("
переходим на следующую страницу
");
	next_page();
	sleep($wt_long);
}

debug_mess("скрипт закончил работу");
// Quit
$app->quit();

В итоге за 15 минут мы накидали скрипт парсер, который собирает данные со всех страниц, либо только с заданных.
Если бы мы стали писать парсер на php, то это заняло у нас гораздо больше времени.

Добавить комментарий

*
*

Необходимые поля отмечены*