Curl — PHP парсер. Как парсить фото с сайта в оригинальном размере


Содержание

Парсинг от А до Я

Блог о программировании парсеров и web-автоматизации

Поиск по блогу

вторник, 22 сентября 2009 г.

Примеры применения CURL. Парсинг ключевых слов (буржунет)

Приведу пример парсинга на php . С предыдущими темами пост будет связан способом получения содержимого страницы, то бишь получать ее будем с использованием библиотеки CURL.

Сначала о том, что парсить. А будем парсить ключевики. Но не с гугля, нет. Поищем в интернете какой-нибудь сторонний сервис. Первое, что я нашла, это http://freekeywords.wordtracker.com/. Изучаем страницу. На ней форма. Заполняем, отправляем.

Экспериментируем с adult-фильтром.

Данные передаются GET-запросом, то есть вообще никаких премудростей — просто используем функцию получения контента из предыдущего поста, а потом регуляркой добываем нужные нам данные. Шаблон GET-запроса получаем, введя данные непосредственно в форму на сайте, установив нужное нам значение adult-фильтра и нажав на кнопку. У меня получился следующий шаблон (значение фильтра — по умолчанию):

(Вместо $keyword будем подставлять ключевик.)

Следует обратить внимание, что если в анализируемом нами ключевике несколько слов, разделенных пробелом, то пробел заменяется на «+».

Вот такой у нас получится скрипт (в результате все 100 ключевиков я просто выведу на экран, но можно их записать в файл и т.д.):

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

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

Зачем нам нужны эти ключевики? Применение можно найти. Об одном из способов применения расскажу в ближайшем посте.

Если вам понравилась статья, проголосуйте, пожалуйста, за нее на Sloger.net

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

cURL для начинающих. Пишем парсер

Статья написана очень давно — 29.01.2010

Начинающий программист зачастую пугается многих страшных слов, когда ему советуют для определённой задачи использовать что-либо. В этой статье я хочу развеять страх перед таким словом, как cURL

Итак, что же такое cURL? Вообще, cURL — это консольная программа, которая предназначена для передачи файлов по различным протоколам. Само название cURL — это сокращение от «client urls». В PHP же cURL — это подключаемый модуль. Раскомментируйте строчу extension=php_curl.dll в файле php.ini, перезагрузите сервер и модуль подключен! (Имеется ввиду локальный сервер под Виндовс, типа денвера, а на большинстве хостингов этот модуль установлен и включён)

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

Просто? Ещё бы. А сейчас с помощью курла мы сейчас напишем небольшой парсер сайтов. Этот парсер сможет зайти на любой сайт по протоколу http, найти все ссылки на определённый тип документов и скачать эти документы к себе. Итак, приступим. В этой задаче, так же будем использовать такую технологию, как аякс (это только для красоты)

И обработчик (файл parser.php):

Также, приведу некоторые параметры — опции курла. Применяются они, как вы могли увидеть выше, таким образом: curl_setopt(идентификатор, опция, параметр);

Опция Описание Пример
CURLOPT_UPLOAD Указываем, что мы хотим выгрузить файл на сервер. Поставтье в ненулевое значение //указываем дескриптор открытого на чтение файла, которого собираемся передать curl_setopt($ch, CURLOPT_INFILE, $fp); //указываем размер отправляемого файла curl_setopt($ch, CURLOPT_INFILESIZE, $filesize); //указываем, что файл передается методом PUT curl_setopt($ch, CURLOPT_PUT, true); //указываем, что будет производиться закачка на удаленный сервер curl_setopt($ch, CURLOPT_UPLOAD, true);
CURLOPT_INFILE Указываем дескриптор выгружаемого файла
CURLOPT_INFILESIZE Указываем размер выгружаемого файла
CURLOPT_PUT Указываем, что будем передавать методом put. Поставьте в ненулевое значение
CURLOPT_POST Указываем, что хотим отправить POST-запрос. Обычно, для стандартной формы укажите application/x-www-form-urlencoded curl_setopt($ch, CURLOPT_POST, ‘application/x-www-form-urlencoded’);
curl_setopt($ch, CURLOPT_POSTFIELDS, ‘search=text&param1=value2’);
CURLOPT_POSTFIELDS Указываем строку, содержащую данные для передачи через POST
CURLOPT_TIMEOUT Указываем время (в секундах), по проишествии которого соединение будет оборвано
CURLOPT_RESUME_FROM Указываем смещение в байтах, с которого нужно начинать приём файла
CURLOPT_URL Указываем URL старницы (если не сделали это в функции curl_init();) $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘http://example.com’);
CURLOPT_REFERER Указываем заголовок referer (откуда перешли) curl_setopt($ch, CURLOPT_REFERER, ‘http://google.com’);
CURLOPT_USERAGENT Указываем заголовок UserAgent (пользовательский браузер, грубо говоря) curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.17) Gecko/2009122116 Firefox/3.0.17’)
CURLOPT_COOKIE Указываем заголовок COOKIE
CURLOPT_PROXY Указываем прокси для соединения с Интернетом (если Вы используете Интернет через прокси) curl_setopt($ch, CURLOPT_PROXY, ‘username:password@192.168.0.3:3128’)

Это далеко не все опции курла, только небольшая, но наиболее востребованная их часть. Более полный список ищите в мануалах.

Примечание. Будьте внимательы! На шаред-хостинге Вам, вероятно, откажут в выполении скрипта более 30 секунд, а если ваш скрипт повесит весь сервер, то Вас могут отключить! Прочтите правила

Заключение. Вот мы и написали небольшой, но тем не менее работющий парсер сайтов. По-хорошему, его можно неплохо оптимизировать, сделать более универсальным, да чего там — можно применить к нему ООП. Но цель данной статьи была — объяснить работу cURLа на примере. Надеюсь, я этой цели достиг. Удачи в освоении!

Hello-site.ru

Парсинг страниц сайтов(html-контента) на php.

Заметка посвящается парсингу, в частности парсинг сайтов, парсинг страниц, парсинг в веб-среде, парсинг html-контента сайта.

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

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

Давайте попробуем спарсить нужную информацию в html, попробуем достать все ссылки с нескольких страниц нашего сайта.

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

Хочу показать 2 основных способа получения контента со страницы сайта:

В первую очередь приготовим массив с нужными адресами страниц:

1 вариант — php функция file_get_contents. Функция возвращает html-строку, которую мы будем парсить на ссылки:

2 вариант — CURL. Библиотека, которая поддерживается php и имеет большой набор настроек, от POST-запросов до работы с FTP. Рассмотрим стандартный вызов библиотеки curl, который отдаст нам контент сайта:

