Скрипт Human Emulator парсер поисковой выдачи Яндекс

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

Скрипт работает следующим образом: берём ключи из файла с поисковыми фразами и вводим их в yandex. Затем разбираем выдачу Яндекс на ссылки.

Этот скрипт является шаблонным скриптом, то есть вы легко можете дописать его для своих целей. Например, определить позицию вашего сайта в поисковых результатах Яндекс по заданному ключевому запросу или получить список сайтов, которые по этому запросу находятся в топ-10, топ-20, топ-30 и т.д. Можно собирать сайты заданного движка — dle сайты, каталоги, word press сайты и т.д. На основе этого скрипта сделан скрипт сборщик трастовых сайтов.

Настройки скрипта:


// файл с данными для скрипта
$keys = file("data/keys.txt");

// глубина прохода в поисковые результаты 
// со скольких страниц собирать товары прежде чем перейти к следующему
// если нужно собирать все товары надо просто задать этот параметр =  -1
$cnt_pages = 10;

Сам скрипт выглядит следующим образом:

navigate("yandex.ru");

	// зададим запрос
	$input->set_value_by_name("text",$ks);
	// найти
	$button->click_by_number(0);
	// ждём
	sleep(1);
	
   while(true)
   {
		// получить по префиксам все ссылки в виде одной строки разделённой 
$sites = $webpage->get_body_inter_prefix_all("class=\"b-serp-url__link\"","",true); // разделить на массив, используя для разделения
$sites = explode("
",$sites); // пройдёмся по всем полученным for($rw=0;$rw"; } // не перешли на следующую страницу if(!next_page($crnt_page)) break; } } // Quit $app->quit(); ?>

Скрипт написан 25.09.2012 в Human Emulator 4.4.19 Advanced.
На момент публикации статьи 25.09.2012 скрипт был рабочий.

скачать скрипт

Скрипт Human Emulator сбора финансовых данных по котировкам из таблиц

Предлагаем вашему вниманию скрипт, который собирает финансовые данные по котировкам из таблиц на finance.yahoo.com.

На вход скрипт принимает символы компаний из файла /data/quotes.txt, который имеет формат:
MSFT
HPQ
INTC
CSCO
AA
ORCL
IBM
и т.д.

В результате работы скрипта создаётся csv файл в формате:
symbol;Prev Close;Open;High;Low;Close;Volume;Change

Пример результатов:

MSFT;31.17;31.08;31.19;31.06;31.14;21,996,313;0.03(0.11%)
HPQ;18.25;18.42;18.41;18.16;18.23;9,983,753;0.02(0.11%)
INTC;23.37;23.48;23.51;23.27;23.39;16,197,458;0.02(0.09%)
CSCO;19.05;19.19;19.20;18.95;19.15;15,482,231;0.11(0.55%)
AA;9.49;9.61;9.65;9.51;9.51;8,861,214;0.02(0.21%)
ORCL;33.01;33.01;33.08;32.56;32.85;12,649,463;0.16(0.48%)
IBM;207.07;207.55;207.57;206.01;206.85;1,298,211;0.22(0.11%)
и т.д.

Настройки скрипта:

// файл с символами компаний
$quotes=file("data/quotes.txt");
// путь к файлу с результатами создаётся по дате и времени запуска
$res_file_name = "res/".date("mdy_His").".csv";

Для этого скрипта, как впрочем и для любого другого, можно использовать Расписание скриптов для запуска в нужное время или нужное количество раз.
В расписании скриптов есть возможность запускать скрипт заданное количество раз, один раз, раз в минуту, раз в 5 минут, раз в 10 минут, по выбору, раз в полчаса, раз в час, раз в день, раз в неделю, раз в месяц, раз в год, бесконечно.

Расписание скриптов. Добавление задачи.

Расписание скриптов. Добавление задачи.

Расписание скриптов.

Расписание скриптов.

Можно легко переделать скрипт, для получение любых необходимых данных с finance.yahoo.com.
Поменять формат вывода данных.
Дописать скрипт, что бы он выполнял необходимый анализ данных и при нахождении нужных параметров отправлял сообщение на email.

Для более быстрой работы скрипта рекомендуется отключить картинки, java script, java, active x, звуки и видео в настройках браузера.


Сам скрипт:

navigate("http://finance.yahoo.com/q?s=".trim($quotes[$i])."&ql=1");
	
	// получить данные в формате
	//symbol;Prev Close;Open;High;Low;Close;Volume;CHANGE	
	$str=trim($quotes[$i]).";";
	// закрытие
	$str_close=$element->get_inner_text_by_attribute("class","time_rtq_ticker",false);
   // изменение
	$str_change=$element->get_inner_text_by_attribute("class","time_rtq_content",false);
   // prev close
	$str_prev=$table->get_cell_by_number($table->get_number_by_id("table1"),0,1,false);
   // открытие
	$str_open=$table->get_cell_by_number($table->get_number_by_id("table1"),1,1,false);
	// получаем дневной низ и верх
	$str_day_range=$table->get_cell_by_number($table->get_number_by_id("table2"),0,1,false);
   $str_day_range=explode("-", $str_day_range);
	$str_low=trim($str_day_range[0]);
	$str_high=trim($str_day_range[1]);
   // volume
	$str_volume=$table->get_cell_by_number($table->get_number_by_id("table2"),2,1,false);
	// результирующая строка
	$str.=$str_prev.";". $str_open.";".$str_high.";".$str_low.";".$str_close.";".$str_volume.";".$str_change."\n";
	// записываем в файл
	$textfile->add_string_to_file($res_file_name,$str,60) ;
}
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); // Quit $app->quit(); ?>

Скрипт написан 19.09.2012 в Human Emulator 4.4.19 Advanced.
На момент публикации статьи 20.09.2012 скрипт был рабочий.
скачать скрипт

Этот скрипт работает в Demo версии программы Human Emulator. Посмотреть все скрипты для Demo и Скачать Demo

Как исправить скрипт, если он не работает, на примере скрипта сбора котировок

Cкрипт Human Emulator парсер Яндекс Маркета

Одной из актуальных задач на сегодняшний день является парсинг товаров с Яндекс Маркета. Мы решили не обходить эту задачу стороной и написать скрипт, который собирает заданные товары и всю информацию по ним и сохраняет её в базу данных MySQL.

Перед тем как написать скрипт мы с официального сайта скачали и установили последнюю сборку Mysql со всеми причиндалами и раскоментировали библиотеку mysql в php.ini, для того что бы можно было использовать функции работы с базами данных mysql в php.

Так как данные на сайте хранятся в utf-8 формате мы использовали для разработки скрипта Unicode версию программы Human Emulаtor. Эта версия лежит рядом с exe-шником обычной версии и называется XWeb Human Emulator MT UE.exe. Входные данные для скрипта тоже используются в unicode формате. На входе скрипт принимает файл с ключевыми словами, по которым он ищет нужные вам товары в следующем формате:
ноутбук
монитор
клавиатура
мышь

