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.


quinta-feira, 11 de junho de 2015

Obter o PageID (do Facebook) através do URL de uma página - em nodejs

Andava eu a tentar obter os likes de páginas do Facebook mas a única informação que tenho disponível é o URL das mesmas, poderia fazer algo mais chato e complexo como usar a API para obter as páginas do utilizador (autenticar, obter o token de acesso com permissões para obter as páginas, listar as páginas para o utilizador escolher qual quer) mas não faz sentido para o site em questão andar com esse trabalho.

Depois de alguma pesquisa descobri que é possível obter o ID do objecto através da API, aqui fica o snippet em nodejs (a lógica aplica-se a outras linguagens):

FB.api('/', {
 "id": url
}, function(res) {
 
 var pageId = res.id || res.og_object.id;
 
 if(!pageId) return next({message: 'Ups, algo correu mal'}, 0);
 
 FB.api(pageId, { fields: ['likes'] }, function(res) {
  
  if(!res || res.error || !res.likes) {
   return next(res.error, 0);
  }
  
  return next(null, res.likes);
 });
});

A biblioteca que estou a utilizar é: https://github.com/Thuzi/facebook-node-sdk/

Se alguém tiver uma solução mais interessante ou elegante coloque aí nos comments.

quarta-feira, 10 de junho de 2015

Blogs España Monetiza tu blog

El Directorio de Blogs España aspira a ser la lista más completa de los blogs españoles.


Beneficios de hacer parte de la Red Anuncios BES


  • Monetiza tu blog


Ahora usted puede hacer más dinero con su blog. Cuando aderires a la Red Anuncios BES será añadido una barra a su blog, que contiene un banner que genera ingresos teniendo en cuenta el número de visitas. Cuanto mayor sea el número de lectores de su blog, más dinero ganará.