Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño

Página creada Lucas Garci
 
SEGUIR LEYENDO
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Sistema de Web Scraping orientado a portales
           del ámbito inmobiliario
                    Álvaro Torrente Patiño
          Tutores: Adrián Carballal Mato y Juan Jesús Romero Cardalda

                              Curso 2020/2021
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Álvaro Torrente Patiño
Sistema de Web Scraping orientado a portales del ámbito inmobi-
liario
Trabajo Fin de Máster. Curso 2020/2021
Tutores: Adrián Carballal Mato y Juan Jesús Romero Cardalda

Máster Inter-Universitario en Ciberseguridade
Universidade da Coruña
Facultade de Informática Coruña
Campus de Elviña s/n
15071, A Coruña
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Abstract

In this project we have implemented a Web Scraping system that obtains information
from real estate portals, as well as downloading images of the properties.

This project has been developed in connection with the internship for the University
of A Coruña (UDC) in the department of the Research Center for ICT (CITIC).

The Web Scraping system has been developed in the Python programming language
and integrated into the PhotoILike web tool with the help of Docker technology.

Keywords — web scraping, real estate, python, docker

                                                                                       iii
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Resumen

En este proyecto se ha implementado un sistema de Web Scraping que obtiene
información de portales inmobiliarios, así como la descarga de las imágenes de los
inmuebles.

Este proyecto se ha desarrollado en relación con la realización de las prácticas en
empresa para la Universidade da Coruña (UDC) en el departamento del Centro de
Investigación en Tecnologías de la Información y las Comunicaciones (CITIC).

El sistema de Web Scraping se ha desarrollado en el lenguaje de programación
Python e integrado en la herramienta web PhotoILike con la ayuda de la tecnología
Docker.

Palabras clave — web scraping, web crawlers, data mining, portales inmobiliarios,
python, docker

                                                                                      v
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Índice general

Índice de figuras                                                                                                                   ix

Índice de tablas                                                                                                                    xi

Listado de extractos de código                                                                                                     xiii

1. Introducción                                                                                                                      1
   1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                   1
   1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  1
   1.3. Organización de la memoria . . . . . . . . . . . . . . . . . . . . . . .                                                     2

2. Fundamentos tecnológicos                                                                                                         3
   2.1. Python . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    3
   2.2. Scrapy . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
        2.2.1. scrapy-fake-useragent       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5
   2.3. Requests . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
   2.4. Pillow . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
   2.5. Docker . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
   2.6. GitHub . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
   2.7. Microsoft Teams . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
   2.8. Trello . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14

3. Situación actual                                                                                                                17
   3.1. Marco teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                17
        3.1.1. Web Crawlers (Rastreadores Web) . . . . . . . . . . . . . . .                                                       17
        3.1.2. Web Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  18
        3.1.3. Defensa y prevención contra el Web Scraping . . . . . . . . .                                                       18
        3.1.4. Legalidad del Web Scraping . . . . . . . . . . . . . . . . . . .                                                    21
        3.1.5. Consecuencias legales del Web Scraping . . . . . . . . . . . .                                                      22
        3.1.6. Data Mining (Minería de Datos) . . . . . . . . . . . . . . . .                                                      24
   3.2. Tecnologías base . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                 25
        3.2.1. Herramientas de línea de comandos: Wget y cURL . . . . . .                                                          25
        3.2.2. Librerías para Python: Requests, Scrapy, Selenium y Beautiful
               Soup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                25

                                                                                                                                          vii
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
3.3. Trabajos relacionados     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
               3.3.1. ParseHub . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
               3.3.2. Webhose.io . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
               3.3.3. Octoparse . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
               3.3.4. OutWit Hub .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29

       4. Metodología                                                                                                                            33
          4.1. Planificación . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
          4.2. Análisis de riesgos . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
          4.3. Costes . . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
               4.3.1. Recursos humanos .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
               4.3.2. Recursos materiales            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
          4.4. Seguimiento . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38

       5. Trabajo realizado                                                                                                                      41
          5.1. Configuración del entorno de trabajo y herramientas .                                             .   .   .   .   .   .   .   .   41
          5.2. Análisis de portales inmobiliarios . . . . . . . . . . . .                                        .   .   .   .   .   .   .   .   42
          5.3. Diseño e implementación del sistema de Web Scraping                                               .   .   .   .   .   .   .   .   49
          5.4. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . .                                       .   .   .   .   .   .   .   .   52
          5.5. Implantación del sistema . . . . . . . . . . . . . . . . .                                        .   .   .   .   .   .   .   .   57

       6. Resultados                                                                        61
          6.1. Funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
          6.2. Problemas encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . 62
          6.3. Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

       7. Conclusiones                                                                     65
          7.1. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
          7.2. Limitaciones y trabajo futuro . . . . . . . . . . . . . . . . . . . . . . 65

       Bibliografía                                                                                                                              67

       A. Apéndice                                                                         71
          A.1. Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
          A.2. Acrónimos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

viii
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
Índice de figuras

2.1. Análisis en detalle de un User-Agent a través de UserAgentString.com.           5
2.2. Imagen original cargada con Pillow. . . . . . . . . . . . . . . . . . . . . .   8
2.3. Imagen redimensionada y girada con Pillow. . . . . . . . . . . . . . . . .      8
2.4. Funcionamiento de la herramienta Docker. . . . . . . . . . . . . . . . . .      9
2.5. Diferencias entre arquitecturas. . . . . . . . . . . . . . . . . . . . . . . . 11
2.6. Ejemplo de una rama (branch) en un proyecto de desarrollo. . . . . . . . 12
2.7. Plataforma de comunicación Microsoft Teams. . . . . . . . . . . . . . . . 13
2.8. Tablero de tareas de Trello con dos columnas. . . . . . . . . . . . . . . . 15

3.1. CAPTCHA textual (reCAPTCHA v1). . . . . . . . . . . . . . . . . . . . 19
3.2. CAPTCHA visual (reCAPTCHA v2). . . . . . . . . . . . . . . . . . . . 20
3.3. CAPTCHA “no soy un robot” (reCAPTCHA v2+). . . . . . . . . . . . . 20
3.4. CAPTCHA invisible (reCAPTCHA v3). . . . . . . . . . . . . . . . . . . 21
3.5. Planes de pago de ParseHub. . . . . . . . . . . . . . . . . . . . . . . . . 26
3.6. Uso de ParseHub sobre un comercio electrónico. . . . . . . . . . . . . . . 27
3.7. Planes de pago de Webhose. . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.8. Uso de Octoparse sobre un comercio electrónico. . . . . . . . . . . . . . . 29
3.9. Uso de OutWit Hub sobre una entrada de Wikipedia. . . . . . . . . . . . 31

4.1. Ciclo de desarrollo SCRUM. . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2. Diagrama de Gantt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.3. Recursos hardware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4. Diagrama de Gantt de seguimiento. . . . . . . . . . . . . . . . . . . . . . 39