Теперь в нашей строке $out находится контент всех трех страниц. Итак, переходим непосредственно к парсингу нашей строки.

Опять же хочу показать 3 варианта решения нашей задачи: «нативный» способ на php, с помощью встроенной библиотеки DOMDocument и библиотеки SimpleHTMLDOM.

1. php функция explode. Функция находит искомый символ или часть строки и делит целую строку на элементы массива.

Повторюсь, нам необходимо получить значения всех атрибутов href у тегов a, для этого будем делить общую строку на некоторые части\отрезки:

Если распечатать наш массив, будет примерно следующее:

2. встроенная библиотека DOMDocument. Работаем с классом примерно следующим образом:

Результат такого кода ровно такой же, что и с помощью функции explode.

3. библиотека SimpleHTMLDOM. Ее необходимо подключать из файла. Работа примерно схожа с DOMDocument. Работаем с классом:

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

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

HackWare.ru

Этичный хакинг и тестирование на проникновение, информационная безопасность

Парсинг сайтов: азы, продвинутые техники, сложные случаи

Что такое парсинг

Парсинг (parsing) – это буквально с английского «разбор», «анализ». Под парсингом обычно имеют ввиду нахождение, вычленение определённой информации.

Парсинг сайтов может использоваться при создании сервиса, а также при тестировании на проникновение. Для пентестера веб-сайтов, навык парсинга сайтов является базовыми, т.е. аудитор безопасности (хакер) должен это уметь.

Умение правильно выделить информацию зависит от мастерства владения регулярными выражениями и командой grep (очень рекомендую это освоить – потрясающее испытание для мозга!). В этой же статье будут рассмотрены проблемные моменты получения данных, поскольку все сайты разные и вас могут ждать необычные ситуации, которые при первом взгляде могут поставить в тупик.

В качестве примера парсинга сайтов, вот одна единственная команда, которая получает заголовки последних десяти статей, опубликованных на HackWare.ru:

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

Особенности парсинга веб-сайтов

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

В этом разделе основной упор сделан на парсинг из командной строки Linux, поскольку это самая обычная (и привычная) среда работы для тестера на проникновение веб-приложений. Будут показаны примеры использования разных инструментов, доступных из консоли Linux. Тем не менее, описанные здесь приёмы можно использовать в других операционных системах (например, cURL доступна и в Windows), а также в качестве библиотеки для использования в разных языках программирования.

Подразумевается, что вы понимаете принципы работы командной строки Linux. Если это не так, то рекомендуется ознакомиться с циклом:

Получение содержимого сайта в командной строке

Самым простым способом получения содержимого веб-страницы, а точнее говоря, её HTML кода, является команда вида:

В качестве ХОСТа может быть адрес сайта (URL) или IP. На самом деле, curl поддерживает много разных протоколов – но здесь мы говорим именно о сайтах.

Хорошей практикой является заключать URL (ссылки на сайты и на страницы) в одинарные или двойные кавычки, поскольку эти адреса могут содержать специальные символы, имеющие особое значение для Bash. К таким символам относятся амперсант (&), решётка (#) и другие.

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

  • HTMLCode – имя переменной (обратите внимание, что при присвоении (даже повторном) имя переменной пишется без знака доллара ($), а при использовании переменной, знак доллара всегда пишется.
  • =»$(КОМАНДА)» – конструкция выполнения КОМАНДЫ без вывода результата в консоль; результат выполнения команды присваивается переменной. Обратите внимание, что ни до, ни после знака равно (=) нет пробелов – это важно, иначе возникнет ошибка.

Также полученное содержимое веб-страницы зачастую передаётся по трубе для обработке в других командах:


Реальные примеры даны чуть ниже.

Отключение статистики при использовании cURL

Когда вы будете передавать полученное содержимое по трубе (|), то вы увидите, что команда curl показывает статистику о скорости, времени, количестве переданных данных:

Чтобы отключить вывод статистики, используйте опцию -s, например:

Автоматически следовать редиректам с cURL

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

Например, если я попытаюсь открыть сайт следующим образом (обратите внимание на HTTP вместо HTTPS):

Чтобы curl переходила по перенаправлением используется опция -L:

Подмена User Agent при использовании cURL

Удалённый сервер видит, какая программа пытается к нему подключиться: это веб-браузер, или поисковый робот, или кто-то ещё. По умолчанию cURL передаёт в качестве User-Agent что-то вроде «curl/7.58.0». Т.е. сервер видит, что подключается не веб-браузер, а консольная утилита.

Некоторые веб-сайты не хотят ничего показывать консольным утилитам, например, если при обычном запросе вида:

Вам не показывается содержимое веб-сайта (может выподиться сообщение о запрете доступа или о плохом боте), но при открытии в браузере вы можете видеть страницу, то используя опцию -A мы можем указать любой пользовательский агент, например:

Получение в cURL страниц со сжатием

Иногда при использовании cURL появляется предупреждение:

Его можно увидеть, например при попытке получить страницу с kali.org,

Суть сообщения в том, что команда curl выведет бинарные данные, которые могут навести бардак в терминале. Нам предлагают использовать опцию «—output —» (обратите внимание на дефис после слова output – он означает стандартный вывод, т.е. показ бинарных данных в терминале), либо сохранить вывод в файл следующим образом: «—output «.

Причина в том, что веб-страница передаётся с использованием компрессии (сжатия), чтобы увидеть данные достаточно использовать опцию —compressed:

Цукерберг рекомендует:  Totem — поможет определить разницу между объектами

В результате будет выведен обычный HTML код запрашиваемой страницы.

Неправильная кодировка при использовании cURL

В настоящее время на большинстве сайтов используется кодировка UTF-8, с которой cURL прекрасно работает.

Но, например, при открытии некоторых сайтов:

Вместо кириллицы мы увидим крякозяблы:

Кодировку можно преобразовать «на лету» с помощью команды iconv. Но нужно знать, какая кодировка используется на сайте. Для этого обычно достаточно заглянуть в исходный код веб-страницы и найти там строку, содержащую слово charset, например:

Эта строка означает, что используется кодировка windows-1251.

Для преобразования из кодировки windows-1251 в кодировку UTF-8 с помощью iconv команда выглядит так:

Совместим её с командой curl:

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

Изменение реферера с cURL

Реферер (Referrer URL) – это информация о странице, с которой пользователь пришёл на данную страницу, т.е. это та страница, на которой имеется ссылка, по которой кликнул пользователь, чтобы попасть на текущую страницу. Иногда веб-сайты не показывают информацию, если пользователь не содержит в качестве реферера правильную информацию (либо показывают различную информацию, в зависимости от типа реферера (поисковая система, другая страница этого же сайта, другой сайт)). Вы можете манипулировать значением реферера используя опцию -e. После которой в кавычках укажите желаемое значение. Реальный пример будет чуть ниже.

Вход на страницу с базовой аутентификацией при помощи cURL

Иногда веб-сайты требуют имя пользователя и пароль для просмотра их содержимого. С помощью опции -u вы можете передать эти учётные данные из cURL на веб-сервер как показано ниже.

По умолчанию curl использует базовую аутентификацию. Мы можем задать иные методы аутентификации используя —ntlm | —digest.

cURL и аутентификация в веб-формах (передача данных методом GET и POST)

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

Использование curl для получения страницы после HTTP аутентификации очень сильно различается в зависимости от конкретного сайта и его движка. Обычно, схема действий следующая:

1) С помощью Burp Suite или Wireshark узнать, как именно происходит передача данных. Необходимо знать: адрес страницы, на которую происходит передача данных, метод передачи (GET или POST), передаваемая строка.

2) Когда информация собрана, то curl запускается дважды – в первый раз для аутентификации и получения кукиз, второй раз – с использованием полученных кукиз происходит обращение к странице, на которой содержаться нужные сведения.

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

Для сохранения кукиз используется опция —cookie-jar, после которой нужно указать имя файла. Для передачи данных методом POST используется опция —data. Пример (пароль заменён на неверный):

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

Эта схема может не работать в некоторых случаях, поскольку веб-приложение может требовать указание кукиз при использовании первой команды (встречалось такое поведение на некоторых роутерах), также может понадобиться указать верного реферера, либо другие данные, чтобы аутентификация прошла успешно.

Извлечение информации из заголовков при использовании cURL

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

Заголовки – это некоторая техническая информация, которой обмениваются клиент (веб-браузер или программа curl) с веб-приложением (веб-сервером). Обычно нам не видна эта информация, она включает в себя такие данные как кукиз, перенаправления (редиректы), данные о User Agent, кодировка, наличие сжатия, информация о рукопожатии при использовании HTTPS, версия HTTP и т.д.

В моей практике есть реальный пример необходимости парсить заголовки. Есть программа Acrylic Wi-Fi Home, её особенностью является то, что на сайте нигде нет информации о текущей версии программы. Но номер версии содержится в скачиваемом файле, который имеет имя вида Acrylic_WiFi_Home_v3.3.6569.32648-Setup.exe. При этом имя файла также отсутствует в исходном HTML коде, поскольку при нажатии на кнопку «Скачать» идёт автоматический редирект на сторонний сайт. При подготовке парсера для softocracy, я столкнулся с ситуацией, что мне необходимо получить имя файла, причём желательно не скачивая его.

В этой команде имеются уже знакомые нам опции -s (подавление вывода) и -A (для указания своего пользовательского агента).

Новой опцией является -I, которая означает показывать только заголовки. Т.е. не будет показываться HTML код, поскольку он нам не нужен.

На этом скриншоте видно, в какой именно момент отправляется информация о новой ссылке для перехода:

Аналоогичный пример для хорошо известной в определённых кругах программы Maltego (когда-то на сайте отсутствовала информация о версии и пришлось писать парсер заголовков):

Обратите внимание, что в этой команде не использовалась опция -I, поскольку она вызывает ошибку:

Суть ошибки в том, что можно выбрать только один метод запроса HTTP, а используются сразу два: POST и HEAD.

Кстати, опция -d (её псевдоним упоминался выше (—data), когда мы говорили про HTML аутентификацию через формы на веб-сайтах), передаёт данные методом POST, т.е. будто бы нажали на кнопку «Отправить» на веб-странице.

В последней команде используется новая для нас опция -v, которая увеличивает вербальность, т.е. количество показываемой информации. Но особенностью опции -v является то, что она дополнительные сведения (заголовки и прочее) выводит не в стандартный вывод (stdout), а в стандартный вывод ошибок (stderr). Хотя в консоли всё это выглядит одинаково, но команда grep перестаёт анализировать заголовки (как это происходит в случае с -I, которая выводит заголовки в стандартный вывод). В этом можно убедиться используя предыдущую команду без 2>&1:

Строка с Location никогда не будет найдена, хотя на экране она явно присутствует.

Конструкция 2>&1 перенаправляет стандартный вывод ошибок в стандартный вывод, в результате внешне ничего не меняется, но теперь grep может обрабатывать эти строки.

Более сложная команда для предыдущего обработчика форм (попробуйте в ней разобраться самостоятельно):

Парсинг сайта, на котором текст создаётся с помощью JavaScript

Если контент веб-страницы формируется методами JavaScript, то можно найти необходимый файл с кодом JavaScript и парсить его. Но иногда код слишком сложный или даже обфусцированный. В этом случае поможет PhantomJS.

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

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

К примеру, мне нужно распарсить страницу https://support.microsoft.com/en-us/help/12387/windows-10-update-history и взять с неё номер версии последней официальной сборки Windows. Для этого я создаю файл lovems.js следующего содержания:

Для его запуска использую PhantomJS:

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

Чтобы отфильтровать нужные мне сведения о последней сборке:

Будет выведено что-то вроде 15063.877.

Смотрите также пример использования PhantomJS когда нужно отправлять POST запрос перед получением страницы: «Как с помощью PhantomJS отправить POST запрос».

Парсинг в командной строке RSS, XML, JSON и других сложных форматов

RSS, XML, JSON и т.п. – это текстовые файлы, в которых данные структурированы определённым образом. Для разбора этих файлов можно, конечно, использовать средства Bash, но можно сильно упростить себе задачу, если задействовать PHP.

В PHP есть ряд готовых классов (функций), которые могут упростить задачу. Например SimpleXML для обработки RSS, XML. JSON для JavaScript Object Notation.

Если в системе установлен PHP, то необязательно использовать веб-сервер, чтобы запустить PHP скрипт. Это можно сделать прямо из командной строки. Например, имеется задача из файла по адресу https://hackware.ru/?feed=rss2 извлечь имена всех статей. Для этого создадим файл parseXML.php со следующим содержимым:


Запустить файл можно так:

В данном примере для получения файла с веб-сервера используется команда curl -s https://hackware.ru/?feed=rss2, полученный текстовый файл (строка) передаётся в качестве аргумента PHP скрипту, который обрабатывает эти данные.

Кстати, cURL можно было бы использовать прямо из PHP скрипта. Поэтому можно парсить в PHP не прибегая к услугам Bash. В качестве примера, создайте файл parseXML2.php со следующем содержимым:

И запустите его следующим образом из командной строки:

Этот же самый файл parseXML2.php можно поместить в директорию веб-сервера и открыть в браузере.

Заключение

Здесь рассмотрены ситуации, с которыми вы можете столкнуться при парсинге веб-сайтов. Изученный материал поможет лучше понимать, что происходит в тот момент, когда вы подключаетесь к веб-сайту. Поскольку пентестер часто использует не веб-браузеры для работы с веб-сайтами: различные сканеры и инструменты, то знание о реферерах, User Agent, кукиз, заголовках, кодировках, аутентификации поможет быстрее разобраться с проблемой, если она возникнет.

Для часто встречающихся задач (сбор email адресов, ссылок) уже существует достаточно много инструментов – и часто можно взять готовое решение, а не изобретать велосипед. Но с помощью curl и других утилит командной строки вы сможете максимально гибко настроить получение данных с любого сайта.

Универсальный и очень простой PHP парсер

С помощью данного скрипта можно спарсить любую информацию с сайта, будь то погода, курсы валют или цена товара.

Наша функция Parse имеет 3 параметра. Первый параметр p1 – строка, в которой будет происходить поиск нужной информации. Параметр p2 – означает первый уникальный элемент для начала поиска. Параметр p3 – означает второй элемент для конца поиска.

Встроенная PHP функция file_get_contents( ) – считывает содержимое всей веб страницы.

Тема: Как парсить подгружаемый контент при помощи curl?

Опции темы
Отображение
  • Линейный вид
  • Комбинированный вид
  • Древовидный вид

Как парсить подгружаемый контент при помощи curl?

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

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

Эм, ну, как вариант посмотреть профайлинг сетевых запросов в браузере и парсить не страницу, а именно адрес, по которому js-скрипт достает контент.

Так нужно делать в любом случае, так как КУРл потянет только контент страницы, а все аяксы генеряться при помощи клиентских скриптов.

например(кэп снова с нами!) так: взять с задержкой чтобы успел подгрузиться контент.

curl не обладает такими возможностями, т.к. требуется интерпретатор javascript. selenium в помощь. либо портируйте v8 на php, либо как Вам уже подсказали(ИМХО, геморойный путь, а если там не просто данные а динамическая разметка — на php потом ее строить будете? ). CURL поддерживает лишь стек http и прочих протоколов, но сам информацию как браузер не обрабатывает. Короче просто спрашивает сервер и получает ответ. Вам поможет знание С или java и умение применять различные готовые решения(тот же Chromium адаптировать и использовать вместо curl для построения разметки с учетом ajax)

Последний раз редактировалось Arks; 26.07.2012 в 22:43 .

Парсинг и обработка веб-страницы на PHP: выбираем лучшую библиотеку

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

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

Регулярные выражения

Даже не смотря на то, что «регулярки» — это первое, что приходит на ум, использовать их для настоящих проектов не стоит.

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

Вместо «допиливания» своего регулярного выражения при каждом малейшем изменении кода рекомендуем использовать инструменты ниже — это и проще, и удобнее, и надежнее.

XPath и DOM

DOM и XPath не являются библиотеками в привычном смысле этого слова, это стандартные модули, которые встроены в PHP начиная с пятой версии. Именно отсутствие необходимости использовать сторонние решения делает их одними из лучших инструментов для парсинга HTML страниц.

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

Вот, например, код с использованием DOM и XPath, который ищет в разметке все теги и модифицирует их атрибуты src :

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

Simple HTML DOM

Simple HTML DOM — PHP-библиотека, позволяющая парсить HTML-код с помощью удобных jQuery-подобных селекторов.

Она лишена главного недостатка XPath — библиотека умеет работать даже с невалидным HTML-кодом, что значительно упрощает работу. Вы также забудете о проблемах с кодировкой: все преобразования выполняются автоматически.

Как и JQuery, Simple HTML DOM умеет искать и фильтровать вложенные элементы, обращаться к их атрибутам и даже выбирать отдельные логические элементы кода, например, комментарии.

В этом примере сначала подгружается, а потом модифицируется заранее заготовленный HTML-код: во второй строке происходит добавление атрибута class со значением bar первом попавшемуся элементу div , а в следующей строке мы заменяем текст элемента с > на foo .

Несмотря на не самую высокую производительность, по сравнению с другими вариантами, Simple HTML DOM имеет самое большое русскоязычное комьюнити и наибольшую распространенность в рунете — для новичков это делает написание кода с её использованием значительно проще.

phpQuery

Как и Simple HTML DOM, phpQuery является PHP вариантом JQuery, но на этот раз более похожим на своего «старшего javascript-брата».

Портировано почти всё, что есть в JS-фреймворке: поддержка селекторов, атрибутов, манипуляций, обхода, плагинов, событий (в том числе имитации кликов и т.д.) и даже AJAX. Использовать можно как через PHP, так и через командную строку в виде отдельного приложения.

Цукерберг рекомендует:  Php - удаление нескольких записей через checkbox

Более того, согласно нашим бенчмаркам, phpQuery оказался в 8 (!) раз быстрее Simple HTML DOM.

Вот небольшой пример на phpQuery, в котором происходит обработка заранее выбранных элементов списка ( li ):

Подробную документацию и больше примеров найдете на официальной странице в Google Code.

htmlSQL

htmlSQL — экспериментальная PHP библиотека, позволяющая манипулировать HTML-разметкой посредством SQL-подобных запросов.

Простейший пример, извлекающий атрибуты href и title всех ссылок (элементы a ) с классом list :

Как и с обычными mysql_ функциями, воспользовавшись методами fetch_array() или fetch_objects(), мы можем получить результат выполнения данного запроса в виде привычного ассоциативного массива или объекта.

Стоит также упомянуть о высоком быстродействии htmlSQL: часто она справляется в несколько раз быстрее phpQuery или того же Simple HTML DOM.

Тем не менее, для сложных задач вам может не хватить функциональности, а разработка библиотеки давно прекращена. Но даже несмотря на это, она всё ещё представляет интерес для веб-разработчиков: в ряде случаев значительно удобнее использовать язык SQL вместо CSS-селекторов. Особенно когда вы не знаете, что такое CSS-селекторы ��

Вывод

В своем мини-исследовании мы пришли к выводу, что в большинстве случаев для парсинга лучше использовать библиотеку phpQuery: она быстрая, функциональная и современная.

С другой стороны, для совсем простых задач логично было бы использовать стандартные модули PHP, такие как XPath, DOM или, на крайний случай, регулярные выражения.

Что-то ещё?

Для PHP существуют ещё десятки разнообразных библиотек и инструментов для парсинга, но в этой статье мы рассмотрели только самые интересные, функциональные и производительные.

Подробнее о других способах парсинга средствами PHP можно прочитать в соответствующей теме на StackOverflow.

Если вы не используете PHP, то можете ознакомится с кратким списком похожих инструментов для других языков программирования:

HackWare.ru

Этичный хакинг и тестирование на проникновение, информационная безопасность

Парсинг сайтов: азы, продвинутые техники, сложные случаи


Что такое парсинг

Парсинг (parsing) – это буквально с английского «разбор», «анализ». Под парсингом обычно имеют ввиду нахождение, вычленение определённой информации.

Парсинг сайтов может использоваться при создании сервиса, а также при тестировании на проникновение. Для пентестера веб-сайтов, навык парсинга сайтов является базовыми, т.е. аудитор безопасности (хакер) должен это уметь.

Умение правильно выделить информацию зависит от мастерства владения регулярными выражениями и командой grep (очень рекомендую это освоить – потрясающее испытание для мозга!). В этой же статье будут рассмотрены проблемные моменты получения данных, поскольку все сайты разные и вас могут ждать необычные ситуации, которые при первом взгляде могут поставить в тупик.

В качестве примера парсинга сайтов, вот одна единственная команда, которая получает заголовки последних десяти статей, опубликованных на HackWare.ru:

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

Особенности парсинга веб-сайтов

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

В этом разделе основной упор сделан на парсинг из командной строки Linux, поскольку это самая обычная (и привычная) среда работы для тестера на проникновение веб-приложений. Будут показаны примеры использования разных инструментов, доступных из консоли Linux. Тем не менее, описанные здесь приёмы можно использовать в других операционных системах (например, cURL доступна и в Windows), а также в качестве библиотеки для использования в разных языках программирования.

Подразумевается, что вы понимаете принципы работы командной строки Linux. Если это не так, то рекомендуется ознакомиться с циклом:

Получение содержимого сайта в командной строке

Самым простым способом получения содержимого веб-страницы, а точнее говоря, её HTML кода, является команда вида:

В качестве ХОСТа может быть адрес сайта (URL) или IP. На самом деле, curl поддерживает много разных протоколов – но здесь мы говорим именно о сайтах.

Хорошей практикой является заключать URL (ссылки на сайты и на страницы) в одинарные или двойные кавычки, поскольку эти адреса могут содержать специальные символы, имеющие особое значение для Bash. К таким символам относятся амперсант (&), решётка (#) и другие.

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

  • HTMLCode – имя переменной (обратите внимание, что при присвоении (даже повторном) имя переменной пишется без знака доллара ($), а при использовании переменной, знак доллара всегда пишется.
  • =»$(КОМАНДА)» – конструкция выполнения КОМАНДЫ без вывода результата в консоль; результат выполнения команды присваивается переменной. Обратите внимание, что ни до, ни после знака равно (=) нет пробелов – это важно, иначе возникнет ошибка.

Также полученное содержимое веб-страницы зачастую передаётся по трубе для обработке в других командах:

Реальные примеры даны чуть ниже.

Отключение статистики при использовании cURL

Когда вы будете передавать полученное содержимое по трубе (|), то вы увидите, что команда curl показывает статистику о скорости, времени, количестве переданных данных:

Чтобы отключить вывод статистики, используйте опцию -s, например:

Автоматически следовать редиректам с cURL

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

Например, если я попытаюсь открыть сайт следующим образом (обратите внимание на HTTP вместо HTTPS):

Чтобы curl переходила по перенаправлением используется опция -L:

Подмена User Agent при использовании cURL

Удалённый сервер видит, какая программа пытается к нему подключиться: это веб-браузер, или поисковый робот, или кто-то ещё. По умолчанию cURL передаёт в качестве User-Agent что-то вроде «curl/7.58.0». Т.е. сервер видит, что подключается не веб-браузер, а консольная утилита.

Некоторые веб-сайты не хотят ничего показывать консольным утилитам, например, если при обычном запросе вида:

Вам не показывается содержимое веб-сайта (может выподиться сообщение о запрете доступа или о плохом боте), но при открытии в браузере вы можете видеть страницу, то используя опцию -A мы можем указать любой пользовательский агент, например:

Получение в cURL страниц со сжатием

Иногда при использовании cURL появляется предупреждение:

Его можно увидеть, например при попытке получить страницу с kali.org,

Суть сообщения в том, что команда curl выведет бинарные данные, которые могут навести бардак в терминале. Нам предлагают использовать опцию «—output —» (обратите внимание на дефис после слова output – он означает стандартный вывод, т.е. показ бинарных данных в терминале), либо сохранить вывод в файл следующим образом: «—output «.

Причина в том, что веб-страница передаётся с использованием компрессии (сжатия), чтобы увидеть данные достаточно использовать опцию —compressed:

В результате будет выведен обычный HTML код запрашиваемой страницы.

Неправильная кодировка при использовании cURL

В настоящее время на большинстве сайтов используется кодировка UTF-8, с которой cURL прекрасно работает.

Но, например, при открытии некоторых сайтов:

Вместо кириллицы мы увидим крякозяблы:

Кодировку можно преобразовать «на лету» с помощью команды iconv. Но нужно знать, какая кодировка используется на сайте. Для этого обычно достаточно заглянуть в исходный код веб-страницы и найти там строку, содержащую слово charset, например:

Эта строка означает, что используется кодировка windows-1251.

Для преобразования из кодировки windows-1251 в кодировку UTF-8 с помощью iconv команда выглядит так:

Совместим её с командой curl:

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

Изменение реферера с cURL

Реферер (Referrer URL) – это информация о странице, с которой пользователь пришёл на данную страницу, т.е. это та страница, на которой имеется ссылка, по которой кликнул пользователь, чтобы попасть на текущую страницу. Иногда веб-сайты не показывают информацию, если пользователь не содержит в качестве реферера правильную информацию (либо показывают различную информацию, в зависимости от типа реферера (поисковая система, другая страница этого же сайта, другой сайт)). Вы можете манипулировать значением реферера используя опцию -e. После которой в кавычках укажите желаемое значение. Реальный пример будет чуть ниже.

Вход на страницу с базовой аутентификацией при помощи cURL

Иногда веб-сайты требуют имя пользователя и пароль для просмотра их содержимого. С помощью опции -u вы можете передать эти учётные данные из cURL на веб-сервер как показано ниже.

По умолчанию curl использует базовую аутентификацию. Мы можем задать иные методы аутентификации используя —ntlm | —digest.

cURL и аутентификация в веб-формах (передача данных методом GET и POST)

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

Использование curl для получения страницы после HTTP аутентификации очень сильно различается в зависимости от конкретного сайта и его движка. Обычно, схема действий следующая:

1) С помощью Burp Suite или Wireshark узнать, как именно происходит передача данных. Необходимо знать: адрес страницы, на которую происходит передача данных, метод передачи (GET или POST), передаваемая строка.

2) Когда информация собрана, то curl запускается дважды – в первый раз для аутентификации и получения кукиз, второй раз – с использованием полученных кукиз происходит обращение к странице, на которой содержаться нужные сведения.

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

