Web Scraping w Node.js

Web scraping - technika uzyskiwania informacji ze stron internetowych. Wykorzystywana przez wszelkiego rodzaju porównywarki cen czy ofert. Polega na pobraniu kody html strony, z której chcemy pobrać informacje, a następnie wydobycie interesujących na informacji. Technika ta jest zdumiewająco prosta w języku node.js przy wykorzystaniu bibliotek dostępnych przez npm.

X-RAY

Wystarczy pobrać bibliotekę npm install x-ray i napisać odpowiedni skrypt. Przykładowy:

var Xray = require('x-ray');
var x = Xray();
 
x('https://dribbble.com', 'li.group', [{
  title: '.dribbble-img strong',
  image: '.dribbble-img [data-src]@data-src',
}])
  .paginate([email protected]')
  .limit(3)
  .write('results.json')

Powyższy skrypt pobiera tytuły oraz obrazki wszystkich prac na stronie, a dodatkowo (paginate) przechodzi do kolejnych podstron i powtarza operacje. Wszystko zapisuje do pliku results.json.

Oczywiście funkcję write możemy zastąpić własną funkcją i tym samym dodatkowo przefiltrować dane lub, w przypadku obrazków, natychmiast je pobrać - na przykład przy użyciu biblioteki download (pobieramy przez: npm install download). Ulepszona wersja skryptu:

var Xray = require('x-ray');  
var fs = require('fs');
var download = require('download');
var x = Xray();

x('https://dribbble.com', 'li.group', [{  
  title: '.dribbble-img strong',
  image: '.dribbble-img [data-src]@data-src',
}])
  .paginate([email protected]')
  .limit(3)
  (function(err, result) {
  	for(var i in result){
  		var url = result[i].image;
  		(function(filename) {
  			download(url).then(data => {
			    fs.writeFileSync(filename, data);
				});	
  		})(url.split('/').pop());
		}
  })

Nightmare

Może się jednak zdarzyć, że pożądane dane są doczytywane bądź generowane i nie wydobędziemy ich z samego kodu HTML. W tym przypadku możemy wykorzystać nightmare - npm install nightmare - używana jest głównie do testów, jednak może posłużyć też w inny sposób. Nightmare działa przy użyciu PhantomJS, czyli przeglądarkowym silniku WebKit bez interfejsu graficznego.

Przykładowy skrypt:

var Nightmare = require('nightmare');  
var nightmare = Nightmare({ show: false });

var selector = 'h1';

nightmare  
  .goto('http://yahoo.com')
  .evaluate(function (selector) {
    return document.querySelector(selector).innerText;
   }, selector) 
  .then(function(text) {
    console.log(text);
  });

Jeśli chcemy mieć większą kontrolę nad tym co wykonuje skrypt możemy wyświetlić podgląd zmieniając drugą linijkę na var nightmare = Nightmare({ show: true });.

Możemy także zlecić wykonanie akcji takich jak wypełnienie formularza, czy kliknięcie przycisku.

A czy Wy próbowaliście już kiedyś wykorzystać Web scraping? Jeśli nie, to gorąco polecam - dajcie znać w komentarzu co stworzyliście.

Więcej informacji i przykładów: X-RAY, download, nightmare