Diapositivas correspondientes a la parte sobre recopilación de datos con screen scraping del curso de extensión universitaria "Cloud Computing. Desarrollo de Aplicaciones y Minería Web", celebrado en la Escuela Universitaria de Ingeniería Informática de Oviedo
1. CLOUD COMPUTING.
DESARROLLO DE APLICACIONESY
MINERÍA WEB
Programa de extensión universitariaUniversidad de Oviedo
Miguel Fernández Fernández
miguel@ThirdWay.es
7. Porqué screen scraping
La Web es fundamentalmente para
humanos (HTML)
Pero no está diseñada para ser procesada
por máquinas (XML, JSON, CSV...)
8. Porqué screen scraping
La Web es fundamentalmente para
humanos (HTML)
Pero no está diseñada para ser procesada
por máquinas (XML, JSON, CSV...)
<horario>
<viaje>
<salida format="hh:mm">06:39</salida>
<llegada format="hh:mm">07:15</llegada>
<duracion format="minutes">36</duracion>
<linea>C1</linea>
</viaje>
</horario>
10. Porqué screen scraping
No siempre disponemos de una API
Necesitamos simular el comportamiento humano
11. Porqué screen scraping
No siempre disponemos de una API
Necesitamos simular el comportamiento humano
Interpretar
HTML
12. Porqué screen scraping
No siempre disponemos de una API
Necesitamos simular el comportamiento humano
Interpretar
HTML
Realizar
interacciones
(Navegar)
13. Porqué screen scraping
No siempre disponemos de una API
Necesitamos simular el comportamiento humano
Interpretar
HTML
Realizar
interacciones
(Navegar)
Ser un Ninja
Evitar DoS
14. Selección de las herramientas
¿Con qué lenguaje vamos a trabajar?
Java .NET Ruby Python
URL
fetching
java.net.URL
System.Net.
HTTPWebRequest
net/http
open-uri
rest-open-uri
urllib
urllib2
DOM
parsing
/
transversing
javax.swing.text.html
TagSoup
NekoHTML
HTMLAgilityPack
HTree / ReXML
HPricot
RubyfulSoup
BeautifulSoup
Regexp java.util.regexp
System.Text.
RegularExpressions
Regexp re
--- Librerías de terceras partes. No forman parte de la API del lenguaje.
15. Selección de las herramientas
¿Con qué lenguaje vamos a trabajar?
Duck typing + Reflexión = Syntactic Sugar
16. Selección de las herramientas
¿Con qué lenguaje vamos a trabajar?
Lenguajes dinámicos facilitan la codificación
Duck typing + Reflexión = Syntactic Sugar
17. import javax.swing.text.html.*;
import javax.swing.text.Element;
import javax.swing.text.ElementIterator;
import java.net.URL;
import java.io.InputStreamReader;
import java.io.Reader;
public class HTMLParser
{
public static void main( String[] argv ) throws Exception
{
URL url = new URL( "http://java.sun.com" );
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
Reader HTMLReader = new InputStreamReader(url.openConnection().getInputStream());
kit.read(HTMLReader, doc, 0);
ElementIterator it = new ElementIterator(doc);
Element elem;
while( elem = it.next() != null )
{
if( elem.getName().equals( "img") )
{
String s = (String) elem.getAttributes().getAttribute(HTML.Attribute.SRC);
if( s != null )
System.out.println (s );
}
}
System.exit(0);
}
}
Java
19. Selección de las herramientas RubyRuby
rest-open-uri
HTree + REXML
RubyfulSoup
WWW:Mechanize
Hpricot
Nos permitirá hacer peticiones a
URLs y extraer su contenido
extiende open-uri para soportar
más verbos
20. Selección de las herramientas RubyRuby
rest-open-uri
HTree + REXML
RubyfulSoup
WWW:Mechanize
Hpricot
HTree crea un árbol de
objetos a partir de código
HTML
HTree#to_rexml
Convierte el árbol a un árbol
REXML
REXML puede navegarse con
XPath 2.0
22. Selección de las herramientas RubyRuby
rest-open-uri
HTree + REXML
RubyfulSoup
WWW:Mechanize
Hpricot
http://hpricot.com/
Scanner implementado en C
(Muy rápido)
Genera un DOM con su
propio sistema de navegación
(selectores CSS y XPath*)como Jquery
Funcionalidad equivalente a
Htree + REXML
24. Selección de las herramientas RubyRuby
rest-open-uri
HTree + REXML
RubyfulSoup
WWW:Mechanize
Hpricot
http://hpricot.com/
Scanner implementado en C
(Muy rápido)
Genera un DOM con su
propio sistema de navegación
(selectores CSS y XPath*)como Jquery
Funcionalidad equivalente a
Htree + REXML
25. Selección de las herramientas RubyRuby
rest-open-uri
RubyfulSoup
WWW:Mechanize
Hpricot
http://hpricot.com/
Scanner implementado en C
(Muy rápido)
Genera un DOM con su
propio sistema de navegación
(selectores CSS y XPath*)como Jquery
Funcionalidad equivalente a
Htree + REXML
26. Selección de las herramientas RubyRuby
rest-open-uri
RubyfulSoup
WWW:Mechanize
Hpricot
Ofrece la misma funcionalidad que
HTree + REXML
28. Selección de las herramientas RubyRuby
RubyfulSoup
WWW:Mechanize
rest-open-uri
Hpricot
Ofrece la misma funcionalidad que
HTree + REXML
29. Selección de las herramientas RubyRuby
RubyfulSoup
WWW:Mechanize
rest-open-uri
Hpricot
Ofrece la misma funcionalidad que
HTree + REXML
Menor rendimiento que Hpricot
30. Selección de las herramientas RubyRuby
RubyfulSoup
WWW:Mechanize
rest-open-uri
Hpricot
Ofrece la misma funcionalidad que
HTree + REXML
Menor rendimiento que Hpricot
No se admiten selectores CSS
31. Selección de las herramientas RubyRuby
WWW:Mechanize
rest-open-uri
Hpricot
Ofrece la misma funcionalidad que
HTree + REXML
Menor rendimiento que Hpricot
No se admiten selectores CSS
32. Selección de las herramientas RubyRuby
rest-open-uri
WWW:Mechanize
Hpricot
Permite realizar interacciones
Rellenar y enviar formularios
Seguir enlaces
Consigue alcanzar documentos en
La Web Profunda
41. require 'rubygems'
require 'mechanize'
class TuentiAPI
def initialize(login,password)
@login=login
@password=password
end
def inicio()
agent = Mechanize.new
agent.set_proxy("localhost",8080)
#decimos que somos firefox modificando la cabecera user agent
agent.user_agent_alias='Mac FireFox'
login_page = agent.get('http://m.tuenti.com/?m=login')
#cogemos el formulario de login
login_form = login_page.forms.first
#y rellenamos los campos usuario y contraseña
login_form.fields.select{|f| f.name=="tuentiemail"}.first.value=@login
login_form.fields.select{|f| f.name=="password"}.first.value=@password
pagina_de_inicio=agent.submit(login_form)
end
end
pagina_de_inicio=TuentiAPI.new("miguelfernandezfernandez@gmail.com","xxxxxx").inicio()
45. Paso 2: Obtener las fotos
class TuentiAPI
...
def fotos_nuevas()
tree=Hpricot(inicio().content)
fotos = tree / "//a//img[@alt=Foto]"
fotos.map!{|foto| foto.attributes["src"]}
Set.new(fotos).to_a
end
private
def inicio()
...
end
end
48. Paso 3: Establecer el estado
class TuentiAPI
...
def actualizar_estado(msg)
form_actualizacion=inicio.forms.first
form_actualizacion.fields.select{|f| f.name=="status"}.first.value=msg
@agent.submit(form_actualizacion)
end
end
50. Tor: navegando de forma
anónima
https://www.torproject.org/vidalia/
Red de encadenamiento de proxies
N peticiones salen de M servidores
Garantiza el anonimato a nivel de IP
52. CLOUD COMPUTING.
DESARROLLO DE APLICACIONESY
MINERÍA WEB
Programa de extensión universitariaUniversidad de Oviedo
Miguel Fernández Fernández
miguel@ThirdWay.es