Wednesday, July 16, 2014

Web Scrapping con Julia y PhantomJS

Como he estado leyendo algunos libros sobre PhantomJS y siempre estoy buscando desarrollar algo interesante en Julia...Pensé que integrarlos podría ser una buena idea -;)

Pensé acerca de Twitter y los hashtags...no sería interesánte escribir un script en PhantomJS para hacer un web scrape en Twitter y obtener todos los hashtags que he usado?

Para este script en particular...Estoy tomando los hashtags de las primeras 5 páginas de Twitter que están enlazadas a mi perfil...

Hashtags.js
var system = require('system');

var webpage = require('webpage').create();
webpage.viewportSize = { width: 1280, height: 800 };
webpage.scrollPosition = { top: 0, left: 0 };

var userid = system.args[1];
var profileUrl = "http://www.twitter.com/" + userid;

webpage.open(profileUrl, function(status) {
 if (status === 'fail') {
  console.error('webpage did not open successfully');
  phantom.exit(1);
 }
 var i = 0,
 top,
 queryFn = function() {
  return document.body.scrollHeight;
 };
 setInterval(function() {
  top = webpage.evaluate(queryFn);
  i++;
   
  webpage.scrollPosition = { top: top + 1, left: 0 };

  if (i >= 5) {
   var twitter = webpage.evaluate(function () {
    var twitter = [];
    forEach = Array.prototype.forEach;
    var tweets = document.querySelectorAll('[data-query-source="hashtag_click"]');
    forEach.call(tweets, function(el) {
     twitter.push(el.innerText);
    });
    return twitter;
   });

   twitter.forEach(function(t) {
    console.log(t);
   });

   phantom.exit();
  }
}, 3000);
});

Si lo ejecutamos...vamos a tener el siguiente resultado...



Ahora...que es lo que quiero hacer con esta información...enviarla a Julia...y obtener los hashtags más usados...así que voy a sumarizarlos y luego deshacerme de los que solo aparecen una vez...

Veamos el código en Julia...


Twitter_Hashtags.jl
tweets = readall(`phantomjs --ssl-protocol=any Hashtags.js Blag`)
tweets = split(tweets,"\n")
hashtags = Dict()
for hash in tweets
 try
  hashtags[hash] += 1
 catch e
  hashtags[hash] = 1
 end
end

filter!((k,v)->v>1,hashtags)

for (k,v) in hashtags
 println("$k has been mentioned $v times")
end

Si lo ejecutamos...vamos a tener el siguiente resultado...


Todavía no se como ordenar diccionarios en Julia...así que tenganme paciencia -:)

En fín...viendo el resultado...podemos tener mis top 3 hashtags -;)

#LeapMotion ==> 14 veces
#Flare3D ==> 11 veces
#DevHangout ==> 8 veces

Espero que les haya gustado y nos vemos la próxima vez -:)

Saludos,

Blag.
Development Culture.

No comments: