La World Wide Web está compuesta por muchos millones de do­cu­me­n­tos enlazados entre sí, conocidos también como páginas web. El texto fuente de las páginas web está escrito en el lenguaje Hypertext Markup Language (HTML). Los códigos fuente en HTML son una mezcla de in­fo­r­ma­cio­nes legibles para los humanos y códigos legibles para las máquinas, llamados tags o etiquetas. El navegador, como puede ser Chrome, Firefox, Safari o Edge, procesa el texto fuente, in­te­r­pre­ta las etiquetas y presenta al usuario la in­fo­r­ma­ción que contienen.

Para extraer del texto fuente úni­ca­me­n­te la in­fo­r­ma­ción que le interesa al usuario, se utiliza un tipo software especial. Se trata de los programas llamados web scrapers, crawlers, spiders o, si­m­ple­me­n­te, bots, que examinan el texto fuente de las páginas en busca de patrones concretos y extraen la in­fo­r­ma­ción que contienen. Los datos co­n­se­gui­dos mediante web scraping po­s­te­rio­r­me­n­te se resumen, combinan, evalúan o almacenan para ser usados más adelante.

En este artículo te contamos por qué el lenguaje Python resulta es­pe­cia­l­me­n­te útil para la creación de web scrapers y te pre­se­n­ta­mos una in­tro­du­c­ción a este tema junto con un práctico tutorial.

Tu página web con dominio propio
Crea tu página web en minutos
  • Pla­n­ti­llas pro­fe­sio­na­les
  • Mo­di­fi­ca­ción del diseño con un solo clic
  • Dominio, SSL y correo ele­c­tró­ni­co

¿Por qué usar pre­ci­sa­me­n­te Python para web scraping?

Python, el popular lenguaje de pro­gra­ma­ción se presta es­pe­cia­l­me­n­te bien para la creación de programas de web scraping. Puesto que las páginas web han de ser co­n­s­ta­n­te­me­n­te mo­di­fi­ca­das y ac­tua­li­za­das, sus co­n­te­ni­dos cambian con el tiempo. Puede que cambie su diseño, por ejemplo, o que se les añadan nuevos elementos. Los web scrapers se de­sa­rro­llan teniendo en cuenta la es­tru­c­tu­ra es­pe­cí­fi­ca de una página web, de forma que, si dicha es­tru­c­tu­ra cambia, el scraper también debe mo­di­fi­car­se. Este proceso resulta es­pe­cia­l­me­n­te sencillo con Python.

Asimismo, Python tiene como puntos fuertes el pro­ce­sa­mie­n­to de texto y la apertura de recursos web, dos de las bases técnicas del web scraping. Python es, además, un estándar co­n­so­li­da­do en materia de análisis y pro­ce­sa­mie­n­to de datos. Por si esto fuera poco, Python ofrece un amplísimo eco­si­s­te­ma de pro­gra­ma­ción, que cuenta con bi­blio­te­cas, proyectos de código abierto, do­cu­me­n­ta­ción y re­fe­re­n­cias ex­pli­ca­ti­vas del lenguaje, así como entradas de foros, informes de error y artículos de blog.

Más co­n­cre­ta­me­n­te, existen varias he­rra­mie­n­tas co­n­so­li­da­das diseñadas para hacer web scraping con Python. Te pre­se­n­ta­mos tres de las más conocidas: Scrapy, Selenium y Beau­ti­fu­l­Soup. Si quieres empezar a practicar, puedes echarle un vistazo a nuestro tutorial de web scraping con Python, en el que uti­li­za­mos Beau­ti­fu­l­Soup, que te ayudará a entender el proceso de scraping.

Web scraping en términos generales

El esquema básico del web scraping es sencillo de explicar. En primer lugar, el de­sa­rro­lla­dor del scraper analiza el texto fuente en HTML de la página web en cuestión. Por lo general, en­co­n­tra­rá patrones claros que pe­r­mi­ti­rán extraer la in­fo­r­ma­ción deseada. El scraper será entonces pro­gra­ma­do para ide­n­ti­fi­car dichos patrones y realizará el resto del trabajo au­to­má­ti­ca­me­n­te:

  1. Abrir la página web a través del URL
  2. Extraer au­to­má­ti­ca­me­n­te los datos es­tru­c­tu­ra­dos a partir de los patrones
  3. Resumir, almacenar, evaluar o combinar los datos extraídos, entre otras acciones

Casos de apli­ca­ción del web scraping

El web scraping puede tener apli­ca­cio­nes muy diversas. Además de para la in­de­xa­ción de bu­s­ca­do­res, el web scraping también puede usarse con los si­guie­n­tes fines, entre muchos otros:

  • Crear bases de datos de contactos
  • Controlar y comparar ofertas online
  • Reunir datos de diversas fuentes online
  • Observar la evolución de la presencia y la repu­tación online
  • Reunir datos fi­na­n­cie­ros, me­teo­ro­ló­gi­cos o de otro tipo
  • Observar cambios en el contenido de páginas web
  • Reunir datos con fines de in­ve­s­ti­ga­ción
  • Realizar ex­plo­ra­cio­nes de datos o data mining

Un ejemplo sencillo de web scraping

Imagina una página web de venta coches de segunda mano que muestre, al abrirla en el navegador, una lista de los coches di­s­po­ni­bles. El texto fuente de este ejemplo podría ser el de la entrada de uno de los coches:

raw_html = """
<h1>Coche de segunda mano en venta</h1>
<ul class="cars-listing">
    <li class="car-listing">
        <div class="car-title">
            Volkswagen Escarabajo
        </div>
        <div class="car-description">
            <span class="car-make">Volkswagen</span>
            <span class="car-model">Escarabajo</span>
            <span class="car-build">1973</span>
        </div>
        <div class="sales-price">
            € <span class="car-price">14.998,—</span>
        </div>  
    </li>    
</ul>    
 """

Un web scraper podría, por ejemplo, examinar la lista online de coches en venta y, según la intención con la que haya sido creado, buscar un modelo concreto. En nuestro ejemplo, se trata de un Vo­l­k­s­wa­gen Es­ca­ra­ba­jo. En el texto fuente, la marca y el modelo del coche están indicados con las clases CSS car-make y car-model, re­s­pe­c­ti­va­me­n­te. Gracias a los nombres de las clases, los datos buscados pueden extraerse o scra­pear­se fá­ci­l­me­n­te. A co­n­ti­nua­ción, pre­se­n­ta­mos el ejemplo de scraping co­rre­s­po­n­die­n­te con Beau­ti­fu­l­Soup:

# Analizar sintácticamente el texto fuente HTML guardado en raw_html
html = BeautifulSoup(raw_html, 'html.parser')
# Extraer el contenido de la etiqueta con la clase 'car-title' 
car_title = html.find(class_ = 'car-title').text.strip()
# Si el coche en cuestión resulta ser un Volkswagen Escarabajo
if (car_title == 'Volkswagen Escarabajo'):
    # Subir del título del coche a la siguiente etiqueta de elemento de lista <li></li>
    html.find_parent('li')
    
    # Determinar el precio del coche
    car_price = html.find(class_ = 'sales-price').text.strip()
    
    # Mostrar el precio del coche
    print(car_price)

Riesgos legales del web scraping

Las técnicas de web scraping pueden ser de gran utilidad, pero no siempre están libres de riesgos legales. Puesto que el operador de la web la ha diseñado con usuarios humanos en mente, su apertura au­to­má­ti­ca mediante un web scraper puede suponer un in­cu­m­pli­mie­n­to de las co­n­di­cio­nes de uso. Estas acciones se vuelven es­pe­cia­l­me­n­te re­le­va­n­tes cuando se accede a grandes volúmenes de in­fo­r­ma­ción pro­ce­de­n­te de varias páginas al mismo tiempo o en sucesión rápida, de un modo en el que una persona nunca sería capaz de in­ter­ac­tuar con la página.

Si se realizan de forma au­to­má­ti­ca, la apertura, el al­ma­ce­na­mie­n­to y la eva­lua­ción de los datos pu­bli­ca­dos en una página web podrían infringir los derechos de propiedad in­te­le­c­tual. Además, si los datos obtenidos son de carácter personal, al­ma­ce­nar­los y ana­li­zar­los sin la au­to­ri­za­ción de las personas afectadas infringe la normativa vigente de pro­te­c­ción de datos. Por esta razón, no está permitido, por ejemplo, scrapear perfiles de Facebook para obtener datos pe­r­so­na­les.

Nota

Las in­fra­c­cio­nes en materia de pro­te­c­ción de datos y de propiedad in­te­le­c­tual están penadas con multas im­po­r­ta­n­tes. Asegúrate, por lo tanto, de actuar dentro de la legalidad siempre que utilices técnicas de web scraping. Si te topases con barreras técnicas de seguridad, no trates de eludirlas en ningún caso.

Li­mi­ta­cio­nes técnicas del web scraping

Para los ope­ra­do­res de las páginas web suele ser ventajoso limitar las po­si­bi­li­da­des de scraping au­to­má­ti­co en su contenido online. Por un lado, porque el acceso masivo a la web que realizan los scrapers puede pe­r­ju­di­car el re­n­di­mie­n­to del sitio y, por otro, porque suele haber secciones internas de la web que no deberían mostrarse en los re­su­l­ta­dos de búsqueda.

Para limitar el acceso a los scrapers, se ha extendido el uso del estándar robots.txt. Se trata de un archivo de texto que los ope­ra­do­res web ubican en el di­re­c­to­rio principal de la página web. En él hay entradas es­pe­cia­les que es­ta­ble­cen qué scrapers o bots están au­to­ri­za­dos a acceder a qué áreas de la web. Las entradas del archivo robots.txt siempre se aplican a un dominio entero.

A co­n­ti­nua­ción, mostramos un ejemplo del contenido de un archivo robots.txt que prohíbe el scraping mediante cualquier tipo de bot en todo el sitio:

# Cualquier bot
User-agent: *
# Excluir todo el directorio principal
Disallow: /

El archivo robots.txt solo actúa como medida de seguridad ya que invita a una li­mi­ta­ción vo­lu­n­ta­ria por parte de los bots, que deberían adherirse a las prohi­bi­cio­nes del archivo. A nivel técnico, sin embargo, no supone ningún obstáculo. Por ello, para controlar de forma efectiva el acceso mediante web scrapers, los ope­ra­do­res web im­ple­me­n­tan también técnicas más agresivas. Una de ellas es, por ejemplo, limitar el re­n­di­mie­n­to; otra es bloquear la dirección IP del scraper tras varios intentos de acceso que infrinjan las normas de la web.

Las API como al­te­r­na­ti­va al web scraping

A pesar de su efe­c­ti­vi­dad, el web scraping no es el mejor método para obtener datos de páginas web. De hecho, a menudo existe una al­te­r­na­ti­va mejor: muchos ope­ra­do­res web ponen publican los datos de forma es­tru­c­tu­ra­da y en un formato legible para las máquinas. Para acceder a este tipo de datos se usan in­te­r­fa­ces de pro­gra­ma­ción es­pe­cia­les llamadas Ap­pli­ca­tion Pro­gra­m­mi­ng In­te­r­fa­ces (in­te­r­fa­ces de pro­gra­ma­ción de apli­ca­cio­nes, API por sus siglas en inglés).

El uso de una API ofrece im­po­r­ta­n­tes ventajas:

  • El pro­pie­ta­rio de la web crea la API pre­ci­sa­me­n­te para permitir el acceso a los datos. De esta forma se reduce el riesgo de in­fra­c­cio­nes y el operador web puede regular mejor el acceso a los datos. Una manera de hacerlo es, por ejemplo, so­li­ci­ta­n­do una clave API para acceder a ellos. Este método también permite al operador regular de forma más precisa las li­mi­ta­cio­nes del re­n­di­mie­n­to.
  • La API presenta los datos di­re­c­ta­me­n­te en un formato legible para las máquinas. Con ello, ya no es necesaria la laboriosa tarea de extraer los datos del texto fuente. Además, la es­tru­c­tu­ra de los datos se separa de su re­pre­se­n­ta­ción visual, por lo que se mantiene sin importar si cambia el diseño de la web.

Siempre que haya una API di­s­po­ni­ble y que ofrezca datos completos, este será el mejor método para acceder a la in­fo­r­ma­ción, sin olvidar que mediante el web scraping pueden extraerse, en principio, todos los textos que una persona podría leer en una página web.

