girl

Fakty

Fakt: nie wszystkie serwisy udostępniają publiczne API do pobierania danych, mimo, że te dane są publiczne.

Fakt 2: phpowy DomDocument::loadHTML() to może być za mało przy obecnym trendzie wybajerzonych frontendów, wszechobecnego JS i AJAXa.

Problem i rozwiązanie

Sam stanąłem przed powyższym problemem, gdy pisząc parser w PHP, okazało się, że trzeba coś wywołać na frontendzie. Rozwiązaniem było narzędzie, które potrafi poradzić sobie z interpretowaniem całego “stosu” aplikacji webowej z poziomu linii poleceń, a potem zwrócić wynik – PhantomJS.

Uwaga do instalacji PhantomJS

Jeśli pracujecie na maszynie linuksowej (ja użyłem Ubuntu postawionego przez Vagranta) – to najpewniej będziecie musieli kompilować PhantomJS, bo paczek jeszcze nie ma. Moja wirtualka miała jeden rdzeń (2.7 GHz), więc trwało to ponad 2 godziny, przy większej ilości rdzeni czas będzie oczywiście krótszy.

PhantomJS – mój proof of concept

Co chciałem osiągnąć?

Chciałem mieć możliwość wywołania komendy

phantomjs parser.js 'http://noapipage.com'

Gdzie “parser.js” to nazwa skryptu z kodem parsującym, a “http://noapipage.com” to url strony, którą parsuję.

Komenda miała zwrócić zawartość konkretnego elementu <span>, która to była zależna od wyboru na liście rozwijalnej.

Jak to zrobiłem

Oto kod parsera:

Pierwsze dwie linie to ładowanie potrzebnych modułów – “system” umożliwi dostanie się do argumentów z linii poleceń, a “webpage” operacje na parsowanej aplikacji WWW.

Możliwość grzebania w parsowanej stronie, umożliwia funkcja “evaluate”, którą PhantomJS udostępnia. Ciało tejże funkcji zawiera to co chciałem zrobić – czyli wybrać odpowiednią opcję z listy select (akurat tutaj użyłem JQuery, które używała aplikacja WWW – ale PhatonJS umożliwia także załączenie “swojego” JQuery lub innej biblioteki), a potem pobrać zawartość “<span>” o określonym id (tutaj już użyłem czystego JS – żeby pokazać, że też można).

Podsumowanie

Opisywany przypadek to tylko niewielka próba możliwości PhantomJS, który może być pomocny wszędzie tam gdzie potrzebujemy przeglądarki – bez przeglądarki, używanej z linii poleceń, a interpretującej coś więcej niż czysty HTML.

P.S. Zdjęcie dziewczyny dodałem, bo nie miałem pod ręką nic odpowiedniejszego – może się komuś na tapetę przyda 😛