В результате работы скрипта создаётся база данных с таблицей товаров markets с
колонками Ключевое слово, Наименование товара, Средняя цена, Диапазон цен, Html код картинки, Html код кратких характеристик, Html код всех характеристик.
Можно все html результаты получать в виде текста. Для этого при разборе страниц товара вместо inner html надо использовать функции которые получают inner text.
В функции get_market_info($market_key) заменить $element->get_inner_html_by_attribute на $element->get_inner_text_by_attribute.

Результат работы скрипта в MySQL Workbench :

товары собранные с Яндекс Маркета в базе данных MySQL

товары собранные с Яндекс Маркета в базе данных MySQL

Настройки скрипта:

// файл с товарами для разбора  - тут указывается файл с ключевыми словами для поиска товаров
// данные должны быть в unicode
$a_markets = file("data/markets.txt");

// глубина прохода в поисковые результаты 
// со скольких страниц собирать товары прежде чем перейти к следующему
// если нужно собирать все товары надо просто задать этот параметр =  -1
$cnt_pages = 15;

Сам скрипт выглядит следующим образом:

quit();
}
// создадим базу данных для товаров
$sql = 'CREATE DATABASE IF NOT EXISTS yandex_markets';
if (!mysql_query($sql, $mysql_bd)) 
     debug_mess("не удалось создать базу yandex_markets: " . mysql_error());

// ждём пока обработается
sleep(1);
// если уже была создана выберем базу
mysql_select_db("yandex_markets", $mysql_bd);
// ждём пока обработается
sleep(1);
// создадим таблицу если ещё нету её
$sql = 'CREATE TABLE IF NOT EXISTS markets (Market TEXT, Market_Name TEXT, Avg_Price TEXT, Range_Price TEXT, Image TEXT, Properties MEDIUMTEXT, All_Properties MEDIUMTEXT)  ENGINE=MyISAM  DEFAULT CHARSET=utf8';
// выполнить запрос
//mysql_query($sql,$mysql_bd);
if(!mysql_query($sql,$mysql_bd))
    debug_mess("ошибка запроса : " . mysql_error());

// пройтись по всем товарам
for($j=0;$jnavigate("http://market.yandex.ru");
	
	$input->set_value_by_name("text",$a_markets[$j]);
	$button->click_by_number(0);
	
	$button->click_by_inner_text("Подобрать",true);
	// ходим до тех пор пока не кончатся ссылки по цифрам
   while(true)
   {
		$models= $webpage->get_body_inter_prefix_all("class=b-offers__name","\">");
		$a_models=explode("
",$models); // пройдёмся по всем ссылкам for($k=0;$kclick_by_href("modelid".$str_href,false); // получить информацию по товару get_market_info(trim($a_markets[$j])); // вернуться назад $browser->go_back(); } // не перешли на следующую страницу if(!next_page($crnt_page)) break; } } // закрыть базу mysql_close($mysql_bd); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); // Quit $app->quit(); ?>

Скрипт написан 11.09.2012 в Human Emulator 4.4.19 Advanced.
На момент публикации статьи 11.09.2012 скрипт был рабочий.

скачать скрипт

Скрипт Human Emulator сбора SEO информации с сайтов.

Предлагаем вашему вниманию скрипт, который собирает данные с заданного сайта,
а именно: внутренние и внешние ссылки, и мета тэги — title, description и keywords.

В результате работы скрипта по заданному пути появляются csv файлы: inner_links.csv с внутренними ссылками,
ext_links.csv с внешними и meta_tags.csv с мета тэгами.

Формат csv файлов с ссылками:

url страницы;ссылка
http://x-scripts.com/;http://www.freecsstemplates.org/
http://x-scripts.com/;http://www.humanemulator.info/
http://x-scripts.com/;mailto:order@x-scripts.com

Формат csv файла с meta tags:
url страницы;заголовок страницы;meta tag description; meta tag keywords
http://x-scripts.com/index.php;X-Scripts всё про скрипты XHE и их применение | X-Scripts.com;Описание сайта и разделов представленных на X-Scripts.com;XHE скрипты, написание скриптов XHE, примеры скриптов под хуман, примеры скриптов, скрипты для XWeb Human Emulator бесплатно
http://x-scripts.com/scripts.php;Примеры скриптов для XHE | X-Scripts.com; Примеры скриптов для XHE на X-Scripts.com. Скачай себе скрипт для Xweb Human Emulator;примеры скриптов скачать, скачать скрипты, скрипты xhe скачать, примеры xhe скачать
http://x-scripts.com/scripts/catalogs.php;Скрипт XHE сборщик каталогов | X-Scripts.com;Скрипт XHE сборщик каталогов на .com.

мы использовали функцию $app->show_free_dlg, которая показывает диалог с настройками

мы использовали функцию $app->show_free_dlg, которая показывает диалог с настройками

На этот раз для настроек скрипта мы использовали функцию $app->show_free_dlg, которая показывает диалог с настройками. Для постройки этого диалога функция использует xml файл. Таким образом изменяя xml файл можно создать любой диалог. В результате своей работы функция возвращает строку с настройками. Мы эту строку разбираем и получаем настройки, которые ввёл пользователь в диалог.
В нашем случае пользователь вводит анализируемый сайт, папку куда складывать результаты, задаёт что именно собирать и фильтры какие страницы не обрабатывать.

Пример XML файла нашего диалога настроек:


	













Вызов диалога настроек в скрипте:

// покажем диалог настроек скрипта
$str_settings=$app->show_free_dlg(file_get_contents("settings.xml"),"false","
"); // добавим главную страницу в массив $obj_settings=new ScriptSettings(); if(!$obj_settings->set(trim($str_settings))) { debug_mess("не заданы настройки скрипта!"); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); $app->quit(); }

Для обработки вводимых пользователем настроек мы добавили специальный класс ScriptSettings:

",$str_sets);
		// сайт 
		$this->str_site  = trim($a_sets[0]);
		// путь к папке с результатами
		$this->str_res_folder = trim($a_sets[1]); 
		
		// собирать ли внешние ссылки
		$this->b_ext_links =trim($a_sets[2])==1;
		// собирать ли внутренние ссылки
		$this->b_inn_links = trim($a_sets[3])==1;
		// собирать ли тэги
		$this->b_meta_tags = trim($a_sets[4])==1;
		// разобрать фильтры в массив
      if($a_sets[5]!="")
		     $this->a_filters=explode(",",$a_sets[5]);
      else
           $this->a_filters="";
		
		return true;
	}
  // показать настройки в панели отладки
  function show()
  {
      // сайт 
		echo "анализируем сайт : $this->str_site
"; // путь к папке с результатами echo "путь к папке с результатами: $this->str_res_folder
"; // собирать ли внешние ссылки if($this->b_ext_links) echo "собирать внешние ссылки
"; // собирать ли внутренние ссылки if($this->b_inn_links) echo "собирать внутренние ссылки
"; // собирать ли тэги if($this->b_meta_tags) echo "собирать тэги
"; // разобрать фильтры в массив echo " фильтры:
"; for($ii=0;$iia_filters);$ii++) echo $this->a_filters[$ii]."
"; return true; } } ?>

Скрипт можно легко модифицировать под сбор любой нужной вам информации, например можно собирать email-ы, телефоны, факсы, адреса, цены и т.д.
Можно сделать что б он брал сайты из заданного файла или собирал эти сайты по ключевому
запросу из поисковых результатов гуль или яндекс или любой другой поисковой машины.

Сам скрипт:

show_free_dlg(file_get_contents("settings.xml"),"false","
"); // добавим главную страницу в массив $obj_settings=new ScriptSettings(); if(!$obj_settings->set(trim($str_settings))) { debug_mess("не заданы настройки скрипта!"); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); $app->quit(); } // покажем настройки в окне отладки //$obj_settings->show(); // чистим предыдущие данные if($obj_settings->b_ext_links) $file_os->delete($obj_settings->str_res_folder."ext_links.csv"); if($obj_settings->b_inn_links) $file_os->delete($obj_settings->str_res_folder."inner_links.csv"); if($obj_settings->b_meta_tags) $file_os->delete($obj_settings->str_res_folder."meta_tags.csv"); // добавим главную в массив $a_links[]=$obj_settings->str_site; // чистим данные // собираем и проверяем for($k=0;$knavigate($pg); // проверяем страницы которые не нужно обрабатывать // проверить 404 страницу $bd=$webpage->get_body(); if(strpos($bd,"Error 404:")) continue; // проверить index of if(strpos($bd,"Index of ")) continue; // получить meta tags текущей страницы if($obj_settings->b_meta_tags) get_meta($pg,$obj_settings); // получим все href-ы на странице $hrefs=$anchor->get_all_hrefs(); // преобразуем в массив $hrefs=explode("
",$hrefs); // пройтись по всем hrefs и удалим лишнее for($ii=0; $iistr_site)===false && $obj_settings->b_ext_links) { $textfile->add_string_to_file($obj_settings->str_res_folder."ext_links.csv",$pg.";".$pg_href."\n",60) ; } else if($obj_settings->b_inn_links) // внутренняя ссылка { // если ещё не проверяли проверим // добавим проверяемую страницу if(!is_a_exists($pg_href)) { $a_links[]=$pg_href; $textfile->add_string_to_file($obj_settings->str_res_folder."inner_links.csv",$pg.";".$pg_href."\n",60) ; } } } } // убираем дубликаты из файлов if($obj_settings->b_ext_links) $textfile->dedupe($obj_settings->str_res_folder."ext_links.csv",$obj_settings->str_res_folder."ext_links.csv",60); if($obj_settings->b_inn_links) $textfile->dedupe($obj_settings->str_res_folder."inner_links.csv",$obj_settings->str_res_folder."inner_links.csv",60); if($obj_settings->b_meta_tags) $textfile->dedupe($obj_settings->str_res_folder."meta_tags.csv",$obj_settings->str_res_folder."meta_tags.csv",60); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); // Quit $app->quit(); ?>

Скрипт написан 07.09.2012 в Human Emulator 4.4.19 Advanced.
На момент публикации статьи 10.09.2012 скрипт был рабочий.

Этот скрипт работает в Demo версии программы Human Emulator. Посмотреть все скрипты для Demo и Скачать Demo

скачать скрипт

Скрипт Human Emulator сбора SEO информации о сайте.

Предлагаем вашему вниманию скрипт, который собирает SEO данные о заданном сайте. Скрипт получает PR и Тиц сайта, получается все проиндексированные страницы Яндексом и Гугль. Получает PR для каждой страницы сайта и вы водит это всё в виде html страницы с таблицами.

В результате работы скрипта открывается страница с таблицами, как указанно на рисунке ниже.

страница с таблицами seo

страница с таблицами seo

Настройки скрипта:

// сайт для анализа
$str_site="http://x-scripts.com";

// сузить поиск - вводим дополнительное значение, 
// которое сужает поиск до интересующих нас страниц
// например для x-scripts.com можно задать каталог /scripts/
// и проверить только его 
$str_target = ""; 

// глубина прохода в поисковые результаты
$cnt_pages = -1;

Можно легко переделать скрипт, что бы он выводил информацию в любом удобном для вас виде.
Или что бы проверял сразу пачку сайтов из txt файла.

Сам скрипт:

str_url =$str_site;
$obj_url ->str_url_title=$str_site;

// массив страниц проиндекисрованных яндексом
$a_yndex_pages[]=$obj_url;
// массив страниц проиндекисрованных google
$a_google_pages[]=$obj_url;

// получить все проиндексированные страницы из яндекс
get_yandex_pages();
// показать для отладки что собрали в массив
//array_show($a_yndex_pages);
// обнулим 
$crnt_page =1; 
// получить все проиндексированные страницы из google
get_google_pages();
// показать для отладки что собрали в массив
//array_show($a_google_pages);*/
// показать результат в виде html таблицы
show_table();

// покажем диалог настроек скрипта
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); // Quit $app->quit(); ?>

Скрипт написан 12.09.2012 в Human Emulator 4.4.19 Advanced.
На момент публикации статьи 14.09.2012 скрипт был рабочий.

скачать скрипт

Скрипт Human Emulator cборщик DLE сайтов

Предлагаем вашему вниманию скрипт сборщик DLE (DataLife Engine) сайтов. Этот скрипт написан на основе скрипта сборщика каталогов и демонстрирует как легко можно самом переделать сборщик под любые типы сайтов. Достаточно ввести правильный запрос в Google и выбрать нужные критерии для проверки движка сайта.

Теперь рассмотрим детальнее что именно отличает этот сборщик.

Первое это поисковый запрос. Он в скрипте выглядит так:

// задаём слово в поиск
$input->set_value_by_name("q","index.php?do=register");

Страница регистрации в DLE сайтах вызывается следующим запросом — http://domen.com/index.php?do=register. Значит ищем сайты где есть такие страницы.

После того как мы нашли такие страницы в Google мы проверяем их. Скрипт переходит на найденные страницы и проверяет количество элементов ввода — раз это форма регистрации то их должно быть на странице не менее 4. Для этого используем следующий код:

// проверить что это форма заполнения 
$cnt = $input->get_count($frame=-1);
if($cnt>=4){}

Если на странице есть 4 и более поля ввода мы получаем текущий url страницы и перед тем как записывать в файл проверяем, что это именно та страница которая нам нужна:

     // проверить что это форма заполнения 
     $cnt = $input->get_count($frame=-1);
     if($cnt>=4)
     {
         // запишем ссылку на страницу на которой можно добавить сайт
         $dmn = $webpage->get_location_url();
         // добавить сайт в базу
         if(str_isexists($dmn,"index.php?do=register"))
            $textfile->add_string_to_file($file_res,trim($dmn)."\n",60) ;
     } 

Сам скрипт:


$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// /////////////////// настройки скрипта ////////////////////////////////////////////////
// путь к файлу с результатами
$file_res ="res/dle_sites.txt";

// глубина прохода в поисковые результаты
$cnt_pages = 10;
$crnt_page =1;

// режим отладки
$dbg=true;
// ///////////////// дополнительные модели //////////////////////////////////
// основные функции
require_once("functions.php");
// //////////////// скрипт //////////////////////////////////////////////////////////////
// задать время ожидания загрузки
$browser->set_wait_params(10,1);  

// navigate to google
$browser->navigate("http://www.google.com");
// wait on browser
$browser->wait_for();
// задаём слово в поиск
$input->set_value_by_name("q","index.php?do=register");
$input->click_by_name("q");
// нажмём на поиск
$keyboard->send_key(13,true);

sleep(1);
// до тех пор пока есть ссылки с цифрами переходим
while(true)
{
    // получим все ссылки на сайты заключённые в тэгах 
    $sites=$webpage->get_body_inter_prefix_all("","");
    $sites=explode("
",$sites); for($ii=0;$ii","",trim($sites[$ii])); $site=str_replace("","",$site); // вывод в панель отладки debug_mes("ссылка на dle сайт : ".$site); if($site=="") continue; // открыть и сделать активным новый браузер $browser->set_count(2); $browser->set_active_browser(1,true); // перейдём на форму регистрации $browser->navigate($site); // проверить что это форма заполнения $cnt = $input->get_count($frame=-1); if($cnt>=4) { // запишем ссылку на страницу на которой можно добавить сайт $dmn = $webpage->get_location_url(); // добавить сайт в базу if(str_isexists($dmn,"index.php?do=register")) $textfile->add_string_to_file($file_res,trim($dmn)."\n",60) ; } // закрываем и переходим обратно $browser->set_active_browser(0,true); $browser->close_all_tabs(); } // не перешли на следующую страницу if(!next_page()) break; } // удалить дубликаты $textfile->dedupe($file_res,$file_res,60); // Quit $app->quit();

Скрипт написан 9.04.2012 в Human Emulator 4.4.17 Advanced.
На момент публикации статьи 11.04.2012 скрипт был рабочий.

скачать скрипт

Скрипт Human Emulator cборщик каталогов

Один из методов раскрутки сайта это добавление ссылки на него в каталоги. Хотя по этому поводу в интернете можно найти разные мнения, кто-то считает, что этот метод уже не работает и годится только для улучшения индексации, кто-то думает, что с помощью него можно получить целевой трафик и поднять сайт в выдаче.

Мы предлагаем вашему вниманию скрипт сборщик каталогов. Скрипт с помощью поисковой системы Google собирает в файл ссылки на каталоги. Принцип определения каталога это наличие на странице рабочей ссылки «Добавить сайт» или «добавить сайт». Если переход по ссылке совершен, значит это каталог. Так же в скрипт добавлены возможность определять есть ли в каталоге заданные темы и просит ли каталог ввести каптчу или нет. Если в каталоге нету заданной темы или он просит ввести каптчу, каталог не пишется в файл.

Теперь рассмотрим детальнее сам скрипт.

1. Настройки скрипта:

// ключи для поиска каталогов
$keys = file("./data/keys.txt"); 

В файле keys.txt содержатся поисковые запросы, которые мы вбиваем в Google для поиска каталогов. Формат файла:
каталог сайтов
добавить сайт
автокаталог

// для проверки тематики каталога 
$themas = file("./data/themas.txt"); 

В файле themas.txt лежит список тем, на которые мы проверяем каталоги. Формат файла:
авто
спорт

// файл с результатами
$res_catalogs = "./res/catalogs.txt"; Файл, в который пишутся каталоги.

// проверять ли тематику
$b_check_themas = false; - задаём проверять ли тематику.
// проверяем есть ли каптча
$b_check_captcha = false; - задаём проверять ли наличие каптчи

// глубина прохода в поисковые результаты
$cnt_pages = 15; - сколько страниц с поисковыми результатами для каждого запроса должен обработать скрипт.

// режим отладки
$dbg=true; - вывод в панель отладки логов скрипта.

2. Дополнительные модули:

// основные функции
require_once("functions.php"); - тут мы подключаем дополнительные функции для работы скрипта. Функции находятся в файле functions.php, который лежит в папке со скриптом.

3. Скрипт:

// задать время ожидания загрузки
$browser->set_wait_params(10,1); 

Это нововведение с версии 4.4.10. Теперь не надо вызывать функцию $browser->wait_for(); после каждого клика или перехода страницы. Достаточно один раз задать в начале скрипта с помощью этой функции. Параметры в функцию передаются аналогично wait_for.описание функции wait_for

// стартовый индекс для поисковых запросов
$aa_st=0;
if (isset($argv[1])) 
   $aa_st = $argv[1];

// стартовый индекс ссылки на странице
$ii_st=0;
if (isset($argv[2])) 
   $ii_st = $argv[2];

// индикатор текущей поисковой страницы
$crnt_page =1;
if (isset($argv[3])) 
   $crnt_page = $argv[3];

Эти три строчки используется при рестарте скрипта. Так как в IE имеются утечки при работе с некоторыми сайтами, то эти утечки унаследовал и Хуман, который основан на компоненте IE. Поэтому приходится при интенсивной работе скрипта с сайтами делать рестарт программы для обнуления памяти.

debug_mes("запустили для ключего слова с индексом $aa_st 
для поисковой страницы $crnt_page
для ссылки $ii_st
");

Вывод в окно отладки логов.

// пройдёмся по всем ключевым словам
for($aa=$aa_st; $aa < count($keys); $aa++)
{
    // получим ключевое слово
    $key = trim($keys[$aa]);
   
    // вывод в панель отладки
    debug_mes("ключевое слово: $key");

    // set 2 browser tabs
    $browser->set_count(2);
    // set active main browser tab
    $browser->set_active_browser(1,true);

     // navigate to google
    $browser->navigate("http://www.google.com");
  
    // задаём слово в поиск
    $input->set_value_by_name("q",$key);
    $input->click_by_name("q");

    $keyboard->send_key(32,true);

    sleep(2);

    // нажмём на поиск
    $keyboard->send_key(13,true);

    sleep(2);
    // если это рестарт перейдём на нужную страницу
    next_page(true);

Эта часть скрипта вводит поисковый запрос в Google, а так же делает переход на нужный запрос и нужную страницу с поисковыми результатами после рестарта.

// до тех пор пока есть ссылки с цифрами переходим
while(true)
{
    // получим все ссылки на сайты заключённые в тэгах 
    $sites=$webpage->get_body_inter_prefix_all("","");
    $sites=explode("
",$sites); for($ii=$ii_st;$ii","",trim($sites[$ii])); $site=str_replace("","",$site); // вывод в панель отладки debug_mes("ссылка на каталог : ".$site); if($site=="") continue; // открыть и сделать активным новый браузер $browser->set_count(3); $browser->set_active_browser(2,true); $browser->navigate($site); // wait on browser $browser->wait_for(); // проверка на каталог if(!check_for_catalog("добавить сайт")) { // проверка на другой возможный текст check_for_catalog("Добавить сайт"); } $browser->close(); // закрываем и переходим обратно $browser->set_active_browser(1,true); // проверить надо ли перезапускать if($debug->get_cur_mem_size()>300000000) { // перезапускаем если превысили 300mb занимаемой памяти $app->restart($debug->get_cur_script_path(),"$aa $ii $crnt_page"); } } // не перешли на следующую страницу if(!next_page()) break; } // перед новым запросом обнули счётчик $crnt_page =1; }

Эта часть скрипта ходит по сайтам и проверяет каталоги.

// отсортировать и убрать дубликаты
$textfile->dedupe($res_catalogs,$res_catalogs,60);

Отсортируем и удалим дубликаты из файла с результатами.

Скрипт написан 29.03.2012 в Human Emulator 4.4.14 Advanced.
На момент публикации статьи 29.03.2012 скрипт был рабочий.

скачать скрипт

Скрипт разбора поиcковой выдачи Google

Перед нами скрипт, который собирает домены сайтов из выдачи поисковой системы google по заданным ключевым словам. Причём скрипт разбирает выдачу,
разбирая страницу и получая данные из тэгов cite. После этого берётся содержимое полученного массива ссылок и скрипт переходит на каждую ссылку из массива
и уже после перехода получает домен.

На вход скрипт принимает ключевые слова, которые заданны в текстовом файле words.txt в формате:
лучшее кино года
народ и деньги
xweb human emulator
скрипты и тесты
скрипты xhe
хлеба и зрелищ
музыка снов

Скрипт выглядит следующим образом:

$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
// //////////////////////////////  настройки скрипт ///////////////
// ключевые слова 
$keys = file("words.txt");

// режим отладки
$dbg=true;

// глубина прохода в поисковые результаты
$cnt_pages = 5;

// //////////////////////////////// скрипт ////////////////////////////////
// пройдёмся по всем ключевым словам
for($aa=0;$aacount($keys);$aa++)
{
     // получим ключевое слово
     $key = trim($keys[$aa]);

     // navigate to google
    $browser->navigate("http://www.google.com");
    // wait on browser
    $browser->wait_for();
    // задаём слово в поиск
    $input->set_value_by_name("q",$key);
    //$input->click_by_atribute("name","q",true);
    sleep(2);

    // нажмём на поиск
    $button->set_focus_by_name(\'btnG\');
    $button->click_by_name(\'btnG\');
    $browser->wait_for();
    sleep(2);
  
// номер ссылки по которой будем кликать
$kk=2;
// до тех пор пока есть ссылки с цифрами переходим
while($anchor->click_by_inner_text($kk,true))
{
    $browser->wait_for();
    // проверка глубины прохода в поисковые результаты 
    if($kk>$cnt_pages)
    {
           // вывод в панель отладки
           debug_mes("прошли $cnt_pages страниц с поисковыми результатами");
           break;
    }
    // получим все ссылки на сайты заключённые в тэгах cite>
    $sites=$webpage->get_body_inter_prefix_all("","");

    // вывод в панель отладки
    debug_mes("ссылки на сайты :
".$sites); $sites=explode("
",$sites); for($ii=0;$iicount($sites);$ii++) { // открыть и сделать активным новый браузер $browser->set_count(2); $browser->set_active_browser(1,true); // переходим на сайт $browser->navigate($sites[$ii]); // wait on browser $browser->wait_for(); // запишем домен на который перешли $dmn = $webpage->get_domain(); // если домен не пустой запишем его папку res в текстовый файл // название файла ключевое слово if($dmn!="") $textfile->add_string_to_file("./res/".$key.".txt",$dmn."\n",60) ; // закрываем и переходим обратно $browser->close_all_tabs(); $browser->set_active_browser(0,true); } $kk++; } } // ////////////////////////////// дополнительные модули /////// // выдать сообщение в панель отладки function debug_mes($mess) { global $dbg; // отладочные сообщения if($dbg) echo $mess."
"; } // Quit $app->quit();

После запуска этого скрипта в папке res появятся файлы с именами в виде ключевых слов,
в которых будут записаны урлы выдачи гугль по данным ключевым словам. Для того что бы скрипт работал быстрее можно отключить всё лишнее в настройках программы.
Картиники, js, active X, frame и т.д.

Скрипт написан 07.02.2012 в Human Emulator 4.4 Advanced.
На момент публикации статьи 08.02.2012 скрипт был рабочий.

скачать скрипт

Скрипт сборщик данных RTS биржи на сайте rts.ru

Помимо регистрации и сабмита данных на различные ресурсы может встать задача по сбору каких либо данных в сети.
Предположим нам нужно собрать, обработать и сохранить данные по торгам на RTS бирже. Перейдём на сайт биржи,
где предоставляется необходимая нам информация http://www.rts.ru/ru/spot/.

Перед нами таблицы с индексами, объёмами торгов и акциями. Напишем скрипт, который будет собирать и хранить данные по индексам.

Как всегда создадим новый скрипт используя Ctrl+N и заменим http://www.google.com на http://www.rts.ru/ru/spot/.
Запустим скрипт на выполнение и перейдём на нужную нам страницу. Создадим папку RTS в папке My Scripts и, используя команду Save as…,
сохраним наш скрипт под именем rts_ru.php в только что созданную нами папку.

Примечание: При переименовании файла нужно обращать внимание на строку require(«../../Templates/xweb_human_emulator.php»);.
Это строка путь к шаблону php с объектами XHE. Если этот путь будет неправильным, скрипт работать не будет.
В папке My Scripts у скриптов эта строка задаётся как require(«../Templates/xweb_human_emulator.php»);,
так как файл xweb_human_emulator.php лежит на одну папку выше в папке Templates. Из-за того что мы создали папку
RTS и поместили туда скрипт получается что файл шаблон лежит на две папки выше. Для того что бы наш скрипт
видел этот файл мы должны добавить ../ в путь к шаблону. Если вам тяжело работать с относительным путём к
файлу шаблона вы всегда можете использовать абсолютный путь,
который будет выглядеть например как require(«C:\XWeb\Human Emulator\Templates\xweb_human_emulator.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");

// navigate to google
$browser->navigate("http://www.rts.ru/ru/spot/");
// wait on browser
$browser->wait_for();
//получить количество таблиц на странице
echo $cnt = $table->get_count();
// пройдёмся по всем таблицам
for($ii=0;$ii<$cnt;$ii++)
{ 
     // получим первый ряд $ii-той таблицы
     $str = $ii." таблица ряд 0\n\n\n";     
     $str = $str.$table->get_row_by_number($ii,0,true)."\n\n\n";
     // запишем результат в файл
     $textfile->add_string_to_file("tables.txt",$str,0) ;
}

// Quit
$app->quit();

Просматривая файл с результатами находим следующие строки:

24 таблица ряд 0

B>Индексы/B>

Теперь мы знаем номер нужной нам таблицы с данными. Опять, используя команду Save As…, сохраним наш текущий скрипт как get_tables.php. Пригодится. Затем закроем его и откроем скрипт rts_ru.php. Удалим из него лишнее, оставив только навигацию на нужную нам страницу.

Итак, у нас есть номера нужных таблиц. Можно найти эту таблицу через Дерево Элементов и через Элемент Инспектор посмотреть какие атрибуты у неё есть. К сожалению, кроме номера и размера с координатами ничего нет, поэтому будем работать с ними через их номера.

Примечание: Описание всех объектов и их функций можно найти на сайте humanemulator.net. Документация по объекту table находится по адресу http://humanemulator.net/objects/DOM/table.php.

При дальнейшем рассмотрении таблицы обнаружилось, что в неё вложены другие таблицы. Это затрудняет работу с ними через объект table и его функции получения рядов и колонок, поэтому будем работать через разбор полученных исходников таблиц. Для этого используем функцию get_inner_html.

Сделаем вызов этой функции для 24 таблицы и сохраним исходники в файл для дальнейшего изучения. Для этого добавим код:

// получить исходники таблицы
$tb1=$table->get_inner_html(24);

// запишем результат в файл
$textfile->write_file("table.txt",$tb1,0) ;

Просмотрим созданный файл и выберем префиксы для разбора. Первое что нас интересует это название индекса. Он заключён в следующем коде: A class=Thurl href=»/ru/index/rtsi/»>RTSI/A> Первый префикс будет A class=Thurl href=», с помощью него мы будем находить эту строку и уже из неё вырезать название индекса. Для этого добавим следующий код:

// перфикс для нахождения строки с названием идекса
$pref = "A class=Thurl href=\"";
// префикс перед названием индекса
$pref1 = "\">";
// префикс после названия индекса
$pref2 = "/A>";
// номер в строке первого префикса
$ind1= strpos($tb1,$pref);
// номер в строке второго префикса относительно первого
$ind2= strpos($tb1,$pref1,$ind1);
// номер в строке третьего префикса относительно второго
$ind3= strpos($tb1,$pref2,$ind2);

// название индекса заключено между номером второго префикса + длина самого префикса
//  и номером третьего префикса
echo $ind_name = substr($tb1,$ind2+strlen($pref1),$ind3-$ind2-strlen($pref1));

Запустим скрипт на выполнение и получим в окне отладки название первого индекса. Так как этот код нам придётся вызывать несколько раз оформим его в функцию, в которую будем передавать строку и номер символа, с которого надо будет выполнять поиск и разбор. Этот номер символа будем изменять на последний найденный нами. Для этого перед названием передаваемого в функцию параметра ставится символ &. Функция будет выглядеть так:

// получить название индекса
function get_index_name($tb1,&$ind_st) // &
{
  // перфикс для нахождения строки с названием идекса
  $pref = "A class=Thurl href=\"";
  // префикс перед названием индекса
  $pref1 = "\">";
  // префикс после названия индекса
  $pref2 = "/A>";
  // номер в строке первого префикса
  $ind1= strpos($tb1,$pref,$ind_st);
  // номер в строке второго префикса относительно первого
  $ind2= strpos($tb1,$pref1,$ind1);
  // номер в строке третьего префикса относительно второго
  $ind3= strpos($tb1,$pref2,$ind2);
   // изменим стартовый индекс
   $ind_st=$ind3;
  // название индекса заключено между номером второго префикса + длина самого префикса
  //  и номером третьего префикса
  return substr($tb1,$ind2+strlen($pref1),$ind3-$ind2-strlen($pref1));
}  

Вызов функции и проверка изменения стартового номера символа в строке:

// стартовый номер символа для поиска префиксов
$ind_st=0;
// получить название индекса
echo $ind_name = get_index_name($tb1,$ind_st);
// покажем изменение индекса
echo $ind_st;

Весь скрипт будет выглядеть так:


$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// navigate to google
$browser->navigate("http://www.rts.ru/ru/spot/");
// wait on browser
$browser->wait_for();

// получить исходники таблицы
$tb1=$table->get_inner_html(24);

// стартовый индекс для поиска префиксов
$ind_st=0;
// получить название индекса
echo $ind_name = get_index_name($tb1,$ind_st);
// покажем изменение индекса
echo $ind_st;

// получить название индекса
function get_index_name($tb1,&$ind_st)
{
  // перфикс для нахождения строки с названием идекса
  $pref = "A class=Thurl href=\"";
  // префикс перед названием индекса
  $pref1 = "\">";
  // префикс после названия индекса
  $pref2 = "/A>";
  // номер в строке первого префикса
  $ind1= strpos($tb1,$pref,$ind_st);
  // номер в строке второго префикса относительно первого
  $ind2= strpos($tb1,$pref1,$ind1);
  // номер в строке третьего префикса относительно второго
  $ind3= strpos($tb1,$pref2,$ind2);
   // изменим стартовый индекс
   $ind_st=$ind3;
  // название индекса заключено между номером второго префикса + длина самого префикса
  //  и номером третьего префикса
  return substr($tb1,$ind2+strlen($pref1),$ind3-$ind2-strlen($pref1));
}  

// Quit
$app->quit();

При запуске этого скрипта он выдаст название первого индекса и изменённый стартовый номер символа для поиска и разбора.

Для удобочитаемости скриптов функции лучше сносить в отдельные файлы и их уже подключать в скрипт. Для этого через Save As сохраним текущий скрипт как functions.php в эту же папку. Теперь удалим из него всё лишнее. Файл functions.php будет выглядеть следующим образом:


// получить название индекса
function get_index_name($tb1,&$ind_st)
{
  // перфикс для нахождения строки с названием идекса
  $pref = "A class=Thurl href=\"";
  // префикс перед названием индекса
  $pref1 = "\">";
  // префикс после названия индекса
  $pref2 = "/A>";
  // номер в строке первого префикса
  $ind1= strpos($tb1,$pref,$ind_st);
  // номер в строке второго префикса относительно первого
  $ind2= strpos($tb1,$pref1,$ind1);
  // номер в строке третьего префикса относительно второго
  $ind3= strpos($tb1,$pref2,$ind2);
   // изменим стартовый индекс
   $ind_st=$ind3;
  // название индекса заключено между номером второго префикса + длина самого префикса
  //  и номером третьего префикса
  return substr($tb1,$ind2+strlen($pref1),$ind3-$ind2-strlen($pref1));
}  

Теперь закроем его и откроем опять файл rts_ru.php, в котором находится наш скрипт. Удалим оттуда всё лишнее и подключим файл function.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");

// подключить файл с функциями
include("functions.php");

// navigate to google
$browser->navigate("http://www.rts.ru/ru/spot/");
// wait on browser
$browser->wait_for();

// получить исходники таблицы
$tb1=$table->get_inner_html(24);

// стартовый индекс для поиска префиксов
$ind_st=0;
// получить название индекса
echo $ind_name = get_index_name($tb1,$ind_st);
// покажем изменение индекса
echo $ind_st;

// Quit
$app->quit();

При запуске этого скрипта получим тот же результат что и до переноса функции в отдельный файл.

Теперь продолжим изучение исходников таблицы в файле table.txt для дальнейшего разбора данных.
Нужные нам данные помещены в следующие тэги:

1516.20;

По аналогии с написанным выше добавим функцию разбора для этой части исходного кода таблицы. В данном случае обойдёмся без предварительного префикса нахождения нужной нам строки. В итоге код функции:

// получить данные для индекса
function get_data($tb1,&$ind_st)
{
    // первый префикс
    $pref1 = "";
    // второй префикс
    $pref2 = "";

   // номер в строке первого префикса
   $ind1= strpos($tb1,$pref1,$ind_st);
   // номер в строке второго префикса
   $ind2= strpos($tb1,$pref2,$ind1);
   
   // нужные нам данные
   $data = substr($tb1,$ind1+strlen($pref1), $ind2- $ind1-strlen($pref1)); 

   // запомним последний найденый номер префикса 
   $ind_st = $ind2;
 
   // уберём лишнее из полученных данных 
   $data= str_replace("","",$data);
   $data= str_replace("","",$data);
   $data= str_replace("font color=red>","",$data);
   $data= str_replace("/font>","",$data);
   $data= str_replace("font color=green>","",$data);

   return $data;
}

Добавим её в файл functions.php. И сделаем вызов в нашем скрипте таким кодом:

// покажем полученные данные
echo get_data($tb1,$ind_st);

После запуска этого кода в окне отладки будет отображать содержимое первой колонки первого ряда таблицы.

Теперь нам надо добавить цикл, что бы получать данные для каждого индекса и формировать из них строку для записи в файл. После детального изучения исходного кода таблицы выяснилось, что она состоит из 8 колонок. В первой колонке, сразу за названием индекса, либо график либо ничего нет, поэтому эта колонка нам не интересна и мы её будем пропускать. Цикл организуем через оператор while следующим образом:

// результирующая строка
$str_res="";

// цикл для разбора всех данных таблицы
while($ind_st!==false)
{
   // укажем что используем глобальную переменную
   global $str_res;

   // получить название индекса
   $str_res = $str_res.get_index_name($tb1,$ind_st);

   // остановить как только не сможем найти нужный префикс
   if(!$ind_st)
      break;
  
   // цикл для разбора данных текущего индекса
   for ($ii=0;$ii<8;$ii++)
   {
      // покажем полученные данные
      $dts = get_data($tb1,$ind_st);
     
      // добавим все кроме первого значения с графиком
      if($ii!=0)
      {  
           // укажем что используем глобальную переменную
           global $str_res;
           // добавим данные в строку
          $str_res =$str_res.";".$dts;
      }
    }
        // прибавим перенос строки
        $str_res =$str_res."\n";
}

Для того что бы этот цикл останавливался надо добавить проверку в функцию получения названия индекса get_index_name, которая определена в файле functions.php:

// получить название индекса
function get_index_name($tb1,&$ind_st)
{
  // перфикс для нахождения строки с названием идекса
  $pref = "A class=Thurl href=\"";
  // префикс перед названием индекса
  $pref1 = "\">";
  // префикс после названия индекса
  $pref2 = "/A>";
  // номер в строке первого префикса
  $ind1= strpos($tb1,$pref,$ind_st);

  // проверка если не нашли то выходим
  if($ind1===false)
  {
       $ind_st = false;
       return "";
  }

  // номер в строке второго префикса относительно первого
  $ind2= strpos($tb1,$pref1,$ind1);
  // номер в строке третьего префикса относительно второго
  $ind3= strpos($tb1,$pref2,$ind2);
   // изменим стартовый индекс
   $ind_st=$ind3;
  // название индекса заключено между номером второго префикса + длина самого префикса
  //  и номером третьего префикса
  return substr($tb1,$ind2+strlen($pref1),$ind3-$ind2-strlen($pref1));
}  

Добавим запись в файл. Наш скрипт теперь будет выглядеть так:


$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// подключить файл с функциями
include("functions.php");

// navigate to google
$browser->navigate("http://www.rts.ru/ru/spot/");
// wait on browser
$browser->wait_for();

// получить исходники таблицы
$tb1=$table->get_inner_html(24);

// стартовый индекс для поиска префиксов
$ind_st=0;

// результирующая строка
$str_res="";

// цикл для разбора всех данных таблицы
while($ind_st!==false)
{
   // укажем что используем глобальную переменную
   global $str_res;

   // получить название индекса
   $str_res = $str_res.get_index_name($tb1,$ind_st);

   // остановить как только не сможем найти нужный префикс
   if(!$ind_st)
      break;
  
   // цикл для разбора данных текущего индекса
   for ($ii=0;$ii<8;$ii++)
   {
      // покажем полученные данные
      $dts = get_data($tb1,$ind_st);
     
      // добавим все кроме первого значения с графиком
      if($ii!=0)
      {  
           // укажем что используем глобальную переменную
           global $str_res;
           // добавим данные в строку
          $str_res =$str_res.";".$dts;
      }
    }
        // прибавим перенос строки
        $str_res =$str_res."\n";
}

// запишем данные
$textfile->write_file("res.csv",$str_res,0) ;

// Quit
$app->quit();

Можем немного усовершенствовать запись в файл. Так как в одном из столбцов содержится время, будем получать его и создавать файл по этому времени. И так же будем добавлять данные в общий результирующий файл res.csv. Перед этим создадим папку с именем res, куда будем писать все файлы с результатами, что бы не захламлять папку где лежит сам скрипт. После всех проделанных операций имеем:


$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// подключить файл с функциями
include("functions.php");

// navigate to google
$browser->navigate("http://www.rts.ru/ru/spot/");
// wait on browser
$browser->wait_for();

// получить исходники таблицы
$tb1=$table->get_inner_html(24);

// стартовый индекс для поиска префиксов
$ind_st=0;

// результирующая строка
$str_res="";

// время индекса 
$i_time = "";

// цикл для разбора всех данных таблицы
while($ind_st!==false)
{
   // укажем что используем глобальную переменную
   global $str_res;

   // получить название индекса
   $str_res = $str_res.get_index_name($tb1,$ind_st);

   // остановить как только не сможем найти нужный префикс
   if(!$ind_st)
      break;
  
   // цикл для разбора данных текущего индекса
   for ($ii=0;$ii<8;$ii++)
   {
      // покажем полученные данные
      $dts = get_data($tb1,$ind_st);
     
      // добавим все кроме первого значения с графиком
      if($ii!=0)
      {  
           // укажем что используем глобальную переменную
           global $str_res;
           // добавим данные в строку
          $str_res =$str_res.";".$dts;
      }
      // получение времени индекса
      if($ii==1) 
      { 
        global $i_time; 
        // заменим : на - чтобы можно было создавать файл 
        $i_time=str_replace(":","-",$dts);
      }
    }
        // прибавим перенос строки
        $str_res =$str_res."\n";
}

// запишем данные в файл с указанием времени
$textfile->write_file("/res/res".$i_time.".csv",$str_res,0) ;
// запишем данные в общий файл
$textfile->add_string_to_file("/res/res.csv",$str_res,0) ;

// Quit
$app->quit();

После запуска этого скрипта в созданной вами папке res появится два файла один res.csv, второй типа res14-27.csv. При повторном запуске добавиться ещё один файл типа res14-29.csv и т.д. Так как данные на сайте для индексов обновляются практически каждую минуту, то можно в расписании запуска скриптов добавить запуск этого скрипта скажем каждые две минуты.

Скрипт написан 25.01.2012 в Human Emulator 4.2 Advanced.
На момент публикации статьи 25.01.2012 скрипт был рабочий.

скачать скрипт

Скрипт Human Emulator парсер прокси

В этой статье мы подробно рассмотрим пример создания парсера прокси с ресурса freeproxylists.com

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

$browser->navigate('http://freeproxylists.com/elite.html');
$browser->wait_for(240,1);

На каждой такой странице висит около полутора десятка списков прокси, которые регулярно проверяются и пополняются. Наша задача – поочерёдно зайти в каждый список и собрать там необходимые данные. Human Emulator предоставляет много вариантов работы с различными ссылками. Лучше всего в данном случае подойдёт функция $anchor->click_by_inner_text . Работа по прямым урлам тут бесполезна, поскольку они постоянно меняются. Для работы по номеру нужна уверенность, что количество урлов на странице в течение долгого времени будет неизменным. А заморачиваться с работой по атрибутам, когда есть другие варианты, лучше не надо.

Щёлкнув правой кнопкой мышки по линку одного из списков, можно обнаружить в выпадающем меню функцию вроде $anchor->click_by_inner_text(‘elite #9′,’true’); , которую нужно добавить в скрипт вместе с $browser->wait_for(240,1); К пояснениям по этой части скрипта вернёмся позднее.

Наконец-то перед нами долгожданный список прокси. К сожалению, на этом сайте айпи и порты находятся в разных колонках, так что придётся немного повозиться, чтобы сохранить их в должном виде. Для получения данных поможет функция $webpage->get_body_inter_prefix_all();

На входе эта функция получает :

  • Первый префикс. Знак или знаки, с которых начинаются искомые данные.
  • Второй префикс. Знак или знаки, которыми закрываются искомые данные.
  • Включение/выключение отображения в найденном ХТМЛ элементов. Бывает true и false.
  • И два необязательных параметра:

  • Сдвиг получаемого текста от первого префикса на указанное число знаков. Может быть отрицательным.
  • Сдвиг получаемого текста от второго префикса на указанное число знаков. Может быть отрицательным.

Возвращает функция весь текст, попадающий между указанными нами двумя префиксами.

Если выделить часть страницы с прокси и нажать «Show Selected Source», то в открывшемся исходном коде страницы можно увидеть тэг TD> , закрывающий искомые нами айпишники с портами. Таким образом, заполненная и готовая к использованию функция будет выглядеть так:

$webpage->get_body_inter_prefix_all('TD>','/TD>',true); 

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

Теперь нужно привести данные в удобоваримый вид. Сохранив полученные функцией цифры в текстовый файл можно заметить, что всё его содержимое разделено тэгом переноса и выглядит как одна строка. Куда удобней, когда после айпишника прокси через двоеточие идёт порт, а каждая такая конструкция находится на новой строке. Для того, чтобы этого добиться, придётся обратиться к PHP.

Добавьте в скрипт следующий код:

//Открываем/создаём файл для готовых списков прокси
$txt = fopen("c:\\123.txt", "a+");

// Задаём стартовые значения рабочих переменных
$ind = 0;
$cod = 1;
$i=0;
// Цикл выкусывания прокси и портов
while ($cod!=false)
{
	$ind1 = strpos($s,'
',$ind); $cod = substr($s,$ind,$ind1-$ind); $ind = $ind1+4; $i++; // Проверка для сохранения прокси в нужном нам виде. If ($i % 2 != 0) fwrite($txt, $cod); else fwrite($txt, ":$cod\r\n"); } fclose($txt);

Теперь, в окне скриптов программы у вас должен находиться следующий текст:

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");

$browser->navigate('http://freeproxylists.com/elite.html');
$browser->wait_for(240,1);

$anchor->click_by_inner_text('elite #9','true');
$browser->wait_for(240,1); 

$s = $webpage->get_body_inter_prefix_all('TD>','/TD>',true); 

//Открываем/создаём файл для готовых списков прокси
$txt = fopen("c:\\123.txt", "a+");

// Задаём стартовые значения рабочих переменных
$ind = 0;
$cod = 1;
$i=0;

// Запускаем цикл выкусывания прокси и портов
while ($cod!=false)
{
	$ind1 = strpos($s,'
',$ind); $cod = substr($s,$ind,$ind1-$ind); $ind = $ind1+4; $i++; // Проверка для сохранения прокси в нужном нам виде If ($i % 2 != 0) fwrite($txt, $cod); else fwrite($txt, ":$cod\r\n"); } fclose($txt); // Quit $app->quit();

Давайте запустим его и проверим после отработки файл 123.txt на диске C.

Если восторг по поводу полученного результата уже закончился, продолжим. Самая сложная часть скрипта уже готова, нам осталось только настроить его для прохода по всем спискам проксей нужного нам типа на сайте. Вернёмся к восьмой строке нашего скрипта (нумерацию линий можно включить в настройках: F9, закладка «PHP редактор», галочка «Показывать нумерацию линий»). Как видите, в качестве первого аргумента для функции выступает имя списка, в котором присутствует цифра от 1 до 14. За это можно зацепиться для последовательного перехода и парсинга списков. Обернём весь наш скрипт в цикл for, в условиях которого можно задать последовательное увеличение значения переменной $ii. Эту переменную мы будем использовать для переходов к нужным спискам.

Должно получиться что-то вроде:

for ($ii=1;$ii<20;$ii++)
{

	$browser->navigate('http://freeproxylists.com/elite.html');
	$browser->wait_for(240,1);
	
	$anchor->click_by_inner_text("elite #$ii",'true');
	$browser->wait_for(240,1);

// Остальной скрипт
}

Вот теперь можно быть уверенными, что скрипт соберёт все списки элитных прокси с сайта, после чего запишет их в текстовый файл.

Домашние задания:

  • Найти в программе функцию, которая проверяет файл на дубли, и добавить в скрипт. Повторяющихся прокси на этом ресурсе довольно много.
  • Добавить в скрипт возможность сбора любого другого типа прокси с этого сайта.
  • Сравнить свой получившийся скрипт с примером ниже и разобраться для чего сделаны различные косметические добавки.

Пример готового скрипта:

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");

for ($ii=1;$ii<20;$ii++)
{
	echo "Парсим список №$ii
"; $browser->navigate('http://freeproxylists.com/elite.html'); $browser->wait_for(240,1); if ($anchor->click_by_inner_text("elite #$ii",'true')==true) { $browser->wait_for(240,1); sleep(2); $s = $webpage->get_body_inter_prefix_all('TD>','/TD>',true); //Открываем/создаём файл для готовых списков прокси $txt = fopen("c:\\123.txt", "a+"); // Задаём стартовые значения рабочих переменных $ind = 0; $cod = 1; $i=0; // Запускаем цикл выкусывания прокси и портов while ($cod!=false) { $ind1 = strpos($s,'
',$ind); $cod = substr($s,$ind,$ind1-$ind); $ind = $ind1+4; $i++; // Проверка для сохранения прокси в нужном виде If ($i % 2 != 0) { fwrite($txt, $cod); echo $cod; } else { fwrite($txt, ":$cod\r\n"); echo ":$cod
"; } } fclose($txt); } else { $ii=$ii+20; echo "Нет такого списка
"; } } echo "Закончили сбор"; // Quit $app->quit();

скачать скрипт

Количество скачиваний: