Программа Сборщик email адресов это первый наш программный продукт написанный с использованием C# Human Emulator API. Посмотреть описание и скачать инсталятор программы программы можно в этой статье >>.
Описание проекта.
Проект EmailParser написан в Microsoft Visual Studio 2010. Под эту же студию адаптирована и библиотека XHE.dll. Про то как подключать XHE.dll к проекту мы уже писали в статье Скрипты на C# в Human Emulator.
Структура проекта.
Класс MainWnd — главное окно программы. В этом классе прописаны реализация пользовательского интерфейса. Настройки сбора. Запуск/Остановка сбора. Отображение результатов в табличном виде. Сохранение результатов в файл.
Класс Script : XHEScript — класс, в котором прописан весь функционал по работе с Human Emulator. Этот класс унаследован от класса XHEScript из библиотеки XHE.dll.
Класс ThreadTask : BackgroundWorker — класс, который запускает сбор Email адресов в отдельном потоке. Таким образом не блокируется доступ пользователя к главному окну программы.
Пример кода из проекта.
Функция OnDoWork(DoWorkEventArgs e) запускает сбор в отдельном потоке
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
protected override void OnDoWork(DoWorkEventArgs e) { // начальный порт int m_iPort = 7010; int i=0; int iPercent = 0; ReportProgress(iPercent, "Начинаем сбор..."); // пройдёмся по всем ключам foreach (string sKey in m_sKey) { // создаём объект класса скрипт Script m_Scripts = new Script(mainWnd); // логи Program.SetLog("Запускаем Human Emulator на порту " + m_iPort.ToString()); // запускаем Human Emulator на любом свободном порту начиная с 7010 m_Scripts.RunHuman(ref m_iPort); // назовём поток по порту на котором он работает //Thread.CurrentThread.Name = m_iPort.ToString(); // пауза а заодно и проверка на оставноку потока if (PauseAndCheck(3, e, m_Scripts, m_iPort)) return; // логи Program.SetLog("Запустили Human Emulator на порту " + m_iPort.ToString()); // инициализация объектов Хумана для заданного порта m_Scripts.InitXHE(m_iPort); // пауза а заодно и проверка на оставноку потока if (PauseAndCheck(2, e, m_Scripts, m_iPort)) return; // задать настроки браузера m_Scripts.SetBrowserSettings(); // пауза а заодно и проверка на оставноку потока if (PauseAndCheck(2, e, m_Scripts, m_iPort)) return; Program.SetLog("Ищем email адреса по ключу: " + sKey.Trim());//+ ". Выполнено " + iPercent.ToString() + "% "); //lbCurProg.Text = "Ищем email адреса по ключу: " + lines[i].Trim() + ". Выполнено " + iPercent.ToString() + "% "; // запускаем поиск по фразе m_Scripts.NavigateSE(sKey, "http://www.google.ru"); // пауза а заодно и проверка на оставноку потока if (PauseAndCheck(2, e, m_Scripts, m_iPort)) return; // текущая страница поисковой выдачи int iCrntPage = 1; // глубина переходов в поисковую выдачу int iLastPage = Properties.Settings.Default.iPagesCnt; // разбор поисковой выдачи while (true) { List<string> arrGooglesrp = m_Scripts.GetGoogleSerp(iCrntPage); // System.Windows.Forms.Application.DoEvents(); // проверяем получили ли выдачу if (arrGooglesrp == null) { Program.SetLog("Не смогли получить выдачу для страницы " + iCrntPage.ToString()); } else { Program.SetLog("Вызываем ParseEmail..."); // ищем все email адреса на сайте из выдачи m_Scripts.ParseEmail(arrGooglesrp, mainWnd.arrEmails); } // пауза а заодно и проверка на оставноку потока if (PauseAndCheck(3, e, m_Scripts, m_iPort)) return; // выходим из цикла как только не смогли перейти на следующую страницу if (!m_Scripts.NextPage(ref iCrntPage, iLastPage)) break; } // чистим всё и выходим //m_Scripts.ClearAndRestart(); m_Scripts.CloseHuman(); m_iPort++; try { // удалим папку с портом if (Directory.Exists(Properties.Settings.Default.sHumanPath + "\\" + m_iPort.ToString())) Directory.Delete(Properties.Settings.Default.sHumanPath + "\\" + m_iPort.ToString(), true); } catch { Program.SetLog("Ошибка при удалении папки с портом " + Properties.Settings.Default.sHumanPath + "\\" + m_iPort.ToString() + "!"); } // вычисляем процент собранного double dVal = Convert.ToDouble(i + 1) / Convert.ToDouble(m_sKey.Length) * 100; iPercent = Convert.ToInt16(dVal); ReportProgress(iPercent, "Идёт сбор..."); i++; } Program.SetLog("Сбор закончен!"); ReportProgress(100, "Готово!"); return; } |
Как мы видим код хорошо прокомментарен и будет понятен любому кто знаком с языком C#. Логика работы сбора очень проста.
Получив список ключевых фраз из главного окна программы мы, используя функционал прописанный в классе Script, выполняем в этой функции все необходимые действия для сбора email адресов через Human Emulator. При этом после каждой фразы мы перезапускаем Human Emulator для очистки памяти и затем снова запускаем для следующей фразы, пока не выполним сбор для всего списка фраз. Данный функционал подготовлен для работы во многотопточном режиме. Для этого, на наш взгляд, нужно будет просто разбивать сбор и запускать каждую фразу в своём окне.
Но для стабильности работы ограничится 5-тью потоками. На момент написания программы XHE.dll не была адаптирована к запуску во многотопочном режиме, но уже сейчас такая возможность в C# Human Emulator API уже добавлена.
Из наших наблюдений можем отметить тот факт, что при использовании C# Human Emulator API все действия в Human Emulator выполняются намного быстрее,
чем при работе аналогичных функций в PHP.
Скачать исходники программы для VS 2015