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

table.png

Но эти данные не хранятся на странице. Они формируются на ней динамически, с помощью скриптов на JavaScript

js.png

Видит око, да зуб неймет... Вот и наш браузер "видит", но сохранить увиденную таблицу не может. Браузер сохраняет страницу в том виде, в котором получил ее от сервера. Но на странице помимо статической разметки HTML могут содержаться скрипты -- программы, которые браузер выполняет, когда демонстрирует страницу пользователю, т.е. нам с вами. Нам нужно чтобы браузер сохранил страницу в этом последнем виде, с уже выполненными скриптами. А он -- неймет.

Решить эту проблему поможет... браузер. Но браузер необычный. PhantomJS -- это полноценный браузер с поддержкой JavaScript, CSS, DOM, SVG, Canvas и... , но -- без графического интерфейса.

phantomjs.png

PhantomJS использует Webkit и, таким образом, является "родственником" Google Chrome и Яндекс.Браузера. Он используется для unit-тестирования скриптов, создания скриншотов страниц и т. д. Мы же используем его для добычи информации.

Установка

Скачайте PhantomJS, скопируйте его файлы в нужный вам каталог и добавьте в PATH путь к исполняемому файлу phantomjs.exe (мы будем ориентироваться на работу в Windows). Обычно, этот файл находится в подкаталоге bin/.

Запуск

Наберем в консоли phantomjs, а затем, уже в PhantomJS, следующие команды

console.log('Hello, world!');
phantom.exit();

и убедимся, что PhantomJS работает

hello.png

Можно сохранить эти команды в скрипте hello.js и запустить этот скрипт, введя в консоли

phantomjs hello.js

Пример: рендеринг

Следующий скрипт загружает главную страницу Github и сохраняет ее изображение в файл github.png

// github.js

var page = require('webpage').create();

page.open('http://github.com/', function() {
  page.render('github.png');
  phantom.exit();
});

Функция require() служит для загрузки модулей JavaScript. В данном случае загружается модуль webpage из PhantomJS, служащий для создания веб-страницы. Обработка содержимого веб-страницы (парсинг) обычно начинается с загрузки этого модуля.

Затем вызывается функция open из webpage, которая имеет следующий формат

open(url, callback) {void}

Эта функция открывает url и загружает его в созданную страницу page. После того, как страница загрузиться, выполняется callback-функция. В нашем случае callback-функция создает изображение github.png и закрывает PhantomJS.

phantomjs github.js

дает нам

github.png

Сохранение веб-страницы в файл

Для сохранения страницы с таблицей в файл HTML создадим следующий скрипт

// scrape_techstars.js

var page = require('webpage').create();

var fs = require('fs');
var path = 'techstars.html'

page.open('http://www.techstars.com/companies/stats/', function (status) {
  var content = page.content;
  fs.write(path,content,'w')
  phantom.exit();
});

Модуль fs содержит операции файлового ввода-вывода. content сохраняет содержимое веб-страницы в виде строки. В callback-e мы сохраняем содержимое искомой веб-страницы и записываем его в файл techstars.html в текущем каталоге, как это указано в переменной path.

Запуск

phantomjs scrape_techstars.js

дает такую же по виду страницу, как и раньше. Но вот исходный код у нее уже другой

static_table.png

Теперь извлечь из таблицы данные -- дело техники.



Комментарии

comments powered by Disqus