5.1. Inspección de elementos de Idealista. . . . . . . . . . . . . . . . . . . . . 42
5.2. Inspección de elementos de Fotocasa. . . . . . . . . . . . . . . . . . . . . 44
5.3. Inspección de elementos de Pisos.com. . . . . . . . . . . . . . . . . . . . 47
5.4. Funcionamiento básico del sistema de Web Scraping. . . . . . . . . . . . 51
5.5. Esquema de integración del sistema de Web Scraping con PhotoILike. . . 57
5.6. Web Scraping integrado en PhotoILike.com. . . . . . . . . . . . . . . . . 58
5.7. Correo electrónico con los resultados del Web Scraping. . . . . . . . . . . 58

6.1. Correlación del precio y la superficie de los inmuebles. . . . . . . . . . . 61
6.2. Correlación del precio y la puntuación media de las imágenes. . . . . . . 62

                                                                                         ix
Sistema de Web Scraping orientado a portales del ámbito inmobiliario - Álvaro Torrente Patiño
6.3. reCAPTCHA (v3)   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

x
Índice de tablas

4.1.   Tareas del proyecto. . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
4.2.   Análisis de riesgos. . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
4.3.   Coste personal del proyecto. . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
4.4.   Presupuesto materiales. . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
4.5.   Reestructuración tareas del proyecto.        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38

5.1.   Pruebas   de   rendimiento   para   Pisos.com. . . . . . . . . .                         .   .   .   .   .   .   .   .   .   55
5.2.   Pruebas   de   rendimiento   para   Fotocasa. . . . . . . . . . .                        .   .   .   .   .   .   .   .   .   55
5.3.   Pruebas   de   rendimiento   para   Pisos.com con PhotoILike.                            .   .   .   .   .   .   .   .   .   56
5.4.   Pruebas   de   rendimiento   para   Fotocasa con PhotoILike. .                           .   .   .   .   .   .   .   .   .   56

                                                                                                                                         xi
Listado de extractos de
código

2.1.   Instalación de Python en Ubuntu. . . . . . . . . . . . . . . . . . . . . .       3
2.2.   Comprobación de la versión de Python en Ubuntu. . . . . . . . . . . . .          3
2.3.   Instalación de Scrapy con pip. . . . . . . . . . . . . . . . . . . . . . . .     4
2.4.   Comandos y uso de Scrapy. . . . . . . . . . . . . . . . . . . . . . . . . .      4
2.5.   Instalación de scrapy-fake-useragent con pip. . . . . . . . . . . . . . . .      6
2.6.   Configuración básica de un User-Agent. . . . . . . . . . . . . . . . . . .       6
2.7.   Instalación de Requests con pip. . . . . . . . . . . . . . . . . . . . . . .     7
2.8.   Uso de Requests con Python. . . . . . . . . . . . . . . . . . . . . . . . .      7
2.9.   Instalación de Pillow con pip. . . . . . . . . . . . . . . . . . . . . . . . .   7
2.10. Uso de Pillow con Python (1). . . . . . . . . . . . . . . . . . . . . . . .       8
2.11. Uso de Pillow con Python (2). . . . . . . . . . . . . . . . . . . . . . . .       8
2.12. Instalación de Docker en Ubuntu. . . . . . . . . . . . . . . . . . . . . .        9
2.13. Comprobación de la versión e información de Docker. . . . . . . . . . .           9
2.14. Ejemplo de un fichero Dockerfile. . . . . . . . . . . . . . . . . . . . . . . 10
2.15. Contenido de requirements.txt. . . . . . . . . . . . . . . . . . . . . . . . 10
2.16. Creación de la imagen y ejecución del contenedor con Docker. . . . . . 11
2.17. Descarga del repositorio. . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.18. Commit de los cambios en el repositorio. . . . . . . . . . . . . . . . . . 12
2.19. Creación de la rama “develop”. . . . . . . . . . . . . . . . . . . . . . . . 12
2.20. Fusión de ramas y etiquetado de versión. . . . . . . . . . . . . . . . . . 13

3.1.   Ejemplo de un fichero ‘robots.txt’ con dos reglas definidas. . . . . . . . 19

5.1.   Fragmento del código fuente de Idealista (imágenes). . . . . . . . . . . . 42
5.2.   Patrón en las URL de las imágenes de Idealista. . . . . . . . . . . . . . 43
5.3.   Fragmento del código fuente de Idealista (características). . . . . . . . . 43
5.4.   Fragmento del código fuente de Fotocasa (imágenes). . . . . . . . . . . 44
5.5.   Patrones en las URL de las imágenes de Fotocasa. . . . . . . . . . . . . 45
5.6.   Fragmento del código fuente de Fotocasa (precio). . . . . . . . . . . . . 45
5.7.   Fragmento del código fuente de Fotocasa (características).       . . . . . . . 46
5.8.   Fragmento del código fuente de Fotocasa (características extra). . . . . 46

                                                                                            xiii
5.9.    Fragmento del código fuente de Pisos.com (imágenes). . . .          .   .   .   .   .   .   .   47
      5.10.   Patrón en las URL de las imágenes de Pisos.com. . . . . .           .   .   .   .   .   .   .   47
      5.11.   Fragmento del código fuente de Pisos.com (características).         .   .   .   .   .   .   .   48
      5.12.   Creación del proyecto ‘realestate’. . . . . . . . . . . . . . .     .   .   .   .   .   .   .   49
      5.13.   Contenido del proyecto ‘realestate’. . . . . . . . . . . . . . .    .   .   .   .   .   .   .   49
      5.14.   Esqueleto de un ‘spider’. . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   50
      5.15.   Comando de scrapy. . . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   50
      5.16.   Datos almacenados en el fichero JSON. . . . . . . . . . . .         .   .   .   .   .   .   .   51
      5.17.   Inicialización del scraper al ejecutarse. . . . . . . . . . . . .   .   .   .   .   .   .   .   52
      5.18.   Resultado del comando de scrapy. . . . . . . . . . . . . . .        .   .   .   .   .   .   .   53
      5.19.   Contenido del fichero ‘fotocasa-158207288.txt’. . . . . . . .       .   .   .   .   .   .   .   54
      5.20.   Contenido del fichero ‘fotocasa-158207288-features.txt’. . .        .   .   .   .   .   .   .   54
      5.21.   Contenido del fichero ‘fotocasa-158207288-price.txt’. . . . .       .   .   .   .   .   .   .   54
      5.22.   Datos obtenidos con el API de PhotoILike. . . . . . . . . .         .   .   .   .   .   .   .   59
      5.23.   Características obtenidas del inmueble. . . . . . . . . . . .       .   .   .   .   .   .   .   60

      6.1.    Ejecución de scrapy sobre el portal Idealista. . . . . . . . . . . . . . . . 63

xiv
Introducción                                                                 1
1.1 Motivación

    Este proyecto se realiza en relación con las prácticas en empresa del Máster para la
    Universidade da Coruña (UDC) en el departamento del Centro de Investigación en
    Tecnologías de la Información y las Comunicaciones (CITIC).

    El proyecto de investigación Indest (Progama IGNICIA) llevado a cabo en la
    Universidade da Coruña, tiene como objetivo crear un sistema de predicción estética
    para las imágenes de un inmueble, y de esta forma seleccionar aquellas imágenes
    más atractivas para los posibles compradores que visiten un portal inmobiliario.
    Este sistema de predicción estética recibe el nombre de PhotoILike.

    A raíz de esto, surgió la necesidad de la creación de la herramienta de Web Scraping
    para complementar al sistema de predicción, para lo cual se contrató al alumno.

1.2 Objetivos

    El objetivo principal del trabajo a realizar es el diseño, implementación, pruebas
    e implantación de un sistema de Web Scraping orientado a portales del ámbito
    inmobiliario. El Web Scraping o raspado web, es una técnica utilizada para extraer
    información de sitios web simulando la navegación de un humano. Esta herramienta
    deberá permitir evadir los distintos métodos existentes para evitar la adquisición
    automatizada de información en este tipo de portales.

    El desarrollo de dicha herramienta estará basada en el lenguaje de programación
    Python y focalizada para su implantación en una infraestructura cloud (p.e. AWS)
    con ayuda de la tecnología Docker para automatizar el despliegue de la herramienta.

    Como objetivos secundarios se contempla el aprendizaje de los conceptos que abarcan
    los ámbitos de seguridad y legislativo sobre el Web Scraping, es decir, qué medidas
    de seguridad protegen frente al Web Scraping y cómo evitarlas, y hasta qué punto
    es legal realizarlo y sus consecuencias.

                                                                                           1
1.3 Organización de la memoria

      En el Capítulo 1 “Introducción”, se expone la motivación y los objetivos que se
      buscan conseguir con la realización de este proyecto.

      En el Capítulo 2 “Fundamentos tecnológicos”, se indican cuales han sido las tecno-
      logías empleadas para conseguir los objetivos que han sido expuestos en el primer
      capítulo.

      En el Capítulo 3 “Situación actual”, se evalúa el estado de la cuestión en lo referente
      al Web Scraping.

      En el Capítulo 4 “Metodología”, se indica cómo se ha estructurado el proyecto y la
      elección de la metodología de trabajo.

      En el Capítulo 5 “Trabajo realizado”, se realiza el análisis de requisitos y se detalla
      cada una de las fases de desarrollo según la metodología escogida.

      En el Capítulo 6 “Resultados”, se exponen los resultados obtenidos al finalizar el
      desarrollo del proyecto junto con el grado de satisfacción de sus funcionalidades.

      En el Capítulo 7 “Conclusiones”, se comentan los puntos positivos y negativos del
      proyecto, así como las posibilidades de mejora que se podrían añadir a partir del
      desarrollo realizado en este proyecto.

  2       Capítulo 1 Introducción
Fundamentos tecnológicos                                                                 2
   En este capítulo se realiza una revisión de las tecnologías que se emplean para el
   desarrollo de la solución al problema a resolver.

2.1 Python

   Python [Pyt20] es un lenguaje de programación interpretado y orientado a objetos
   disponible prácticamente para cualquier sistema operativo actual. Es un lenguaje
   muy potente y versátil debido a su tipado dinámico1 , dispone de gran cantidad de
   librerías y gestión automática de la memoria.

   Es un lenguaje muy popular en la comunidad científica ya que es una alterna-
   tiva libre a MatLab y R (herramientas software matemáticas). También es muy útil
   para el desarrollo de páginas web gracias a frameworks como Django o Flask. Puede
   integrarse fácilmente con otros lenguajes de programación como C/C++ o Fortran
   (entre otros).

   Actualmente se encuentra en la versión 3.9, sin embargo se ha establecido como
   requisito mínimo la versión 3.6, ya que es la mínima para las librerías necesarias
   para el funcionamiento de la herramienta.

   Cód. 2.1: Instalación de Python en Ubuntu.
                sudo apt update
                sudo apt install python3-pip

   Cód. 2.2: Comprobación de la versión de Python en Ubuntu.
                $ python3 --version
                Python 3.6.9
                $ python3 -m pip --version
                pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

    1
        La comprobación del tipo de los datos se produce durante la ejecución del programa en vez de
         durante la compilación del mismo como ocurre con el tipado estático de otros lenguajes.

                                                                                                       3
2.2 Scrapy

      Scrapy [dev08] es un framework de scraping y crawling para el lenguaje de programa-
      ción Python. Hace uso de rastreadores web que siguen un conjunto de instrucciones
      para obtener información de páginas web.

      Ha sido desarrollado por las compañías Mydeco e Insophia, dedicadas al e-commerce
      y a la consultoría web respectivamente. Actualmente lo mantiene la empresa de
      servicios de Web Scraping Scrapinghub.

      A parte de la extracción y minería de datos puede utilizarse para otros propósitos
      como monitorizar sitios web o realizar pruebas automatizadas. Se puede utilizar
      mediante línea de comandos o como una librería más de Python.

      Cód. 2.3: Instalación de Scrapy con pip.
                python3 -m pip install scrapy

      Cód. 2.4: Comandos y uso de Scrapy.
                $ scrapy --help
                Scrapy 2.5.0 - no active project

                Usage:
                  scrapy  [options] [args]

                Available commands:
                  bench         Run quick benchmark test
                  commands
                  fetch         Fetch a URL using the Scrapy downloader
                  genspider     Generate new spider using pre-defined templates
                  runspider     Run a self-contained spider (without creating a project
                                                              )
                  settings      Get settings values
                  shell         Interactive scraping console
                  startproject Create new project
                  version       Print Scrapy version
                  view          Open URL in browser, as seen by Scrapy

                  [ more ]      More commands available when run from project directory

                Use "scrapy  -h" to see more info about a command

  4        Capítulo 2 Fundamentos tecnológicos
2.2.1 scrapy-fake-useragent

      Scrapy se apoya en el middleware scrapy-fake-useragent [Afa14] para obtener de
      forma aleatoria2 distintos User-Agent o generar nuevos User-Agent falsos. Estos
      User-Agent permiten realizar consultas a gran velocidad para agilizar el proceso de
      análisis web y extracción de datos.

      Los User-Agent son cadenas de caracteres que hacen referencia a una versión
      concreta de un navegador web (real o no) para hacer creer que una persona real está
      usando dicho navegador. A continuación podemos ver ejemplos de algunos de estos
      User-Agent:

            • Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)
              Chrome/91.0.4472.77 Safari/537.36: navegador web Chrome versión 91.0.4472.77
              corriendo en un sistema Linux.

            • Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefo-
              x/89.0: navegador web Firefox versión 89.0 corriendo en un sistema Linux.

            • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15
              (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15: navegador web Safari
              corriendo en un sistema Macintosh.

      Fig. 2.1.: Análisis en detalle de un User-Agent a través de UserAgentString.com.

       2
           Obtiene User-Agent de forma aleatoria basada en estadísticas de uso reales.

                                                                                         2.2 Scrapy   5
Cód. 2.5: Instalación de scrapy-fake-useragent con pip.
               python3 -m pip install scrapy-fake-useragent

     A la hora de configurar los middlewares hay que tener en cuenta los siguientes
     parámetros:

        • UserAgentMiddleware: permite a los spiders anular el User-Agent por defecto.

        • RetryMiddleware: permite reintentar las peticiones fallidas a causa de proble-
          mas temporales como un HTTP 500 Error Interno del Servidor.

     Estos middlewares son los propios de Scrapy, que se deshabilitarán para dar prioridad
     absoluta a los correspondientes proporcionados por scrapy-fake-useragent (ver Cód.
     2.6).

     Cód. 2.6: Configuración básica de un User-Agent.
               DOWNLOADER_MIDDLEWARES = {
                   'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
                   'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
                   'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
                   'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401,
               }

2.3 Requests

     Requests [Rei11] es una librería de Python que proporciona, de forma simplificada, las
     funcionalidades necesarias para realizar peticiones HTTP a través de los métodos:

        • POST: envía los datos al servidor para que los procese (en el cuerpo de la
          petición). Está orientado a crear un nuevo recurso.

        • GET: solicita una representación del recurso especificado. No debe causar
          modificaciones del recurso.

        • PUT: carga en el servidor una representación del recurso. A diferencia de
          POST, PUT está orientado a actualizar un recurso ya existente.

        • DELETE: elimina el recurso especificado.

     Además Requests dispone de importantes características entre las que cabe desta-
     car:

        • Keep-Alive (mantiene la sesión activa)

 6        Capítulo 2 Fundamentos tecnológicos
• Pool de conexiones

       • Sesiones con cookies permanentes

       • Verificación SSL

       • Peticiones con autenticación (p.e. solicitar inicio de sesión indicando usuario y
         contraseña)

       • Descargas en streaming

    Cód. 2.7: Instalación de Requests con pip.
              python3 -m pip install requests

    Cód. 2.8: Uso de Requests con Python.
              >>> import requests
              >>> url = "https://i.picsum.photos/id/309/200/300.jpg?hmac=gmsts4-400
                  Ihde9dfkfZtd2pQnbZorV4nBKlLOhbuMs"
              >>> r = requests.get(url)
              >>> r.status_code
              200
              >>> r.headers['Content-Type']
              'image/jpeg'

2.4 Pillow

    Pillow [Cla11] es un fork de la librería PIL (Python Imaging Library) para el
    procesamiento de imágenes, incluyendo diversas operaciones, como redimensiona-
    do, rotación, transformaciones arbitrarias, conversión del formato, obtención de
    estadísticas (histograma), etc.

    El proyecto nació en 2009 como “Python Imaging Library” (PIL) de manos de
    Fredrik Lundh pero en 2011 fue abandonado y continuado por Alex Clark que creo
    el fork que actualmente conocemos como Pillow y convirtiendose en el oficial que
    utilizan distribuciones Linux como Debian o Ubuntu desde 2012.

    Soporta gran cantidad de formatos de imagen, desde los más habituales como
    BMP, GIF, ICO, JPEG, PNG o TIFF, pero además también admite PSD (Adobe
    Photoshop), PDF (Acrobat), HDF5 (Hierarchical Data Format) o MPEG (Moving
    Picture Experts Group).

    Cód. 2.9: Instalación de Pillow con pip.
              python3 -m pip install Pillow

                                                                                2.4 Pillow   7
Cód. 2.10: Uso de Pillow con Python (1).
              >>> import requests
              >>> from PIL import Image
              >>> url = "https://i.picsum.photos/id/309/200/300.jpg?hmac=gmsts4-400
                  Ihde9dfkfZtd2pQnbZorV4nBKlLOhbuMs"
              >>> img = Image.open(requests.get(url, stream=True).raw)
              >>> w,h = img.size
              >>> w,h
              (200, 300)
              >>> img.show()

    Fig. 2.2.: Imagen original cargada con Pillow.

    Cód. 2.11: Uso de Pillow con Python (2).
              >>> tmp = img.resize((224,224))
              >>> img = tmp.rotate(90)
              >>> img.show()

    Fig. 2.3.: Imagen redimensionada y girada con Pillow.

8        Capítulo 2 Fundamentos tecnológicos
2.5 Docker

   Docker [Hyk13] es una herramienta de virtualización ligero que permite levantar
   máquinas independientes con sistemas operativos ligeros. Utiliza un sistema de
   imágenes que crean contenedores para virtualizar el sistema operativo. Estas imá-
   genes se pueden almacenar en Docker Hub de manera privada o pública para la
   comunidad.

   Una imagen es una colección de archivos comprimidos que contienen toda la infor-
   mación que se necesita para poder ejecutar un contenedor (librerías, directorios,
   ejecutables, etc.).

   Por otro lado, un contenedor es una instancia de una imagen. Se pueden crear varios
   contenedores independientes a partir de una misma imagen, ya que cada contenedor
   está aislado del resto de procesos del sistema y de contenedores.

   Fig. 2.4.: Funcionamiento de la herramienta Docker.

   Cód. 2.12: Instalación de Docker en Ubuntu.
             sudo apt-get update
             sudo apt-get install docker-ce docker-ce-cli containerd.io

   Cód. 2.13: Comprobación de la versión e información de Docker.
             $docker --version
             Docker version 20.10.2, build 20.10.2-0ubuntu1~18.04.2

             $ docker info
             Client:
              Context:     default
              Debug Mode: false

             Server:
              Containers: 5
               Running: 0
               Paused: 0

                                                                          2.5 Docker     9
Stopped: 5
                Images: 15
                Server Version: 20.10.2
               ...

     Otros componentes muy importante en Docker es el Dockerfile. El Dockerfile es un
     script que contiene los comandos necesarios para crear una imagen de Docker (ver
     Cód. 2.14). Para crear una imagen se utiliza el comando “docker build” (ver Cód.
     2.16).

     Cód. 2.14: Ejemplo de un fichero Dockerfile.
               ### 1. Get Linux
               FROM alpine:3.7

               ### 2. Get Python, PIP

               RUN apk add --no-cache python3 \
                && python3 -m ensurepip \
                && pip3 install --upgrade pip setuptools \
                && rm -r /usr/lib/python*/ensurepip \
                && if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi \
                && if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/
                                                              bin/python; fi \
                && apk add --no-cache python3-dev

               ### scrapy
               RUN apk add --no-cache gcc linux-headers musl-dev libffi-dev libxml2-
                                                             dev libxslt-dev openssl-
                                                             dev python3-dev

               ### Pillow
               RUN apk add build-base python-dev py-pip jpeg-dev zlib-dev
               ENV LIBRARY_PATH=/lib:/usr/lib

               ### 3. Install requirements
               COPY requirements.txt /tmp/requirements.txt
               RUN pip3 install --quiet -r /tmp/requirements.txt

               ### 4. Copy files
               RUN mkdir -p /tmp/scraper-test
               WORKDIR /tmp/scraper-test
               COPY realestate/ /tmp/scraper-test/realestate/

     Cód. 2.15: Contenido de requirements.txt.
               scrapy>=1.7.4
               scrapy-fake-useragent>=1.1.0
               requests>=2.22.0
               Pillow>=6.2.1
               argparse>=1.4.0

10        Capítulo 2 Fundamentos tecnológicos
Cód. 2.16: Creación de la imagen y ejecución del contenedor con Docker.
             docker build --tag=scraper-test .
             docker run -it --rm --name=scrapercontainer scraper-test sh

   La principal diferencia entre Docker y una máquina virtual es que los contenedores
   de Docker son mucho más ligeros y flexibles que las máquinas virtuales. Como se ha
   dicho antes, los contenedores de Docker están aislados entre si, pero pueden compartir
   librerías y procesos entre ellos modificando el nivel de aislamiento, mientras que las
   máquinas virtuales aislan el sistema operativo completo, por lo que dos aplicaciones
   en dos máquinas virtuales distintas no podrán compartir librerías ni procesos.

   Otra diferencia importante es que mientras que las máquinas virtuales son contro-
   ladas por el hipervisor del sistema operativo anfitrión, los contenedores de Docker
   son controlados por el Docker Engine (o Docker Daemon) y es independiente del
   sistema operativo, por lo que se puede ejecutar cualquier contenedor Docker inde-
   pendientemente del sistema operativo anfitrión.

                (a) Arquitectura VMs                     (b) Arquitectura contenedores

   Fig. 2.5.: Diferencias entre arquitecturas.

2.6 GitHub

   GitHub [Wan+11] es una plataforma de desarrollo colaborativo que se utiliza para
   alojar proyectos utilizando el sistema de control de versiones Git. Se ha utilizado
   para almacenar y compartir (en privado) el código fuente de la herramienta a
   desarrollar.

   El control de versiones Git permite administrar los cambios que se realizan en
   el código según se va desarrollando el proyecto. Al subir a GitHub una versión
   modificada esta no sobreescribe a la anterior, sino que se almacenan como versiones
   independientes, pudiendo así volver a versiones anteriores si la nueve tiene fallos o
   no funciona como se esperaba.

                                                                              2.6 GitHub    11
Cada proyecto se almacena en lo que se conoce como “repositorio”. Cada repositorio
     y su correspondiente URL son únicos.

     Durante el desarrollo de un proyecto se pueden crear ramificaciones o “branches”,
     que crean una copia de la rama principal del proyecto y así poder hacer pruebas sin
     que esto modifique a la rama principal. Si una ramificación en la que se realizan
     pruebas tiene un resultado satisfactorio, esta se puede fusionar con la rama principal
     creando una nueva versión

     Fig. 2.6.: Ejemplo de una rama (branch) en un proyecto de desarrollo.

     Una vez se crea el proyecto en GitHub, este se puede descargar en el equipo de
     desarrollo mediante el comando “git clone”:

     Cód. 2.17: Descarga del repositorio.
               git clone https://github.com/usuario/nombreproyecto.git

     Cada vez que se realizan cambios y se quieren guardar en el repositorio, se añaden
     los archivos correspondientes con el comando “git add”, se crea una instantánea de
     los cambios con el comando “git commit” y se envían al repositorio remoto con el
     comando “git push”:

     Cód. 2.18: Commit de los cambios en el repositorio.
               git add 
               git commit [-m ]
               git push origin 

     Para crear una ramificación (branch) se utiliza el comando “git checkout”, por
     ejemplo, si se quiere crear una rama “develop” a partir de la rama “master”:

     Cód. 2.19: Creación de la rama “develop”.
               git checkout -b develop master

     Tras realizar cambios satisfactorios en la rama “develop” y realizar el “commit” en
     dicha rama, se cambia a la rama principal (master) con el comando “git checkout” y

12        Capítulo 2 Fundamentos tecnológicos
se fusionan los cambios con el comando “git merge”3 . A mayores se puede usar el
    comando “git tag” para añadir una etiqueta de la versión.

    Cód. 2.20: Fusión de ramas y etiquetado de versión.
                  # Estando en la rama 'develop':
                  git add 
                  git commit [-m ]
                  git checkout master
                  git merge --no-ff develop
                  git tag -a v1.0.0 -m "Nueva versión v1.0.0"
                  git push origin master
                  git push origin master --tags

2.7 Microsoft Teams

    Microsoft Teams [Mic17] es una plataforma de comunicación y colaboración en el
    entorno laboral que combina chat, videollamada grupal, almacenamiento de archivos
    en la nube (OneDrive) e integración de aplicaciones (MS Office, GitHub, Trello,
    etc.). Se ha utilizado esta herramienta para las sesiones de control semanales.

    Fig. 2.7.: Plataforma de comunicación Microsoft Teams.

     3
         Se puede añadir la opción “--no-ff” para evitar que se ejecute un “fast-forward” y asegurarse de
          que se registran todos los cambios.

                                                                              2.7 Microsoft Teams           13
Entre las características que ofrece Microsoft Teams se han utilizado frecuentemente
      las funciones de chat entre el alumno y los tutores, las llamadas tanto de voz como
      videollamadas y el uso compartido de pantalla para poder mostrar en tiempo real la
      situación del proyecto y los avances en las tareas semanales.

      Se han programado en el calendario integrado de Teams las reuniones semanales y
      este calendario también ha ayudado a establecer otras reuniones puntuales gracias a
      la facilidad de creación e interacción con la aplicación para concretar el momento de
      disponibilidad de alumno y tutores.

      Otra característica que se ha utilizado bastante es la compartición segura de archivos,
      que se ha utilizado en combinación con el uso compartido de pantalla para realizar
      explicaciones y consultas. Además, como Microsoft Teams proporciona integración
      con Office 365, se ha podido potenciar la compartición de archivos en formato CSV
      a través de la herramienta Microsoft Excel online.

      En cuanto a la asignación de tareas, aunque Microsoft Teams dispone de un apartado
      dedicado para ello, se ha preferido utilizar la herramienta Trello, la cual se puede
      integrar con Microsoft Teams.

2.8 Trello

      Trello [Spo11] es un software de administración y organización de proyectos que utiliza
      tarjetas virtuales para organizar tareas y eventos. Se ha utilizado esta herramienta
      para la asignación de tareas, que se han ido actualizando en cada sesión de control
      semanal.

      El elemento principal de Trello se denomina “tablero”, el cual se divide en “columnas”
      que a su vez contienen “tarjetas” con las tareas a realizar. Las tarjetas pueden pasar
      de una columna a otra simplemente arrastrándolas con el ratón (o el dedo en la
      versión móvil).

      A cada tarjeta se le pueden asignar miembros, que serán los responsables de realizar
      la tarea o supervisarla, etiquetas personalizables identificadas por colores para indicar
      por ejemplo una temática o su grado de importancia, “checklists” con subtareas
      o pasos para realizar la tarea principal, fecha límite de finalización y adjuntar
      archivos.

 14        Capítulo 2 Fundamentos tecnológicos
Fig. 2.8.: Tablero de tareas de Trello con dos columnas.

A la hora de organizar el tablero, una configuración recomendable es dividirlo en las
siguientes columnas:

   • INFO: columna que contendrá tarjetas puramente informativas (no son tareas
     a realizar), por ejemplo, con la normativa del TFM, el calendario oficial del
     máster y otros documentos importantes para tener a mano. Esta columna es
     opcional.

   • TO DO: contiene las tarjetas con las tareas pendientes a realizar por el alumno.
     En cada sesión de control semanal se añadirán nuevas tarjetas.

   • IN PROGRESS: en esta columna se encuentran las tarjetas con las tareas que
     está llevando a cabo el alumno en ese momento.

   • READY TO VERIFY: aquí se pondrán las tarjetas cuyas tareas ha terminado
     de hacer el alumno pero que aún tienen que ser revisadas por los tutores.

   • DONE: en esta columna se encuentran las tarjetas con las tareas que han
     finalizado y han sido revisadas y aprobadas por los tutores.

                                                                       2.8 Trello       15
Situación actual                                                              3
     En este capítulo se realiza una revisión de los conceptos tratados en este trabajo,
     así como de aquellos trabajos o tecnologías que, por tener finalidades similares a las
     de este, pudiesen servir como base de discusión para el desarrollo de una solución al
     problema a resolver.

 3.1 Marco teórico

     En esta sección se explican los conceptos teóricos sobre el Web Scraping, tratando
     todos aquellos elementos que lo conforman o que están relacionados en mayor o
     menor medida.

3.1.1 Web Crawlers (Rastreadores Web)

     Los Web Crawlers o rastreadores web son herramientas informáticas que recopilan
     toda la información que contiene una página web de manera automática. Estos
     rastreadores web son uno de los componentes principales de los motores de búsqueda
     web, realizando las tareas de recopilación de datos para crear índices y así poder
     permitir a los usuarios realizar consultas para buscar información o páginas web.
     [ON10]

     Otro uso habitual es en el “Archivo de Internet” (Internet Archive) [Kah96], la
     biblioteca digital sin ánimo de lucro que recopila páginas web de manera periódica
     para la posteridad bajo licencias que permiten su distribución gratuita.

     También se utilizan para realizar minería de datos, con la finalidad de analizar
     páginas web con fines estadísticos, estudios de mercado o para detectar anomalías
     o infracciones. Un ejemplo muy conocido es “Attributor”, una empresa encargada
     de buscar infracciones de derechos de autor y marcas registradas (actualmente
     propiedad de Digimarc Corporation).

                                                                                              17
3.1.2 Web Scraping

       El Web Scraping (o raspado web) es una técnica que hace uso de Web Crawlers
       para extraer información de páginas web. Esta técnica simula la navegación de un
       usuario en Internet haciendo uso de los protocolos HTTP o de un navegador web
       automatizado.

       Tras obtener los datos de las páginas web en formato HTML, el Web Scraping los
       transforma de forma estructurada para ser almacenados y analizados posteriormente.
       Esta técnica se utiliza habitualmente para la comparación de precios de un producto
       o servicio en diversas tiendas online, detectar cambios en sitios webs o monitorizar
       datos para diversos propósitos, como por ejemplo, para mejorar el posicionamiento
       de un sitio web en la lista de resultados de buscadores de internet.

       El Web Scraping puede realizarse de diversas maneras, a continuación se detallan
       algunas de ellas:

         • Protocolo HTTP: se pueden obtener páginas webs estáticas y dinámicas
           completas realizando peticiones HTTP con el método GET (solo para obtener
           datos).

         • Parsers de HTML: se pueden utilizar languajes de consulta específicos para
           colecciones de datos como XQuery y con ello parsear documentos para obtener
           y transformar el contenido de documentos HTML de forma estructurada.

         • Uso de expresiones regulares: aunque no es el mejor método para parsear un
           documento HTML, puede utilizarse de forma complementaria.

         • Algoritmos de minería de datos: cuando las páginas web se generan dinámi-
           camente, es más difícil obtener los datos, por lo tanto hay que hacer uso de
           técnicas o herramientas más potentes para extraer el contenido.

         • Aplicaciones para Web Scraping: dedicadas específicamente para este cometido.
           Es habitual que estas aplicaciones muestren la página web objetivo para
           seleccionar los campos de forma interactiva y así ser más fácil de utilizar para
           el usuario, evitando hacer uso de código de programación.

3.1.3 Defensa y prevención contra el Web Scraping

       Existen diversas técnicas para que un sitio web pueda evitar que realicen Web
       Scraping sobre él entre las que cabe destacar:

  18       Capítulo 3 Situación actual
• Uso del “protocolo de la exclusión de robots” (robots.txt): es el método más
     sencillo para protegerse de bots que realizan Web Scraping u otro tipo de
     análisis web. Se trata de un fichero ‘robots.txt’ que contiene un conjunto de
     reglas para bloquear a los bots. En el fragmento de código Cód. 3.1 podemos
     ver en la primera regla definida a un User-Agent ‘AdsBot-Google’ que no
     puede rastrear el directorio ‘noadsgooglebot’ del sitio web ni ninguno de los
     subdirectorios contenidos en él. Como segunda regla está definido que el resto
     de User-Agents (*) pueden acceder a todos los directorios del sitio web (/).

Cód. 3.1: Ejemplo de un fichero ‘robots.txt’ con dos reglas definidas.
          # Group 1
          User-agent: AdsBot-Google
          Disallow: /noadsgooglebot/

          # Group 2
          User-agent: *
          Allow: /

   • Uso de cookies: con esto se comprueba que la petición se realiza en un navegador
     web.

   • Uso de CAPTCHA: ayudan a verificar que el usuario no es un bot. Existen
     distintos tipos, desde los más sencillos basados en introducir texto o en selec-
     cionar imágenes, a otros más sofisticados basados en el comportamiento del
     usuario (p.e. movimiento del ratón). Entre los más habituales cabe destacar:

         – CAPTCHAs textuales y/o auditivos: se muestra la imagen de un texto
           con caracteres alfanuméricos que el usuario tiene que introducir para
           poder continuar. El texto puede ser reproducido en audio si el usuario
           tiene dificultades para interpretarlo. A parte de texto simple, se le puede
           pedir al usuario que resuelva una sencilla operación matemática. En el
           sistema reCAPTCHA equivalen a la versión 1 (v1).

Fig. 3.1.: CAPTCHA textual (reCAPTCHA v1).

                                                                         3.1 Marco teórico   19
– CAPTCHAs visuales: muestra diversas imágenes y le solicita al usuario
               que haga click aquellas en las que se encuentre algo determinado (p.e.
               bicicletas, semáforos, paso de peatones, etc.). En el sistema reCAPTCHA
               equivalen a la versión 2 (v2).

     Fig. 3.2.: CAPTCHA visual (reCAPTCHA v2).

             – CAPTCHAs “no soy un robot”: también conocido como “no CAPTCHA”,
               es tan sencillo como hacer click en una casilla que dice “no soy un robot”,
               ya que la probabilidad de que un humano haga click en el centro de la
               casilla es muy baja, mientras que un bot hará siempre click en el centro.
               En el sistema reCAPTCHA equivalen a la versión 2+ (v2+).

     Fig. 3.3.: CAPTCHA “no soy un robot” (reCAPTCHA v2+).

20       Capítulo 3 Situación actual
– CAPTCHAs invisible: es el primer CAPTCHA con el que el usuario no
                tiene que interactuar explícitamente, ya que este CAPTCHA está oculto
                y se basa en el comportamiento del usuario. En el sistema reCAPTCHA
                equivalen a la versión 3 (v3).

      Fig. 3.4.: CAPTCHA invisible (reCAPTCHA v3).

        • Uso de JavaScript: los scrapers más sencillos no son capaces de procesar código
          JavaScript, por lo tanto la presentación de los datos de la página web puede
          ser generado por código JavaScript. Este método sin embargo cada vez es
          menos efectivo.

        • Limitar el número de peticiones: ya que una máquina es capaz de realizar un
          gran número de peticiones en pocos segundos y un humano no, es una buena
          estrategia limitar el número de peticiones por segundo.

        • Bloquear direcciones IP: si se detectan muchas peticiones seguidas desde la
          misma dirección IP, se puede añadir a una lista negra para evitar que realice
          más peticiones.

3.1.4 Legalidad del Web Scraping

      En España el Web Scraping es legal siempre que:

        • No se incurra en un delito contra la propiedad intelectual o competencia
          desleal.

        • Se practique dentro del marco de la Ley Orgánica de Protección de Datos y
          Garantía de Derechos Digitales (LOPDGDD) [Tab19]:

              – Los datos son de fuentes de acceso público.

              – Los datos se obtienen con fines de interés público general.

                                                                    3.1 Marco teórico       21
– Prevalece el interés del responsable del tratamiento sobre el derecho a la
                 protección de datos.

               – En caso de recabar datos sobre una persona, esta da su consentimiento.

         • No se produzca una violación de seguridad de un sitio web y no se dañe el
           servidor del sitio web por cualquier medio, influyendo en su rendimiento y/o
           funcionamiento.

       En el Espacio Económico Europeo (EEE) no hay ninguna ley que estipule si el Web
       Scraping es legal o ilegal. Sin embargo, ha habido sentencias judiciales de pleitos
       entre los propietarios de sitios web y los responsables de realizar Web Scraping sobre
       dicho sitio web en los que se hace referencia al Reglamento General de Protección
       de Datos (RGPD).

       El Reglamento General de Protección de Datos (RGPD) establece normas para la
       protección de la información personal que coinciden con las anteriormente citadas
       para España, ya que la Ley Orgánica de Protección de Datos y Garantía de Derechos
       Digitales (LOPDGDD) adapta el Derecho interno español al Reglamento General de
       Protección de Datos (RGPD). También establece que cualquier empresa, sin importar
       si están físicamente presentes en la Unión Europea, está sujeta al Reglamento General
       de Protección de Datos (RGPD) si los datos obtenidos son sobre sujetos europeos.

       Por último, hay que tener en cuenta los Términos y Condiciones del sitio web, en
       los que el titular puede incluir la prohibición expresa de realizar Web Scraping.

3.1.5 Consecuencias legales del Web Scraping

       Como se ha comentado anteriormente, no hay ninguna ley que regule directamente
       el Web Scraping, sin embargo si la acción de realizarlo incurre en otros delitos se
       aplicarán sus correspondientes sanciones.

       A continuación se repasan los artículos del Código Penal español que tratan estos
       delitos relacionados con el mal uso del Web Scraping.

       Si se produce un delito de suplantación de identidad sobre una persona física, el
       Artículo 197 del Código Penal español [BOE95a] dice:

  22       Capítulo 3 Situación actual
1. El que, para descubrir los secretos o vulnerar la intimidad de otro, sin su
      consentimiento, se apodere de sus papeles, cartas, mensajes de correo elec-
      trónico o cualesquiera otros documentos o efectos personales, intercepte sus
      telecomunicaciones o utilice artificios técnicos de escucha, transmisión, graba-
      ción o reproducción del sonido o de la imagen, o de cualquier otra señal de
      comunicación, será castigado con las penas de prisión de uno a cuatro años y
      multa de doce a veinticuatro meses.

   2. Las mismas penas se impondrán al que, sin estar autorizado, se apodere, utilice
      o modifique, en perjuicio de tercero, datos reservados de carácter personal o
      familiar de otro que se hallen registrados en ficheros o soportes informáticos,
      electrónicos o telemáticos, o en cualquier otro tipo de archivo o registro público
      o privado. Iguales penas se impondrán a quien, sin estar autorizado, acceda
      por cualquier medio a los mismos y a quien los altere o utilice en perjuicio del
      titular de los datos o de un tercero.

   3. Se impondrá la pena de prisión de dos a cinco años si se difunden, revelan o
      ceden a terceros los datos o hechos descubiertos o las imágenes captadas a que
      se refieren los números anteriores.

De cometerse delitos contra la propiedad intelectual, el Artículo 270.1 del Código
Penal español [BOE95b] dice: “Será castigado con la pena de prisión de seis meses
a cuatro años y multa de doce a veinticuatro meses el que, con ánimo de obtener
un beneficio económico directo o indirecto y en perjuicio de tercero, reproduzca,
plagie, distribuya, comunique públicamente o de cualquier otro modo explote econó-
micamente, en todo o en parte, una obra o prestación literaria, artística o científica,
o su transformación, interpretación o ejecución artística fijada en cualquier tipo
de soporte o comunicada a través de cualquier medio, sin la autorización de los ti-
tulares de los correspondientes derechos de propiedad intelectual o de sus cesionarios”.

En el caso de producirse un delito de daños contra la propiedad (p.e. denegación de
servicio a un sitio web), el Artículo 264 bis del Código Penal español [BOE95c] dice:
“Será castigado con la pena de prisión de seis meses a tres años el que, sin estar
autorizado y de manera grave, obstaculizara o interrumpiera el funcionamiento de
un sistema informático ajeno”.

En cuanto a los delitos relativos al mercado y a los consumidores, si se producen
delitos de espionaje empresarial, el Artículo 278.1 del Código Penal español [BOE95d]

                                                                  3.1 Marco teórico        23
dice: “El que, para descubrir un secreto de empresa se apoderare por cualquier
       medio de datos, documentos escritos o electrónicos, soportes informáticos u otros
       objetos que se refieran al mismo, o empleare alguno de los medios o instrumentos
       señalados en el apartado 1 del artículo 1971 , será castigado con la pena de prisión
       de dos a cuatro años y multa de doce a veinticuatro meses”.

3.1.6 Data Mining (Minería de Datos)

       La minería de datos surgió de la necesidad de manejar y comprender una gran
       cantidad de datos para poder utilizarlos con la finalidad de mejorar y hacer crecer
       a las empresas para alcanzar sus objetivos y proporcionar mejores servicios a sus
       clientes.

       Utiliza distintas técnicas y herramientas para explotar grandes bases de datos de
       manera automática, en busca de patrones o reglas que de alguna forma expliquen el
       comportamiento de los datos recopilados a través del tiempo. Es habitual es uso de
       la Inteligencia Artificial y redes neuronales que ayudan a que las tareas de búsqueda
       sean más eficientes, eficaces y rápidas.

       En la minería de datos no basta con recopilar miles de datos, es necesario saber
       transformar estos datos y convertirlos en información que pueda ser relevante para
       la empresa y le ayuden a obtener soluciones. Para ello, la minería de datos debe
       seguir los siguientes pasos:

             1. Establecer objetivos claros: el cliente establece los objetivos que desea alcanzar.

             2. Procesar eficazmente los datos: seleccionar, obtener, estructurar, limpiar y
                transformar los datos obtenidos.

             3. Determinar el modelo: tras realizar un análisis estadístico de los datos, decidir
                cual es el modelo a aplicar en función de dichos datos.

             4. Analizar los resultados: verificar la validez y coherencia de los resultados y la
                información obtenida.
        1
            “[...] artificios técnicos de escucha, transmisión, grabación o reproducción del sonido o de la imagen,
             o de cualquier otra señal de comunicación”

  24           Capítulo 3 Situación actual
3.2 Tecnologías base

      En esta sección se tratan tecnologías que están relacionadas con el Web Scraping o
      que tienen un comportamiento similar en cuanto a protocolos o finalidad, que es la
      de obtener información.

3.2.1 Herramientas de línea de comandos: Wget y cURL

      Wget [Cow96] es una herramienta de software libre que permite la descarga de
      contenidos a través de los protocolos HTTP, HTTPS y FTP.

      cURL [Ste98] es una herramienta de código abierto que se utiliza por línea de
      comandos o scripts para la transferencia de datos. Soporta diversos protocolos (FTP,
      HTTP, HTTPS, IMAP, POP3, SMTP, etc.) y certificados SSL. Esta herramienta
      es mucho más completa que Wget, ya que soporta más protocolos y puede realizar
      transferencia de datos de forma bidireccional, no solo para descarga.

      Tanto Wget como cURL por si solas son ineficaces para el Web Scraping, ya que no
      son Web Crawlers como tal, por lo que serán detectadas y dejarán de funcionar si
      se utilizan de forma repetida.

3.2.2 Librerías para Python: Requests, Scrapy, Selenium y
      Beautiful Soup

      Requests [Rei11] y Scrapy [dev08] son dos librerías de Python que permiten realizar
      peticiones HTTP para obtener datos de páginas web (ver apartados 2.2 y 2.3). Al
      igual que Wget y cURL, Request utilizada por si sola será ineficaz para el Web
      Scraping.

      Selenium [Hug04] destaca por disponer de un entorno de desarrollo integrado (IDE)
      que permite ejecutar pruebas automatizadas en un navegador web. También dispone
      de un WebDriver que puede ser utilizado con diversos lenguajes de programación
      (entre ellos Python) para simular el comportamiento de un usuario en un navegador
      web y con ello realizar Web Scraping en páginas web dinámicas gracias a las múltiples
      opciones de interacción con la página a analizar.

      Beautiful Soup [Ric04] es un parser de documentos HTML. Analiza este tipo de
      documentos y genera un árbol con todos los elementos que contiene para de esta
      forma extraer datos de páginas web.

                                                                  3.2 Tecnologías base        25
Estas herramientas disponen de equivalentes o similares en otros lenguajes de
       programación. Por ejemplo en el caso del WebDriver de Selenium tambien es
       compatible con Java, Perl o Ruby entre otros. O en el caso de Beautiful Soup existe
       su equivalente en Java, JSoup.

 3.3 Trabajos relacionados

       En esta sección se analizan los productos o tecnologías existentes en el mercado cuya
       función es la misma (o similar) que la que se pretende desarrollar, el Web Scraping
       a sitios web.

3.3.1 ParseHub

       ParseHub [FPT15] es una herramienta de Web Scraping creada en Canadá en el
       año 2015. Es una herramienta freemium2 que permite analizar hasta 200 páginas
       por ejecución y almacena los datos obtenidos durante un máximo de 14 días. Este
       servicio se puede mejorar con planes de pago (ver Fig. 3.5).

       Fig. 3.5.: Planes de pago de ParseHub.

       El uso de esta herramienta está enfocado al análisis industrial y marketing, extrayendo
       datos de todo tipo de páginas web para obtener información de productos, noticias o
       perfiles de redes sociales y con ello mejorar la competencia comercial de la empresa.
        2
            Modelo de negocio que ofrece los servicios básicos de forma gratuita y permite acceder a otros
             servicios de pago que proporcionan más funcionalidades.

  26           Capítulo 3 Situación actual
Dispone de una aplicación de escritorio de fácil uso en la que solo es necesario
     añadir los enlaces de las páginas web a analizar o realizar las búsquedas en la propia
     aplicación, y además ofrece una API REST que permite a desarrolladores crear
     aplicaciones web propias.

     Fig. 3.6.: Uso de ParseHub sobre un comercio electrónico.

3.3.2 Webhose.io

     Webhose [MG16] es una herramienta de Web Scraping creada en Israel en el año
     2016. Se caracteriza por monitorizar tanto las páginas de uso cotidiano como las de
     la Deep Web y Dark Web a través de sus correspondientes planes de pago (ver Fig.
     3.7).

     Fig. 3.7.: Planes de pago de Webhose.

                                                                 3.3 Trabajos relacionados    27
Dispone de APIs individuales según el tipo de páginas que se quieran analizar:
       noticias, blogs, redes sociales, Dark Web o detección de brechas de seguridad. De esta
       forma abarca distintos sectores de la industria de la información: análisis financiero,
       ciberseguridad, investigación de mercado, machine learning y monitorización de
       medios.

3.3.3 Octoparse

       Octoparse [HL16] es una herramienta de Web Scraping creada en San Francisco
       (EE.UU.) en 2016. Al igual que ParseHub es una herramienta freemium limitada a
       10.000 registros por exportación y hasta un máximo de 10 Crawlers. El API solo es
       accesible a través de los planes de pago, los cuales se detallan a continuación:

         • Plan Estándar:

               – Precio: 89 dólares/mes.

               – Exportaciones ilimitadas.

               – 100 Crawlers.

               – 6 extracciones simultáneas en la Nube.

               – Extracción de velocidad media.

               – Rotación automática de IP.

               – Acceso al API.

         • Plan Profesional:

               – Precio: 249 dólares/mes.

               – Exportaciones ilimitadas.

               – 250 Crawlers.

               – 20 extracciones simultáneas en la Nube.

               – Extracción de alta velocidad.

               – Rotación automática de IP.

               – Acceso avanzado al API.

               – Prioridad en el soporte técnico.

  28       Capítulo 3 Situación actual
También puede leer