Простий парсинг сайтів з допомогою 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, ширина: 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 спарс не виходить.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.