Valladolid, 28 de Marzo de 2015
Jerónimo López
@jerolba
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ÓMO
martes 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 HTML
curl http://www.game.es/Product/Default.aspx?SKU=068320
martes 28 de abril de 15
Parseo HTML
Parseo HTML
curl 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 JavaScript
martes 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
SI
martes 28 de abril de 15