[FAQ] Как грамотно писать скрипты под Human Emulator.

Здравствуйте Уважаемые читатели мое блога, сегодня речь пойдет о грамотном написании скриптов под Human Emulator.

1. Разгружаем ОЗУ

У продукта Human Emulator есть один маленький недостаток, который, как я полагаю, будет в будущем исправлен программистами. Ну не что не поделаешь, есть «поломка» надо её чинить или стоять на месте. На помощь нам придет класс для управления работой приложения *app и класс управления отладкой *debug.

Советую в конце каждого скрипта, вставлять следующий код:

if ($debug->get_cur_mem_size()>268435456){

   $app->restart();

  }

Итак, с помощью функции $debug->get_cur_mem_size() мы получаем текущий размер памяти, занимаемый эмулятором. И как только текущий размер памяти больше 256 Мб, программа перезагружается.

2. Альтернатива цикла for()

Рассмотрим на примере. Допустим у нас есть файл sites.txt. В файле записаны построчно адреса сайтов, их около 100 000. Нам с помощью Human Emulator, на каждый сайт нужно зайти. Скрипт простой и хочется написать его с использованием цикла for()

<?php
// The following code is required to properly run Xedant.com Human Emulator
require("../Templates/xedant_human_emulator.php");

$sites=file("sites.txt");

for ($i=0;$i<count($sites);$i++)
{

$browser->navigate($sites[$i]);
$browser->wait_for(240,1);

sleep(4);
}
// Quit
$app->quit();
?>

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

$app->restart();

Но с использованием цикла for() нельзя выполнять перезагрузку, т.к. весь цикл оборвется. Поэтому мы пойдем другим путем:

<?php
// The following code is required to properly run Xedant.com Human Emulator
require("../Templates/xedant_human_emulator.php");

$sites=file("sites.txt");
$site = array_shift($sites);
$site = trim($site);

if (!empty($site)){

$browser->navigate($site);
$browser->wait_for(240,1);

}

      $write = implode("",$sites);

      $fp = fopen ("sites.txt", "w+");
      fwrite ($fp, $write);
      fclose ($fp);

     if ($debug->get_cur_mem_size()>268435456){

   $app->restart();

  }

// Quit
$app->quit();
?>

С помощью функции array_shift() мы извлекаем первый элемент массива и дальше работаем с ним, в конце скрипта мы объединяем элементы массива в строку (без первого элемента) и перезаписываем файл sites.txt.

Можно сделать немного по-другому, без удаления сток из массива, но нужно создать файл i.txt и перед первым запуском скрипта записать в файл 0 :


<?php
// The following code is required to properly run Xedant.com Human Emulator
require("../Templates/xedant_human_emulator.php");

$sites=file("sites.txt");

$i = file_get_contents("i.txt");

$site = trim($sites[$i]);

if (!empty($site)){

$browser->navigate($site);
$browser->wait_for(240,1);

}

      $write = $i++;

      $fp = fopen ("i.txt", "w+");
      fwrite ($fp, $write);
      fclose ($fp);

// Quit
$app->quit();
?>

Теперь идем в меню программы Скрипты=> Расписание скриптов => Добавить. Прописываем путь к нашему скрипту, в разделе Тип – ставим бесконечно.

3. Выполняйте проверку

Я стараюсь писать скрипты с проверкой существования объектов. Например, скрипт авторизации в Твитере:


$browser->navigate('http://twitter.com/login');
$browser->wait_for(60,1);

