Скрипт сборщик данных 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»);.

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

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

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 таблицы и сохраним исходники в файл для дальнейшего изучения. Для этого добавим код:

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

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

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

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

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

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

Теперь закроем его и откроем опять файл rts_ru.php, в котором находится наш скрипт. Удалим оттуда всё лишнее и подключим файл function.php к нему. После всех проделанных операций наш скрипт будет выглядеть:

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

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

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

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

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

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

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

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

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

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

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

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