He­rra­mie­n­tas de scraping para Python

El eco­si­s­te­ma Python incluye diversas he­rra­mie­n­tas co­n­so­li­da­das para realizar proyectos de scraping:

  • Scrapy
  • Selenium
  • Beau­ti­fu­l­Soup

A co­n­ti­nua­ción, te pre­se­n­ta­mos las ventajas e in­co­n­ve­nie­n­tes de cada una de estas te­c­no­lo­gías.

Web scraping con Scrapy

Scrapy, una de las he­rra­mie­n­tas para hacer web scraping con Python que pre­se­n­ta­mos, utiliza un ana­li­za­dor si­n­tá­c­ti­co o parser HTML para extraer datos del texto fuente (en HTML) de la web siguiendo este esquema:

URL → Solicitud HTTP → HTML → Scrapy

El concepto clave del de­sa­rro­llo de scrapers con Scrapy son los llamados web spiders, programas de scraping sencillos y basados en Scrapy. Cada spider (araña) está pro­gra­ma­do para scrapear una web concreta y va de­s­co­l­gá­n­do­se de página a página. La pro­gra­ma­ción usada está orientada a objetos: cada spider es una clase de Python propia.

Además del paquete de Python en sí, la in­s­ta­la­ción de Scrapy incluye una he­rra­mie­n­ta de línea de comandos, la Scrapy Shell, que permite controlar los spiders. Además, los spiders ya creados pueden al­ma­ce­nar­se en la Scrapy Cloud. Desde allí, se ejecutan con tiempos es­ta­ble­ci­dos. De esta forma pueden scra­pear­se también sitios web complejos sin necesidad de utilizar para ello el propio ordenador ni la propia conexión a Internet. Otra manera de hacerlo es crear un servidor de web scraping propio usando el software de código abierto Scrapyd.

Scrapy es una pla­ta­fo­r­ma co­n­so­li­da­da para aplicar técnicas de web scraping con Python. Su ar­qui­te­c­tu­ra está orientada a las ne­ce­si­da­des de proyectos pro­fe­sio­na­les. Scrapy cuenta, por ejemplo, con una tubería o pipeline integrada para procesar los datos extraídos. La apertura de las páginas en Scrapy se produce de forma asíncrona, es decir, con la po­si­bi­li­dad de descargar varias páginas si­mu­l­tá­nea­me­n­te. Por ello, Scrapy es una buena opción para proyectos de scraping que hayan de procesar de grandes volúmenes de páginas.

Web scraping con Selenium

El software libre Selenium es un framework para realizar test au­to­ma­ti­za­dos de software a apli­ca­cio­nes web. En principio, fue de­sa­rro­lla­do para poner a prueba páginas y apps web, pero el WebDriver de Selenium también puede usarse con Python para realizar scraping. Si bien Selenium en sí no está escrito en Python, con este lenguaje de pro­gra­ma­ción es posible acceder a las funciones del software.

A di­fe­re­n­cia de Scrapy y de Beau­ti­fu­l­Soup, Selenium no trabaja con el texto fuente en HTML de la web en cuestión, sino que carga la página en un navegador sin interfaz de usuario. El navegador in­te­r­pre­ta entonces el código fuente de la página y crea, a partir de él, un Document Object Model (modelo de objetos de documento o DOM). Esta interfaz es­ta­n­da­ri­za­da permite poner a prueba las in­ter­ac­cio­nes de los usuarios. De esta forma se consigue, por ejemplo, simular clics y rellenar fo­r­mu­la­rios au­to­má­ti­ca­me­n­te. Los cambios en la web que resultan de dichas acciones se reflejan en el DOM. La es­tru­c­tu­ra del proceso de web scraping con Selenium es la siguiente:

URL → Solicitud HTTP → HTML → Selenium → DOM

Puesto que el DOM se genera de manera dinámica, Selenium permite scrapear también páginas cuyo contenido ha sido generado mediante Ja­va­S­cri­pt. El acceso a co­n­te­ni­dos dinámicos es la ventaja más im­po­r­ta­n­te de Selenium. En términos prácticos, Selenium también puede usarse en co­m­bi­na­ción con Scrapy o con Beau­ti­fu­l­Soup: Selenium pro­po­r­cio­na­ría el texto fuente, mientras que la segunda he­rra­mie­n­ta se en­ca­r­ga­ría del análisis si­n­tá­c­ti­co y la eva­lua­ción de los datos. En este caso, el esquema que se seguiría tendría esta forma:

URL → Solicitud HTTP → HTML → Selenium → DOM → HTML → Scrapy / Beau­ti­fu­l­Soup

Web scraping con Beau­ti­fu­l­Soup

De las tres he­rra­mie­n­tas que pre­se­n­ta­mos para realizar web scraping con Python, Beau­ti­fu­l­Soup es la más antigua. Al igual que en el caso de Scrapy, se trata de un parser o ana­li­za­dor si­n­tá­c­ti­co HTML. El web scraping con Beau­ti­fu­l­Soup tiene la siguiente es­tru­c­tu­ra:

URL → Solicitud HTTP → HTML → Beau­ti­fu­l­Soup

Sin embargo, a di­fe­re­n­cia de Scrapy, en Beau­ti­fu­l­Soup el de­sa­rro­llo del scraper no requiere una pro­gra­ma­ción orientada a objetos, sino que el scraper se redacta como una sencilla secuencia de comandos o script. Con ello, Beau­ti­fu­l­Soup ofrece el método más fácil para pescar in­fo­r­ma­ción de la sopa de tags a la que hace honor su nombre.

Co­m­pa­ra­ción de las he­rra­mie­n­tas de web scraping con Python

Cada una de las tres he­rra­mie­n­tas pre­se­n­ta­das tiene sus ventajas e in­co­n­ve­nie­n­tes, que hemos resumido en la siguiente tabla:

Scrapy Selenium Beau­ti­fu­l­Soup
Facilidad de apre­n­di­za­je y manejo ++ + +++
Lectura de co­n­te­ni­dos dinámicos ++ +++ +
Rea­li­za­ción de apli­ca­cio­nes complejas +++ + ++
Robustez frente a fallos HTML ++ + +++
Op­ti­mi­za­ción del re­n­di­mie­n­to del scraping +++ + +
Calidad del eco­si­s­te­ma +++ + ++
En resumen

¿Qué he­rra­mie­n­ta deberías elegir para tu proyecto? En resumen: escoge Beau­ti­fu­l­Soup si necesitas un de­sa­rro­llo rápido o si quieres fa­mi­lia­ri­zar­te primero con los conceptos de Python y de web scraping. Scrapy, por su parte, te permite realizar complejas apli­ca­cio­nes de web scraping en Python si dispones de los co­no­ci­mie­n­tos ne­ce­sa­rios. Selenium será tu mejor opción si tu prioridad es extraer co­n­te­ni­dos dinámicos con Python.

Web scraping con Python y Beau­ti­fu­l­Soup – Tutorial

Aquí te mostramos cómo extraer datos de una página web usando Beau­ti­fu­l­Soup. El primer paso será instalar Python y algunas he­rra­mie­n­tas que te serán de ayuda. Ne­ce­si­ta­rás:

  • Python a partir de la versión 3.4
  • El gestor de paquetes pip para Python
  • El módulo venv

Para instalar Python, sigue las in­s­tru­c­cio­nes de in­s­ta­la­ción de su página web.

Una vez hayas instalado en tu sistema el gestor de paquetes libre Homebrew, podrás instalar Python usando el siguiente comando:

brew install python
Nota

Las ex­pli­ca­cio­nes y los ejemplos de código que pre­se­n­ta­mos a co­n­ti­nua­ción se refieren a Python 3 en macOS. El código, en teoría, debería funcionar también en otros sistemas ope­ra­ti­vos, pero puede que requiera ciertas mo­di­fi­ca­cio­nes, es­pe­cia­l­me­n­te si se trata de Windows.

Co­n­fi­gu­rar el proyecto de web scraping con Python en tu propio ordenador

Para nuestro tutorial de Python queremos ubicar la carpeta de proyecto web Scraper en el es­cri­to­rio. Para ello, abrimos en primer lugar la interfaz de línea de comandos (Terminal.App en Mac), copiamos las si­guie­n­tes líneas de código en ella y las eje­cu­ta­mos:

# Cambiar a la carpeta de escritorio
cd ~/Desktop/
# Crear directorio de proyecto
mkdir ./web Scraper/ && cd ./web Scraper/
# Crear entorno virtual
# Se encarga, entre otras cosas, de que posteriormente se use pip3
python3 -m venv ./env
# Activar entorno virtual
source ./env/bin/activate
# Instalar paquetes
pip install requests
pip install beautifulsoup4

Extraer citas y autores con Python y Beau­ti­fu­l­Soup

La página web Quotes to Scrape ofrece toda una colección de citas de pe­r­so­na­jes famosos pensadas es­pe­cia­l­me­n­te para ser objeto de test de scraping, para que no tengas que preo­cu­par­te por incumplir las co­n­di­cio­nes de uso.

Po­n­gá­mo­nos manos a la obra. Abre la interfaz de línea de comandos (Terminal.App en Mac) e inicia el in­té­r­pre­te de Python desde la carpeta de proyecto web Scraper. Para ello, copia las si­guie­n­tes líneas de código en la interfaz y eje­cú­ta­las:

# Ir al directorio de proyecto
cd ~/Desktop/web Scraper/
# Activar entorno virtual
source ./env/bin/activate
# Iniciar el intérprete de Python
# Puesto que nos encontramos en el entorno virtual, se usa python3
python

Ahora, copia el siguiente código y pégalo en el in­té­r­pre­te de Python, en la interfaz de línea de comandos. Pulsa luego Intro (varias veces, si es necesario) para eje­cu­tar­lo. También puedes guardar el código como archivo con el nombre de scrape_quotes.py en la carpeta de proyecto web Scraper. Si lo haces, podrás ejecutar el script de Python con el comando python scrape_quotes.py.

Como resultado final tras la ejecución del código, en tu carpeta de proyecto web Scraper debería haber un archivo llamado zitate.csv. Este archivo contiene una tabla con las citas y los autores y puedes abrirlo con el programa de hoja de cálculo que desees.

# Importar módulos
import requests
import csv
from bs4 import BeautifulSoup
# Dirección de la página web
url = "http://quotes.toscrape.com/"
# Ejecutar GET-Request
response = requests.get(url)
# Analizar sintácticamente el archivo HTML de BeautifulSoup del texto fuente
html = BeautifulSoup(response.text, 'html.parser')
# Extraer todas las citas y autores del archivo HTML
quotes_html = html.find_all('span', class_="text")
authors_html = html.find_all('small', class_="author")
# Crear una lista de las citas
quotes = list()
for quote in quotes_html:
    quotes.append(quote.text)
# Crear una lista de los autores
authors = list()
for author in authors_html:
    authors.append(author.text) 
# Para hacer el test: combinar y mostrar las entradas de ambas listas
for t in zip(quotes, authors):
print(t)
# Guardar las citas y los autores en un archivo CSV en el directorio actual
# Abrir el archivo con Excel / LibreOffice, etc.
with open('./zitate.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file, dialect='excel')
    csv_writer.writerows(zip(quotes, authors))

Usar paquetes de Python para hacer scraping

No hay dos proyectos de web scraping iguales. A veces solo se quiere comprobar si ha habido cambios en una página y a veces se quieren llevar a cabo eva­lua­cio­nes complejas, entre otras opciiones. Python pone a tu alcance una amplia gama de paquetes entre los que elegir:

  1. Instalar paquetes en la interfaz de línea de comandos con pip3
pip3 install <package></package>
  1. Integrar módulos dentro de los scripts de Python con import
from <package> import <module></module></package>

Estos son algunos de los paquetes más usados en proyectos de web scraping:

Paquete Finalidad
venv Gestionar el entorno virtual del proyecto
request Abrir una página web
lxml Usar ana­li­za­do­res si­n­tá­c­ti­cos al­te­r­na­ti­vos para HTML y XML
csv Leer y escribir datos en tablas en formato CSV
pandas Procesar y evaluar datos
scrapy Utilizar Scrapy
selenium Utilizar Selenium WebDriver
Consejo

Utiliza el Índice de paquetes de Python (PyPI) para ver todos los paquetes di­s­po­ni­bles.

Por favor, ten en cuenta el aviso legal relativo a este artículo.

Ir al menú principal