lechazo conf - otogami - web scraping 101
Embed Size (px)
TRANSCRIPT

Valladolid, 28 de Marzo de 2015
Jerónimo Ló[email protected]
Scraping 101 para humanos
martes 28 de abril de 15

Disclaimer
Disclaimer
martes 28 de abril de 15

Sobre mi
Jerónimo‣ Apasionado de la informática
‣ Técnico vocacional
‣ Jugón
‣ 14 años de experiencia
‣ Mundo empresarial
‣ Medios de comunicación
‣ Java, J2EE
‣ ...y Scraping
martes 28 de abril de 15

QUÉmartes 28 de abril de 15

el mejor motor de búsqueda y comparador de ofertas de videojuegos
Quémartes 28 de abril de 15

el mejor motor de búsqueda y comparador de zapatillas y material deportivo
Quémartes 28 de abril de 15

Qué
Qué
‣Proporcionar toda la información:• Accesible
• Estructurada
• Sin ruido
• Actualizada
‣Dejar que el usuario elija
martes 28 de abril de 15

CÓMOmartes 28 de abril de 15

Cómo
Cómo
‣Recopilando datos
‣Filtrando los datos
‣Organizando los datos
martes 28 de abril de 15

Cómo
Cómo
Recopilar datos:• Servicios web/API
• Feed
• FTP
• Web Scraping
martes 28 de abril de 15

Cómo
Web Scraping
‣Accede al contenido
‣Parsea el HTML
‣Interpreta el contenido
martes 28 de abril de 15

Cómo
Web Scraping
‣Accede al contenido
‣Parsea el HTML
‣Interpreta el contenido
martes 28 de abril de 15

Parseo HTML
Parseo HTMLcurl http://www.game.es/Product/Default.aspx?SKU=068320
martes 28 de abril de 15

Parseo HTML
Parseo HTMLcurl http://www.game.es/Product/Default.aspx?SKU=068320
martes 28 de abril de 15

Parseo HTML
Parseo HTML
Estrategias:
‣El bueno
‣El feo
‣El malo
martes 28 de abril de 15

Parseo HTML
El feo: “Machote”
‣Las herramientas son
para nenazas
‣Uso IndexOf y SubString
a saco
martes 28 de abril de 15

Parseo HTML
El feo: “Machote”
martes 28 de abril de 15

Parseo HTML
El malo: Expresiones Regulares
‣Son perfectas para buscar patrones!
‣Una expresión regular
para dominarlos a todos
martes 28 de abril de 15

Parseo HTML
Expresiones Regulares
martes 28 de abril de 15

Parseo HTML
Expresiones Regulares
Ahora tienes dos problemas
martes 28 de abril de 15

Parseo HTML
Expresiones Regulares
RegEx
Jerarquia de Chomsky
HTML
martes 28 de abril de 15

Parseo HTML
Expresiones Regulares
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
martes 28 de abril de 15

Parseo HTML
El bueno: DOM
Parsea el documento y construye el árbol DOM
martes 28 de abril de 15

Parseo HTML
DOM
martes 28 de abril de 15

Parseo HTML
DOM
martes 28 de abril de 15

Parseo HTML
DOM
‣Nekko
‣JSoup
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Expresiones XPath
‣Expresiones JQuery
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM‣ Developers Tools/Firebug es tu mejor amigo
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM‣ ... pero ten a mano a CURL
curl 'http://www.game.es/Product/Default.aspx?SKU=101912' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: es,de-DE;q=0.8,de;q=0.6,en;q=0.4,nl;q=0.2' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://www.game.es/Search/search.aspx?Name=One%20Piece%20Unlimited%20World%20Red&New=True&Pre=True&Dlc=True&Status=A,U,O,P,F,B&PageSize=10&SortField=1&SortDirection=1' -H 'Cookie: ASP.NET_SessionId=msj45p4zhtbx4mljfvymotyl; __utmt=1; __utma=163409322.2020732193.1421491515.1427475287.1427478193.9; __utmb=163409322.2.10.1427478193; __utmc=163409322; __utmz=163409322.1427412085.7.4.utmcsr=game.es|utmccn=(referral)|utmcmd=referral|utmcct=/' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' --compressed
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Cuidado con el rendimiento:
• No recorras todo el DOM cada vez
• Localiza un nodo principal
• Navega a partir de él
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Expresiones simples
‣Evitad elementos del framework CSS
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Accede por id
‣Busca clases del CSS “semánticas”
no de estilo
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Gracias Google por el marcado semántico!
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM‣Especificación en http://schema.org
‣Busca facilitarle la vida a Google
‣Existe un schema para
todo lo que se os ocurra
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Gracias RIA y Ajax!
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Datos en JavaScript del HTML
‣Datos en peticiones AJAX
martes 28 de abril de 15

Acceso al DOM
Acceso al DOM
‣Datos en JavaScript del HTML
‣Datos en peticiones AJAX
martes 28 de abril de 15

Tu código
Tu código
‣Abstrae, abstrae, abstrae! :)
‣Desacopla el fetch de la página de su procesamiento
‣Desacopla las páginas entre si cuando navegues de una a otra
‣Desacopla la construcción de tus DTOs de la
lógica de parseo del HTML
martes 28 de abril de 15

Tu código
Tu código
‣Una clase por página•getTitulo()•getPrecio()•getCostesDeEnvio()•getDisponibilidad()‣Cuidado con los bucles infinitos en los listados
paginados
martes 28 de abril de 15

Tu código
Tu código‣Asúmelo, cualquier campo al que accedas
algún día no vendrá y tendrás un “NPE”
‣Asúmelo, la red falla y los servidores a los que
consultas se caen
‣En Otogami:
‣ Let It Crash y recover
‣ Trazas de los errores
‣ Si el nº de elementos obtenidos menor que % de
elementos actuales, se aborta el proceso
martes 28 de abril de 15

Tu código
Tu código
‣Somos agilistas y hacemos test, no?
‣Mi mejor test es que funciona con webs
reales
‣En cuanto algo se rompe es porque la
web ha cambiado
‣Monitoriza logs y alertas
martes 28 de abril de 15

Cómo
Recopila datos
‣Accede al contenido
‣Parsea el HTML
‣Interpreta el contenido
martes 28 de abril de 15

Accede al contenido
Accede al contenido‣Apréndete cómo funciona HTTP
martes 28 de abril de 15

Accede al contenido
Accede al contenido
‣Los distintos verbos:• GET
• POST
• PUT
• DELETE
‣Cómo van los parámetros en GET?
‣Cómo van los parámetros en POST?
martes 28 de abril de 15

Accede al contenido
La request
martes 28 de abril de 15

Accede al contenido
La request
Para paginar?!
martes 28 de abril de 15

Accede al contenido
Las cabeceras
martes 28 de abril de 15

Accede al contenido
Las cabeceras
‣Las cabeceras más importantes:
• User-Agent
• Accept
• Referer
• Cookie
martes 28 de abril de 15

Accede al contenido
User Agent
‣El User Agent identifica:
• la aplicación (tipo)
• el sistema operativo
• motor de renderizado
• el navegador en sí
martes 28 de abril de 15

Accede al contenido
Accept
‣ Accept especifica qué formatos acepta el navegador:
• Texto: Html, Xml,..
• Imágenes: WebP
• Compresión y tipos (gzip, deflate,...)
• Idiomas del usuario
martes 28 de abril de 15

Accede al contenido
Referer
‣ Referer especifica al servidor desde qué URL se originó la petición actual
‣ El servidor puede condicionalmente modificar el resultado en función de su valor
martes 28 de abril de 15

Accede al contenido
Cookies
‣ Las cookies son variables que comparten el servidor
y el navegador, sin pasarse explícitamente
‣ Por tanto, guardan estado del usuario:
• Idioma
• Pais
• Moneda
• etc
martes 28 de abril de 15

Accede al contenido
Cookies
‣ Las cookies son variables que comparten el servidor
y el navegador, sin pasarse explícitamente
‣ Por tanto, guardan estado del usuario:
• Idioma
• Pais
• Moneda
• etc
martes 28 de abril de 15

Accede al contenido
La de sesión
martes 28 de abril de 15

Accede al contenido
La de sesión
martes 28 de abril de 15

Accede al contenido
La de sesión
martes 28 de abril de 15

martes 28 de abril de 15

Maldito JavaScriptmartes 28 de abril de 15

Maldito JavaScript
Maldito JavaScript
‣ Hacer ingeniería inversa y calcular/simular en tu
código el resultado del JS
• Muy rápido en ejecución
• Pero muy frágil
• Si cambia la página tienes que volver a repetir la ingeniería inversa y reprogramar
martes 28 de abril de 15

Maldito JavaScript
Maldito JavaScript‣ Ejecutar todo en un motor web de verdad:
• Levanta un “navegador” de verdad
• Lento y consume muchos recursos
• Más robusto ante un cambio
• Tú no tienes que tocar nada si cambia el JS
• ¡Es un entorno de ejecución real! Tienes fetch,
parseo, user agents, cookies, sesión, etc. Out Of The Box!
• Más difícil de configurar
martes 28 de abril de 15

Maldito JavaScript
Maldito JavaScript
Capibara
WebDriver
martes 28 de abril de 15

Maldito JavaScript
Maldito JavaScript
Capibara
WebDriver
martes 28 de abril de 15

Maldito JavaScript
¿Y en Saas?
kimonolabs
martes 28 de abril de 15

¿Y en Otogami?
¿Y en Otogami?
‣ 100% Java
‣ Implementa un navegador por completo:
• Navegación
• Aplica CSS
• Ejecuta JS
‣ Implementa WebDriver y es el driver más rápido
‣ Por defecto, no activamos el JS ni el CSS
martes 28 de abril de 15

¿Es legal?
¿Es legal?
Aunque puede que incumplas términos del acuerdo
con la web si tienes un acuerdo comercial con ellos
SImartes 28 de abril de 15

¿Preguntas?
@jerolba
martes 28 de abril de 15