if($input->set_value_by_name('username_or_email',$login)===TRUE){
   $browser->wait_for(60,1);

      if ($input->set_value_by_name('password',$pass)===TRUE){
          $browser->wait_for(60,1);

                       if ($button->click_by_name('signin_submit')===TRUE){
                           $browser->wait_for(60,1);

                           // выполняем какое нибудь действие  и т.д.

                          }

          {

}

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

Постовой: Очень важно психическое развитие ребенка. Родители – будьте заботливее.

Посты:


2leep.com

9 коммент. к записи “[FAQ] Как грамотно писать скрипты под Human Emulator.”

  • ВадимIdenticon Вадим 25.09.2010 - 7:15 дп

    Вы очень грамотный человек. Очень помогла подсмотренная в ваших скриптах функция $webpage->print_screen(«C:/temp/captcha.jpg») для борьбы с ReCaptcha. Продолжайте писать. Спасибо!

    [Ответить]

  • ЮлияIdenticon Юлия 08.11.2010 - 12:51 пп

    Подскажите пожалуйста, как реализовать функцию «нажать на ссылку по внутреннему тексту»… если я хочу использовать один скрипт… для размещения на одну и ту же доску…

    только в одном случае мне надо перейти на УСЛУГИ, в другом случае на РАСТЕНИЯ….

    чтобы каждый раз в скрипте не менять… а поменять в тектовом файле.

    [Ответить]

  • ДимIdenticon Дим 30.06.2011 - 8:47 дп

    Отличные статьи по хуману !
    А Нет идей как добавить немного интерактивности хуман емулятору, что то типа полуавтоматического режима заполнения в аллсабмитере. просто хуман не совсем справляеться и иногда ему хочеться помочь ?

    [Ответить]

  • krokozyaberIdenticon krokozyaber 03.07.2011 - 3:22 пп

    Приветствую. Вы уж простите, что начинаю общение в таком тоне, но увы, тема не раскрыта полностью. Итак,
    1) if ($debug->get_cur_mem_size()>268435456)
    Цифра может быть разной. Я тестировал в разных ситуациях, на разном железе. Объективных критериев не нашел. Но есть простой способ выяснить предел хумана на вашем конкретном железе. (Об этом ниже).

    2) $app->restart();
    При таком применении скрипт не запускается автоматически и вы можете потратить много времени, прежде чем увидите, что скрипт не исполняется. Хуман емулятор еще не настолько умен, чтобы догадываться, что после перезапуска нужно запустить ранее исполнявшийся скрипт. Поэтому нам надо это ему сказать.
    Если ваш скрипт находится в стандартном месте хранения – просто указываете его имя:
    $app->restart(«script.php»);

    А теперь вернемся к нашим баранам. То есть, к тому как определить предел занятой памяти, после которого происходит вылет хумана:
    Все проще, чем кажется. Загоняем объем занятой памяти в переменную и пишем ее в файл.
    (Я предпочитаю использовать функцию для записи, чем каждый раз описывать все заново)

    function write_file($path,$page_body)
    {
    $file=fopen($path,»a+»);
    fputs($file,$page_body);
    fclose($file);
    }

    $mem=$debug->get_cur_mem_size();
    write_file(«C:\\memory.txt»,»$mem \r\n»);

    if ($debug->get_cur_mem_size()>253186560)
    {
    $app->restart(«script.php»);
    }

    Таким образом, запустив свой скрипт в первый раз – вы будете на чеку. И как только он вылетит – предпоследняя запись в файле C:\\memory.txt и будет предлелом для вашей конфигурации.

    Мне очень понравился Human Emulator. И если бы не его заоблачная цена, я наверняка приобрел бы его в свое пользование. Однакоя нашел альтернативу – PHP Symfony Framework, которая, кроме того, что бесплатна, по стабильности и функционалу бьет эмулятор, не оставляя ему ни шанса. Все просто. Если вы захотите выжать хотя бы 70% эффективности хумана – придется поднатореть в программировании на PHP. И тогда вам уже будет проще писать непосредственно на PHP, который будет работать даже локальном денвере, который, кстати, тоже бесплатен :-)

    Удач вам всем и побольше бесплатного софта!

    [Ответить]

  • adminIdenticon admin 03.07.2011 - 5:20 пп

    krokozyaber спасибо за итересный комментарий – статью. Для автоматического запуска скрипта, после перезапуска хумана, можно использовать как конструкцию

    $app->restart(«script.php»);

    Так и конструкцию

    $app->restart();

    Только во втором случае, нужно выставить в программе автоматический запуск скрипта Скрипты-> Расписание Скриптов
    Там и выставляем периодичность запуска. Это очень удобно.

    [Ответить]

    krokozyaberIdenticon krokozyaber

    В моем случае применение
    $app->restart();
    невыгодно.

    Я написал парсер, который выкашивает статьи регулярками. И мне кажется, что именно регулярки сильно грузят хумана. Но это не так важно. Когда я пробовал использовать запуск по расписанию, то:
    1. Если в назначенное время запуска скрипт был уже запущен – хуман вылетал с ошибкой и работа прекращалась.
    2. Если скрипт вылетал раньше срока, то терялось драгоценное время. В итоге, мое решение оказалось оптимальным для моей ситуации. Скрипт перезагружается и запускается сразу же после перезапуска. При таком алгоритме не бывает простоев.

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

    С переходом на symfony и сменой точки зрения на программерскую – я нашел другое решение. Но на хумане его не реализовать. Не потянет он 1000+ потоков. А LAMP с симфонией на ubuntu запущенная в виртуальном боксе – легко.

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

    [Ответить]

  • ПавелIdenticon Павел 13.08.2011 - 8:04 пп

    Хороший блог, добавил в закладки. У меня есть небольшой вопрос, как сделать скрипт который бы прошелся по сайту нажимая только на те страницы на которых еще не был. page1=>page2>page3

    [Ответить]

  • [Скрипт XHE] Массовая смена почты в ЖЖ | Блог PHP программиста | php скрипты | скрипт human emulator | компоненты 1С-Битрикс | скрипты 1c-Bitrix 22.01.2012 - 8:44 пп

    [...] промежуток времени, о данном методе я уже писал и использую его в большинстве своих скриптов.На самом [...]

  • prixodIdenticon prixod 30.01.2012 - 4:41 пп

    Привет! Вопрос по теме! Написал реггер на фриху. не могу понять в чем трабла. скрипт до сегодняшнего дня работал нормально, а теперь вылетает с ошибкой при записи в файл. нашел здесь решение путем вычисления занятой памяти. мне не помогает. остальные реггеры работают без ошибок. admin помоги разобраться. регер могу выслать на мыло. просто пробеги глазами, наверняка где то закралась какая то не нужная закорючка))

    [Ответить]

Прокомментировать