[Из песочницы] Простой парсинг сайтов с помощью SlimerJS
В виду отсутствия хорошего материала по парсингу с помощью скриптового браузера SlimerJS и наличия свободного времени решил написать небольшую статью.
Начало работыДля того, чтобы начать работать со SlimerJs, необходимо скачать последнюю версию скриптового браузера (я обычно качаю полную версию, в которую включен XulRunner, позволяющий запускать SlimerJS в отсутствие Firefox) для вашей ОС.Не буду описывать инсталяцию SlimerJS, так как она довольно подробно описана здесь, поэтому сразу перейдем к разбору ситуаций, которые чаще всего могут встретиться при парсинге сайта с динамическм контентом.
Использование Предположим, что контент сайта загружается аяксом после того, как уже загружена сама страница. Получить динамический контент можно несколькими способами, основной — это написать функцию, которая будет через интервал времени проверять наличие данных. Этот вариант я использовал повсеместно, но если на сайте требовалось совершить много последовательных действий, то кода становилось больше и тем сложнее было его поддерживать. В итоге я стал больше применять паузы во время выполнения, которые упростили задачу: var webpage = require ('webpage').create (); webpage .open ('http://example.com') .then (function (){ wait (3000); // пауза, длительность в милиссекундах var someContent = page.evaluate (function () { // после того как динамический контент подгружен, можно его спарсить return document.querySelector (»#aDiv»).textContent; }); });
Еще одна полезная возможность — это создание событий. Очень просто имитировать набор символов в тексовом поле, что часто требуется при авторизации или регистрации, например: var webpage = require ('webpage').create (); webpage .open ('http://example.com') .then (function (){ page.evaluate (function () { document.qetElementById (»#input»).focus (); }); page.sendEvent ('keypress', «hello World»); }); Вообще функция senEvent () очень гибкая, подробнее о ней можно прочитать здесь.Довольно часто возникает ситуация, когда при парсинге на сайте появляется каптча. В этом случаем потребуется сделать скриншот каптчи и отправить его в один из сервисов, которые предоставляют услуги по разгадке каптч.
var webpage = require ('webpage').create (); webpage .open ('http://example.com') .then (function (){ page.clipRect = { top: 14, left: 3, width: 400, height: 300 }; // для использования этой функции нам должны быть известно позиционирование каптчи var screen = page.renderBase64('png'); // обычно я кодирую изображение в base64, так его проще передать сторонему сервису var webpage2 = require ('webpage').create (); // создаем второе соединени webpage2 .open ('http://example2.com') .then (function (){ //…далее думаю уже должно быть понятно }); SlimerJS очень похож на PhantomJS, но самое важное отличие, которое хотелось бы отметить — это окно бразуера во время выполнения SlimerJS. Другими словами, отладка и разработка ведутся проще, чем с фантомом.Итог SlimerJS позволяет быстро и просто парсить сложные динамические сайты, которые обычным cUrl спарсить не получается.