Lechazo Conf - Otogami - Web Scraping 101

JeronimoLopez3 1,511 views 74 slides Apr 28, 2015
Slide 1
Slide 1 of 74
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74

About This Presentation

Introducción a Web Scraping


Slide Content

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

¿Preguntas?
[email protected]
@jerolba
martes 28 de abril de 15