Для сохранения кукиз используется опция —cookie-jar, после которой нужно указать имя файла. Для передачи данных методом POST используется опция —data. Пример (пароль заменён на неверный):

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

Эта схема может не работать в некоторых случаях, поскольку веб-приложение может требовать указание кукиз при использовании первой команды (встречалось такое поведение на некоторых роутерах), также может понадобиться указать верного реферера, либо другие данные, чтобы аутентификация прошла успешно.

Извлечение информации из заголовков при использовании cURL

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

Заголовки – это некоторая техническая информация, которой обмениваются клиент (веб-браузер или программа curl) с веб-приложением (веб-сервером). Обычно нам не видна эта информация, она включает в себя такие данные как кукиз, перенаправления (редиректы), данные о User Agent, кодировка, наличие сжатия, информация о рукопожатии при использовании HTTPS, версия HTTP и т.д.

В моей практике есть реальный пример необходимости парсить заголовки. Есть программа Acrylic Wi-Fi Home, её особенностью является то, что на сайте нигде нет информации о текущей версии программы. Но номер версии содержится в скачиваемом файле, который имеет имя вида Acrylic_WiFi_Home_v3.3.6569.32648-Setup.exe. При этом имя файла также отсутствует в исходном HTML коде, поскольку при нажатии на кнопку «Скачать» идёт автоматический редирект на сторонний сайт. При подготовке парсера для softocracy, я столкнулся с ситуацией, что мне необходимо получить имя файла, причём желательно не скачивая его.

В этой команде имеются уже знакомые нам опции -s (подавление вывода) и -A (для указания своего пользовательского агента).

Новой опцией является -I, которая означает показывать только заголовки. Т.е. не будет показываться HTML код, поскольку он нам не нужен.

На этом скриншоте видно, в какой именно момент отправляется информация о новой ссылке для перехода:

Аналоогичный пример для хорошо известной в определённых кругах программы Maltego (когда-то на сайте отсутствовала информация о версии и пришлось писать парсер заголовков):

Обратите внимание, что в этой команде не использовалась опция -I, поскольку она вызывает ошибку:

Суть ошибки в том, что можно выбрать только один метод запроса HTTP, а используются сразу два: POST и HEAD.

Кстати, опция -d (её псевдоним упоминался выше (—data), когда мы говорили про HTML аутентификацию через формы на веб-сайтах), передаёт данные методом POST, т.е. будто бы нажали на кнопку «Отправить» на веб-странице.


В последней команде используется новая для нас опция -v, которая увеличивает вербальность, т.е. количество показываемой информации. Но особенностью опции -v является то, что она дополнительные сведения (заголовки и прочее) выводит не в стандартный вывод (stdout), а в стандартный вывод ошибок (stderr). Хотя в консоли всё это выглядит одинаково, но команда grep перестаёт анализировать заголовки (как это происходит в случае с -I, которая выводит заголовки в стандартный вывод). В этом можно убедиться используя предыдущую команду без 2>&1:

Строка с Location никогда не будет найдена, хотя на экране она явно присутствует.

Конструкция 2>&1 перенаправляет стандартный вывод ошибок в стандартный вывод, в результате внешне ничего не меняется, но теперь grep может обрабатывать эти строки.

Более сложная команда для предыдущего обработчика форм (попробуйте в ней разобраться самостоятельно):

Парсинг сайта, на котором текст создаётся с помощью JavaScript

Если контент веб-страницы формируется методами JavaScript, то можно найти необходимый файл с кодом JavaScript и парсить его. Но иногда код слишком сложный или даже обфусцированный. В этом случае поможет PhantomJS.

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

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

К примеру, мне нужно распарсить страницу https://support.microsoft.com/en-us/help/12387/windows-10-update-history и взять с неё номер версии последней официальной сборки Windows. Для этого я создаю файл lovems.js следующего содержания:

Для его запуска использую PhantomJS:

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

Чтобы отфильтровать нужные мне сведения о последней сборке:

Будет выведено что-то вроде 15063.877.

Смотрите также пример использования PhantomJS когда нужно отправлять POST запрос перед получением страницы: «Как с помощью PhantomJS отправить POST запрос».

Парсинг в командной строке RSS, XML, JSON и других сложных форматов

RSS, XML, JSON и т.п. – это текстовые файлы, в которых данные структурированы определённым образом. Для разбора этих файлов можно, конечно, использовать средства Bash, но можно сильно упростить себе задачу, если задействовать PHP.

В PHP есть ряд готовых классов (функций), которые могут упростить задачу. Например SimpleXML для обработки RSS, XML. JSON для JavaScript Object Notation.

Цукерберг рекомендует:  Objective c - Помогите пожалуйста! Насчёт программирования на objective-c

Если в системе установлен PHP, то необязательно использовать веб-сервер, чтобы запустить PHP скрипт. Это можно сделать прямо из командной строки. Например, имеется задача из файла по адресу https://hackware.ru/?feed=rss2 извлечь имена всех статей. Для этого создадим файл parseXML.php со следующим содержимым:

Запустить файл можно так:

В данном примере для получения файла с веб-сервера используется команда curl -s https://hackware.ru/?feed=rss2, полученный текстовый файл (строка) передаётся в качестве аргумента PHP скрипту, который обрабатывает эти данные.

Кстати, cURL можно было бы использовать прямо из PHP скрипта. Поэтому можно парсить в PHP не прибегая к услугам Bash. В качестве примера, создайте файл parseXML2.php со следующем содержимым:

И запустите его следующим образом из командной строки:

Этот же самый файл parseXML2.php можно поместить в директорию веб-сервера и открыть в браузере.

Заключение

Здесь рассмотрены ситуации, с которыми вы можете столкнуться при парсинге веб-сайтов. Изученный материал поможет лучше понимать, что происходит в тот момент, когда вы подключаетесь к веб-сайту. Поскольку пентестер часто использует не веб-браузеры для работы с веб-сайтами: различные сканеры и инструменты, то знание о реферерах, User Agent, кукиз, заголовках, кодировках, аутентификации поможет быстрее разобраться с проблемой, если она возникнет.

