quarta-feira, 17 de junho de 2015

Scrapping de sites - em nodejs

Normalmente quando preciso de fazer scrapping a algum site utilizo o módulo request juntamente com o cheerio, algo como:

var request = require('request');
var cheerio = require('cheerio');

request({ uri: "https://www.google.pt" }, function(error, response, body) {

   if(response && response.statusCode && response.statusCode < 300) {

      var $ = cheerio.load(body);
      var el = $('#gbw').find('a.gb_ga');

      console.log(el.attr('title'));

   }//if

});


No entanto alguns sites estão por trás de proxies que protegem contra coisas chatas como ataques de DOS, e outras coisas, e acabam por bloquear este tipo de pedidos.
A forma que encontrei para conseguir evitar ser bloqueado é utilizar um headless browser, normalmente utilizado para testes automáticos ao UI, e assim ultrapassar essas protecções chatas.

Existem alguns módulos para nodejs no entanto alguns semi vivos, outros com problemas estranhos, o que estou a utilizar sem grandes problemas é o phantom, um wrapper para o phantomjs. Para utilizar é necessário ter o phantomjs instalado:

sudo npm install phantomjs -g


Exemplo de utilização:

var phantom = require('phantom');
var ph = false;

phantom.create(function (obj) {

   ph.createPage(function (page) {
      page.open("https://www.google.pt", function(status) {
         if(status == "success") {
            page.evaluate(function () {
               return document.getElementsByTagName('html')[0].innerHTML;
            }, function(result) {
               var $ = cheerio.load(result);
               var el = $('#gbw').find('a.gb_ga');
               console.log(el.attr('title'));
            });
         }//if
   });

});


Happy scrapping.


Nenhum comentário:

Postar um comentário