Для часто встречающихся задач (сбор email адресов, ссылок) уже существует достаточно много инструментов – и часто можно взять готовое решение, а не изобретать велосипед. Но с помощью curl и других утилит командной строки вы сможете максимально гибко настроить получение данных с любого сайта.

Как парсить сайты

kach21

Достоин уважения

Автор: Роман Кротов
Год выхода: 2015

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

alchemyeye

Новичок

Inkognito

Новичок
Рекламное сообщение

Goreg

Новичок

GoReg — аренда реальных рабочих SIM-карт для SMS-активации! Подробнее здесь: goreg-sms.com.

Ежедневно предоставляем 1500+ SIM-карт в странах Африки, Азии, Латинской Америки, а также в Беларуси и Сербии.

thecoder

alchemyeye

Новичок

Поделюсь некоторыми знаниями и техническими деталями, сразу оговорюсь что с некоторого времени я являюсь поклонником открытого ПО и Linux, итак поехали.

Почему CURL не может спарсить многие современные сайты? — потому что он не умеет JavaScript. Сейчас много сервисов, к примеру тот же VK построены на асинхронных запросах без перегрузки странички, контент подгружается в DOM дерево (структура документа после обработки скриптами, если простыми словами) при помощи AJAX и подобных технологий.
Чтобы понять что и как — попробуйте при помощи CURL спарсить последние 200 сообщений со стены любой группы ВКонтакте. Попробуйте получить HTML исходник какого-то сайта к которому подключена защита от DDOS при помощи CloudFlare или другого сервиса, который требует включенного JavaScript.
Примеров еще можно привести много, сейчас любой парсинг без движка JS — это не парсинг.
Простой живой пример: попробуйте получить список свободных прокси без включенного JS (для FireFox можно установить дополнение NoScript) или при помощи CURL, PHP file_get_contents. вот с этой странички http://www.freeproxylists.com/anon/1463748668.html
Вы получите почти пустой HTML исходник, а теперь включите JS и. о магия. на страничке появился список сотни свободных проксей (IP — порт).

Таким образом, если на сайте контент (картинки, текст, ссылки. ) подгружаются при помощи JavaScript то простой запрос исходника HTML документа без пост-обработки при помощи JS не вернет вам нужного результата.

1) XHE — он же Xedant Human Emulator, xWeb, умеет эмулировать любые действия в браузере IE, есть многопоточность, возможность писать скрипты автоматизации на PHP (есть готовые классы с функциями под клаву, мышь, картинки, капчи, системные утилиты и т.п.).
Это по сути Windows-приложение обгортка для ослика ИЕ (Internet Explorer) с простым и функциональным API, под который написаны готовые вспомогательные PHP-скрипты-классы.
Как это работает: Приложение-обертка IE открывает на машине порт (например 7010 или другой) и принимает к нему подключения. Все что нужно для управления браузером — подключиться к порту, например телнетом и отправить ему команду в виде строки с параметрами. К примеру для клика мышкой в браузере с координатами 504,937 нужно отправить строчку «Mouse.Click?x=504&y=937»
Согласитесь, не очень удобно. Поэтому для упрощения управления разработчиками этой программы была написана целая пачка скриптов (классы), которые запускаются на локальном интерпретаторе PHP и по своей сути подключаются к порту 7010 и посылают туда команды. Таким образом для того же клика мышкой в браузере с координатами 504,937 нужно вызвать в PHP скрипте метод $mouse->click(100, 200); — так явно проще и понятнее.
Итак что мы имеем: браузер с возможностью полной автоматизации, скрипты можно писать на любом языке, подключаясь по TCP к порту 7010 и отправляя туда команды. Скрипты можно писать используя готовые классы функций и методов на PHP, полистать классы можно на humanemulator.net.
С этой программой я работал достаточно плотно и даже когда-то писал целую систему с веб-мордой на PHP+AJAX+MYSQL, регались аккаунты, почты, постились сообщения в ВК, собирались прокси, ADDURиLки. потом забросил.
Для себя выделил два основных минуса — это цена на лицензию и ее продление, а также отсутствие возможности нормального масштабирования. Программа-эмулятор работает только на Windows и для запуска на одной машине нужна одна лицензия (порядка 300$ по тому времени), более предпочтительно иметь подобный инструмент на Linux, где можно будет запускать своих роботов-трудяг на множестве VPSок, да и производительность будет получше, все таки не нужно подгружать в память разный хлам, который идет в комплекте с Windows.

2) ZennoPoster — очень мощный продукт, авторы сделали гениальный комбайн, который после небольшого обучения сможет оседлать даже домохозяйка (оседлать. но не кататься по полной). По сути это также интернет-браузер с целым комплексом надстроек для автоматизации, парсинга, постинга, ботинга, кликинга, граббинга и т.п. занятий.
Огромный плюс данного софта — то что все собрано в куче и в одном месте, это такой себе центр управления и рекрутинга для виртуальных цифровых работников в сфере интернета, которые не ленятся, не ноют, не требуют повышения зарплаты (хотя случается. апгрейд компа иногда не помешает) и делают то что им прописано (в скриптах).
Продукт хороший но избыточный если нужно сделать какое-то простое задание на автомате, к тому же своей наработкой (скриптом) вы не сможете поделиться с другими если у них нет лицензии Зенки, демо-версия очень урезана.
Для тех кто умеет программировать, скорее всего что ковыряние в интерфейсе покажется не очень приятным занятием, захочется написать простой скрипт на каком-то языке вместо часового клацанья по текстовых поляv и чекбоксам. Хотя. в Зенке предусмотрен API и можно подключить свои скрипты, написанные на удобном языке, работать по подобному принципу взаимодействия как и с XHE.
Для себя выделил такие минусы:
Первый минус — платный продукт (хотя за такие возможности отдать денежку не жалко), полностью закрытый проприетарный код (параноикам и безопасникам такое не подойдет), мало ли что хитрые разработчики могли в нем упрятать, хочется доверять но все же проверять. а проверить не получится (как вариант сидеть на шухере в команде с WireShark и TCPDump).
Второй минус — опять же привязанность к MS Windows, аренад VPS с данной ОС это не дешевое удовольствие и снова у нас будут в пустую тратиться драгоценные ресурсы системы на запуск всякого встроенного в продукт MS мусора, загрузку разных обновлений, которые для моей задачи н#х не нужны.
Здесь же мы опять столкнемся с проблемой масштабирования и гибкости, будем привязаны как лошадь к дереву в ожидании хозяина.

3) Firefox, PhantomJS и Selenium — не зря я привел эту связку как альтернативу выше приведенным проприетарным пациентам. Для использования данных инструментов и библиотек нужно иметь навыки программирования или же просто желание — остальное подтянется в процессе.
Selenium — это система для написания автоматических тестов приложений, но никто нам не мешает применить ее для автоматизации разной рутины в браузере где нужен JavaScript. К Селениуму можно привязать разные браузеры (драйверы), к примеру тот же Firefox или Хром, а можно прикрутить PhantomJS.
PhantomJS — Headless WebKit scriptable with a JavaScript API. Безглавый (не нужен графический интерфейс) движок браузера на основе WebKit с поддержкой JavaScript и со своим API. Используя данную штукенцию в связке с Selenium мы сможем написать скрипт автоматизации какой-то работы в инете, выгрузить такой скрипт на Linux VPS где есть только консоль (без графического рабочего стола) и запустить на выполнение.
На лицо экономия ресурсов, денег.
Все приведенные продукты с открытым исходным кодом и свободными лицензиями, их код можно подправить под себя, поделиться своими наработками или найденными багами с сообществом разработчиков по всему миру, к тому же знания данных технологий и навыки работы с ними могут пригодиться при устройстве на высокооплачиваемую работу.
Если хотите попробовать данные технологии то наиболее простой и дружелюбный язык вам в помощь, это — Python (Питончик). По селениуму есть неплохие статьи на Хабре, также подружитесь с StackOverflow, GitHub — там есть много примеров и решений разных задач.

Какой продукт лучше: XHE, ZennoPoster, Selenium+друзья? — пусть каждый выберет для себя из своих возможностей и перспектив, подумает хочет ли он иметь полный контроль или же пользоваться готовыми наработками за некоторую плату и привязанность. Для каждого из продуктов найдется свой поклонник и противник.

Я не являюсь большим гуру, так что за какие-то неточности или незнания в изложенных выше примерах прошу сильно не ругать, я также как и многие только учусь )
Буду рад если эта мини-статья принесет кому-то пользу, откроет новые возможности и побудит к новым идеям (хорошим и во благо).

Парсер сайта на PHP

Рассмотрим создание парсера на PHP с использованием языка запросов xPath.

Данные будут браться с одного популярного аниме-сайта (animevost.org). Нас будут интересовать следующие данные: название, год выхода, жанр, тип, количество серий, режиссер и описание. В результате использования xPath у нас отпадает необходимость в регулярных выражениях. Все это приятно отразится на скорости работы скрипта.

Листинг файла index.php.

Данный файл располагаем в корне сайта. Здесь же создаем директорию с именем data. В этот каталог будут сохраняться все данные, собранные парсером.

Для информативности я добавил замер скорости работы скрипта и его отображение по окончанию работы.

Итак, при помощи встроенной в PHP функции libxml_use_internal_errors(true) мы включаем обработку ошибок пользователем.

Для удобства работы объявлено несколько важных переменных:

  • $url — содержит ссылку для парсера, т.е. откуда начинаем собирать данные. В нашем случае — это ссылка на страницу http://animevost.org/zhanr/.
  • $refererUrl — ссылка для содержимого заголовка «Referer», который будет использован в HTTP-запросе.
  • $nPagePause — количество страниц, через которое будет сделана пауза. Имитация человека, якобы он вручную переходит по ссылкам.

Функция function curlGetContents($pageUrl, $baseUrl, $pauseTime = 4, $retry = true) читает содержимое удаленной страницы в строку. В ней нет ничего особенного. Используется встроенная функция curl_setopt(). Более детально можно прочитать здесь.

Кстати, если происходит ошибка, то предпринимается еще одна попытка получения данных с сайта. Если же все-таки не получается получить данные по определенной ссылке, то создается файл с ошибками errors.txt.

В строке $doc = new DOMDocument(); происходит инициализация экземпляра класса DOMDocument, который представляет все содержимое HTML- или XML-документа. А с помощью метода loadHTML() мы загружаем HTML из строки. Далее в строке new DOMXpath($doc) создаем экземпляр класса DOMXPath, который поддерживает язык запросов XPath 1.0. Подробнее про все методы и их особенности можно ознакомиться по ссылкам выше.

Переменная $startPage содержит номер начальной страницы, т.е. самой первой страницы на сайте. Аналогично, переменная $endPage содержит номер самой последней возможной страницы на сайте (имеется в виду номер страницы, который доступен в контексте по адресу, указанному в переменной $url).

Далее операция получения данных с сайта работает до тех пор, пока не будет достигнута последняя страница.

Внутри цикла while каждую итерацию создается новый экземпляр DOMDocument, загружается HTML из строки и создается новый экземпляр класса DOMXpath. Большинство участков кода имеют комментарии и пояснения.

Обратим внимание на функцию function parseNumberLastPage(DOMXpath $xPath) — извлекает последний номер страницы. В данном случае анализируются ссылки на странице в самом низу сайта и получаем последнюю страницу.

Также была создана функция function parseContent(DOMXpath $xPath, $query = ‘//’, $compare = », $lenCut = 0) для получения контента. Особых сложностей в ее работе нет, так что не стану описывать подробнее.

Для получения информации о режиссере пришлось создать отдельную функцию function parseGetProducer(DOMXpath $xPath). Все это связано с тем, что в некоторых записях (анонсах аниме) отсутствовал режиссер. В результате происходило смещение и информация не правильно собиралась с сайта. В ней сначала анализируется страница и собирается массив с информацией о режиссере (если режиссера нет, то заполняется пустой строкой). Затем происходит сравнение, в котором проверяется, если узел содержит автора с пустой строкой, то аналогично заполняем пустой строкой, иначе берем информацию о режиссере из другого массива.

На первый взгляд функция может показаться сложной, но на самом деле это не так. Все довольно просто. Достаточно заглянуть в ее исходный код.

Еще я написал функцию getRandomUserAgent() для получения случайного заголовка браузера, т.к. некоторые сайты не хотят отдавать свои данные, если им не передать подобный заголовок. Случайность добавлена просто для разнообразия.

Отмечу, что это лишь демонстрация возможностей работы с xPath в PHP. Я не стал заморачиваться с проверкой различных ошибок, т.к. задача была в максимально короткий срок получить необходимые данные. Вы же в свою очередь можете доработать скрипт под себя и даже сделать его еще лучше. Таким образом можно парсить практически любой сайт. Для этого достаточно ознакомиться с синтаксисом xPath.

Полезные ссылки

Парсер сайта на PHP (исходный код на GitHub)

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих