Volver al blog
Guías
Raluca PenciucLast updated on Apr 28, 202616 min read

Web Scraping con Python: La Guía Definitiva para Construir tu Scraper

Web Scraping con Python: La Guía Definitiva para Construir tu Scraper

Si en el siglo XX nos regíamos por la mentalidad de que «el tiempo es dinero», ahora todo gira en torno a los datos. Más datos significan más información, lo que se traduce en mejores decisiones y, por ende, más dinero.

El web scraping y los web scrapers han ganado enormemente en popularidad, especialmente en la última década. Cada vez más empresas necesitan una estrategia de marketing precisa, lo que implica obtener grandes cantidades de información en poco tiempo.

Con el nuevo interés que suscita la extracción de datos, las empresas están empezando a ver formas en las que pueden beneficiarse. Para los desarrolladores, podría ser una buena forma de impulsar su negocio o simplemente un proyecto interesante para perfeccionar sus habilidades de programación.

Aunque tu trabajo no tenga nada que ver con el web scraping, pero seas un desarrollador de Python, al final de este artículo descubrirás un nuevo nicho en el que podrás sacar mucho partido a tus habilidades. Veremos cómo podemos crear nuestro propio web scraping con Python.

Entender el web scraping con Python

Pero primero, ¿qué significa el web scraping? En su nivel más básico, un web scraper extrae los datos de un sitio web, siempre que no todos ofrezcan sus datos a través de una API pública.

Este proceso es más útil de lo que parece si se tiene en cuenta que cuanta más información se tenga, mejores decisiones se tomarán en el negocio.

Hoy en día, los sitios web tienen cada vez más contenido, por lo que realizar este proceso totalmente a mano dista mucho de ser una buena idea. Ahí es donde entra en juego la creación de una herramienta automatizada para el scraping.

«¿Para qué necesito los datos?», se preguntará. Bueno, echemos un vistazo a algunos de los principales casos de uso en los que el web scraping es un salvavidas:

  • Inteligencia de precios: una empresa de comercio electrónico necesitará información sobre los precios de la competencia para tomar mejores decisiones de precios y marketing.
  • Estudio de mercado: el análisis de mercado implica información de alta calidad, gran volumen y gran profundidad.
  • Sector inmobiliario: tanto particulares como empresas necesitan recopilar ofertas de múltiples fuentes.
  • Generación de clientes potenciales: encontrar clientes para su negocio en crecimiento.
  • Monitorización de marca: las empresas analizan foros, redes sociales y reseñas para hacer un seguimiento de cómo se percibe su marca.
  • La monitorización del precio mínimo anunciado (MAP) garantiza que los precios online de una marca se ajusten a su política de precios.
  • Aprendizaje automático: los desarrolladores necesitan proporcionar datos de entrenamiento para que sus soluciones basadas en IA funcionen correctamente.

Puedes encontrar más casos de uso y una descripción más detallada de los mismos aquí.

«¡Genial, empecemos!», dirás. No tan rápido.

Aunque entiendas cómo funciona el web scraping y cómo puede mejorar tu negocio, no es tan fácil crear un web scraper. Para empezar, hay gente que no quiere un scraper en sus sitios web por diferentes razones.

Una de ellas sería que el scraping implica el envío de muchas solicitudes en un segundo, lo que puede sobrecargar el servidor. Los propietarios de sitios web pueden considerar esto a veces como un ataque de hackers (denegación de servicio), por lo que los sitios web adoptan medidas para protegerse bloqueando los bots.

Algunas de estas medidas pueden ser:

  • Bloqueo de IP: esto ocurre cuando un sitio web detecta un gran número de solicitudes procedentes de la misma dirección IP; el sitio web puede prohibirte por completo el acceso o ralentizarlo significativamente.
  • CAPTCHAs (pruebas de Turing públicas y completamente automatizadas para distinguir entre ordenadores y humanos): son problemas lógicos bastante triviales de resolver para las personas, pero un quebradero de cabeza para los scrappers.
  • Honeypot: enlaces integrados invisibles para los humanos pero visibles para los bots; una vez que caen en la trampa, el sitio web bloquea su IP.
  • Inicio de sesión requerido: los sitios web pueden ocultar parte de la información que necesitas detrás de una página de inicio de sesión; incluso si te autenticas en el sitio web, el scraper no tiene acceso a tus credenciales ni a las cookies del navegador.

Es posible que algunos sitios web no implementen estas técnicas, pero el simple hecho de que quieran ofrecer una mejor experiencia de usuario mediante Javascript complica la vida de los scrapers web.

Cuando un sitio web utiliza JavaScript o un marco de generación de HTML, parte del contenido solo es accesible tras realizar algunas interacciones con el sitio web o tras ejecutar un script (normalmente escrito en JavaScript) que genera el documento HTML.

Consideremos también la calidad de los datos extraídos. Por ejemplo, en un sitio web de comercio electrónico, es posible que veas precios diferentes según la región en la que vivas. Estos datos no son muy precisos, por lo que el bot debe encontrar una forma de extraerlos con la mayor precisión posible.

Si consigues superar todo esto, aún debes tener en cuenta que la estructura de ese sitio web siempre puede sufrir cambios. Al fin y al cabo, un sitio web debe ser fácil de usar para los usuarios, no para los bots, por lo que nuestra herramienta automatizada debe adaptarse a estos cambios.

En esta interminable guerra del scraping, los bots idean soluciones por su cuenta. El objetivo de todas ellas es recrear el comportamiento humano en Internet lo mejor posible.

Por ejemplo, puedes evitar el bloqueo de IP utilizando servicios de proxy de IP. Es mejor utilizar servicios de pago, ya que los gratuitos hacen públicas sus IP, por lo que un sitio web podría bloquearlas.

También puedes integrar solucionadores de CAPTCHA. Te ayudarán a conseguir flujos de datos continuos, pero ralentizarán ligeramente el proceso de scraping.

Como solución a las trampas honeypot, puedes utilizar XPath (o incluso expresiones regulares si te atreves) para extraer elementos específicos en lugar de todo el documento HTML.

Tener en cuenta todos estos problemas y cómo superarlos puede convertirse en un proceso laborioso y que requiere mucho tiempo. Por eso, en la última década, las API de web scraping han ganado cada vez más atención.

Aquí, en WebScrapingAPI, recopilamos el contenido HTML de cualquier sitio web, gestionando cualquier posible desafío (como los mencionados anteriormente). Además, utilizamos Amazon Web Services, por lo que la velocidad y la escalabilidad no son un problema. ¿Te apetece probarlo? Puedes empezar con una cuenta gratuita, que te ofrece 1000 llamadas a la API al mes. Genial, ¿verdad?

Entender la web

Pero ahora, volvamos al objetivo de este artículo. Queremos aprender a crear un rastreador web utilizando Python.

El primer concepto que debes conocer es el Protocolo de Transferencia de Hipertexto (HTTP), que explica la comunicación entre un servidor y un cliente. La idea detrás de esto es bastante sencilla. El cliente (aplicación) envía un mensaje (solicitud HTTP) al servidor, y el servidor devuelve una respuesta.

El mensaje contiene diversa información que describe al cliente y cómo procesará los datos: método, versión HTTP y encabezados.

En el web scraping, el método más utilizado para una solicitud HTTP es GET. Esto significa que vas a recuperar los datos que solicitas. Si quieres saber más sobre ellos, aquí puedes encontrar una lista completa y detallada.

Los encabezados incluyen información adicional sobre la solicitud o respuesta HTTP. Hablaremos de los más relevantes en el web scraping, pero puedes consultar la lista completa.

  • User-Agent: se utiliza para identificar la aplicación, el sistema operativo, el software y su versión; un web scraper utiliza este encabezado para que las solicitudes parezcan más realistas.
  • Cookie: contiene información de estado sobre la solicitud (por ejemplo, el token de autenticación).
  • Host: especifica el nombre de dominio del servidor y, en su caso, el número de puerto en el que el servidor está a la escucha.
  • Referrer: contiene el sitio de origen del que proviene el usuario; en función de ello, el contenido mostrado puede variar, por lo que un web scraper también debe tenerlo en cuenta.
  • Accept: indica al servidor qué tipo de contenido puede devolver en respuesta; a menudo se pasa por alto en el web scraping, aunque puede ofrecer una comunicación más fluida entre el cliente y el servidor.

Entender Python

Python es un lenguaje de programación de alto nivel y uso general que se mantiene entre las preferencias de los desarrolladores por múltiples razones:

  • Código legible: su sintaxis sencilla lo convierte en una opción perfecta para principiantes.
  • Paradigmas de programación: la programación orientada a objetos, estructurada, funcional y orientada a aspectos son solo algunos ejemplos.
  • Sólida biblioteca estándar: amplia gama de módulos para cada necesidad
  • Comunidad activa: muchas bibliotecas y herramientas de código abierto

Bien, dicho esto, preparemos nuestro espacio de trabajo. En primer lugar, necesitamos Python 3. Puedes descargarlo e instalarlo desde aquí.

Este tutorial es independiente del IDE, así que elige el que te resulte más cómodo. Nosotros preferimos Visual Studio Code porque es ligero y está disponible para múltiples lenguajes.

También vamos a utilizar varias bibliotecas de Python:

  • requests: para realizar una solicitud HTTP
  • beautifulsoup: para analizar el documento HTML
  • selenium: para extraer contenido dinámico
  • nltk (opcional): para procesar lenguaje natural

No es necesario que las instales todas de antemano, ya que encontrarás más detalles e instrucciones de instalación en cada paso.

¡Ahora, empecemos a extraer datos de la web!

Crear tu propio rastreador web

Para facilitarte las cosas, el tutorial se dividirá en pasos. Además, verás algunos pasos adicionales marcados con .1 después del número. Estos sirven como alternativas que podrían interesarte.

Paso 1: Examina la página que quieres rastrear

Bueno, basta de charla, vamos al grano.

En primer lugar, tenemos que elegir un sitio web del que queramos extraer datos. Para ilustrar los principios, elijamos un sitio web educativo sencillo: https://en.wikipedia.org/wiki/Beer.

En este paso, solo queremos revisar el documento HTML de la página para hacernos una idea general de su estructura. No importa qué navegador o sistema operativo utilices en este paso; el proceso es el mismo. Haz clic con el botón derecho en cualquier lugar, sobre una imagen, un enlace o un simple bloque de texto, y luego elige la opción «Inspeccionar elemento».

La pestaña «Elementos» es lo único en lo que nos centraremos. Dependiendo del sitio web, verás una gran cantidad de código HTML. Es importante no agobiarte por ello, sino fijarte solo en los datos que te interesan.

Paso 2: Enviar una solicitud HTTP

Ahora podemos empezar a escribir el código para nuestro rastreador web. Simplemente comenzamos realizando una solicitud HTTP a nuestro sitio web para que nos devuelva el código HTML completo que acabamos de ver en el navegador. ¿Cómo se vería eso en código? ¡Pues impresionante! Al fin y al cabo, estamos hablando de Python.

Instalemos la biblioteca requests para realizar la solicitud HTTP:

pip install requests

Ahora escribamos el código:

import requests
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)

Bastante sencillo, ¿verdad? Hemos importado la biblioteca que instalamos antes. A continuación, hemos definido la URL del sitio web que queremos rastrear y hemos realizado una solicitud GET. Si quieres ver cuál es el resultado, adelante, imprímelo. Por ahora, solo verás una cadena desordenada que debería representar el HTML que viste en tu navegador. No nos sirve de mucho, así que tenemos que procesarlo.

Paso 3: Extraer el HTML de la página

Para extraer información útil de nuestro resultado, instalaremos la biblioteca beautifulsoup:

pip install beautifulsoup4

Primero, formateemos nuestro resultado de forma más clara:

import requests
from bs4 import BeautifulSoup
 
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)
 
soup = BeautifulSoup(page.content, 'html.parser')
prettyHTML = soup.prettify()
print(prettyHTML)

Convertimos el resultado anterior en un objeto BeautifulSoup. Con el atributo .content, puedes acceder a los datos HTML. Al aplicar el método .prettify(), verás el mismo formato que viste antes en tu navegador.

Por desgracia, no todos los sitios web te proporcionarán su HTML completo de esta manera. Como se ha mencionado anteriormente, los rastreadores web se enfrentan a algunos retos.

Paso 3.1: Contenido dinámico

Por ejemplo, algunas páginas solo son visibles tras iniciar sesión. Aunque te autentifiques desde tu navegador, tu script de Python no podrá acceder a los datos.

Otra situación habitual es la de los sitios web dinámicos. Esto significa que la respuesta a la solicitud GET no es un documento HTML, sino un script de JavaScript. Aunque puedas ver el HTML en el navegador, es porque este ejecuta el script. Pero en tu código, necesitas ejecutar el script localmente para obtener el HTML.

Pero veamos esta situación en la práctica. Elegiremos un ejemplo minimalista de un sitio web creado rápidamente a partir de un antiguo ejercicio universitario: https://dynamic-website.surge.sh.

Puedes ver el HTML completo en tu navegador. En este ejemplo, se trata de una tabla que contiene imágenes en sus celdas.

import requests
from bs4 import BeautifulSoup
 
URL = 'https://dynamic-website.surge.sh'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

Ahora extraigamos este HTML, lo que significa que ejecutaremos el mismo código que antes, con algunos cambios: hemos actualizado la URL y hemos abierto un archivo de texto para guardar nuestro resultado. Ejecutamos el programa y miramos en el archivo page.txt para ver si aparece la misma sección de la tabla.

¿Qué es eso? ¿Dónde está la tabla? Bueno, está ahí, pero aún no había nadie que la generara. Puedes mirar la etiqueta <head> del documento HTML para ver si se utiliza algún script:

Y sí, utilizamos un script.

Para resolver este problema, necesitamos Selenium, una biblioteca utilizada para pruebas web y la automatización de actividades del navegador. La utilizaremos en modo headless, lo que significa que se comportará como un navegador normal que ejecutará el código JavaScript, pero sin interfaz de usuario visible.

pip install selenium

En este tutorial, utilizaremos ChromeDriver para configurar el controlador web de Selenium. ¡Solo recuerda copiar la ruta donde lo descargues! Nosotros lo guardamos en el directorio C, pero cualquier ubicación servirá.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
 
CHROMEDRIVER_PATH = "your/path/here/chromedriver_win32/chromedriver"
URL = "https://dynamic-website.surge.sh"
 
options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, options=options)
 
driver.get(URL)
soup = BeautifulSoup(driver.page_source, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

El resto del proceso es prácticamente el mismo, salvo que ya no utilizamos la biblioteca requests para realizar la solicitud HTTP.

Volvemos a ejecutar el programa y…

...¡Voilà! Ahora tenemos el HTML completo.

Paso 4: Extraer secciones específicas

Muy bien, volvamos al tema.

Tener el HTML completo es un gran avance, pero el proceso no ha terminado. La mayoría de las veces necesitamos información específica de un sitio web, así que veamos cómo podemos extraerla.

Empecemos con algo sencillo: el título del sitio web. Lo encontrarás en la sección <head> del HTML, dentro de una etiqueta &lt;title>.

Sabemos que un sitio web solo tiene un título, así que utilizaremos el método .find(). Este toma el nombre de la etiqueta como entrada y devuelve el elemento HTML, por lo que si necesitas su contenido, simplemente accede a él a través del atributo .text. Además, añadiremos un poco de estructura a nuestro pequeño scraper.

def extract_title(soup):
    title = soup.find('title')
 
    #output: <title>Beer - Wikipedia</title>    
    print('Title element: ', title)
 
    #output: Beer - Wikipedia
    print('Title: ', title.text)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_title(soup)
 
main()

No es ciencia espacial. BeautifulSoup es una potente biblioteca y admite varios patrones para extraer datos específicos. Puedes obtener elementos HTML por su nombre, id y atributo de clase, o incluso puedes usar selectores CSS. ¡El cielo es el límite!

Vamos a por más, como extraer elementos que aparecen más de una vez. En este caso, utilizamos el método .find_all(). La única diferencia es que devuelve una lista de elementos en lugar de solo uno. Por eso, a continuación, la recorremos y mostramos los atributos de cada elemento. A modo de ejemplo, hemos extraído todas las imágenes del artículo:

def extract_images(soup):
    images = soup.find_all('img')
    for image in images:
        imageAlt = image.get('alt')
        imageSrc = image.get('src')
        print("ALT: ", imageAlt, "SRC: ", imageSrc)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_images(soup)
 
main()

Paso 5: Pasar funciones durante el scraping

Una situación habitual en el scraping web es cuando la lista de resultados del análisis es muy larga y contiene información variada.

Por ejemplo, quizá hayas notado que nuestras imágenes anteriores pueden contener o no un atributo alt.

O imagina que extrajéramos todos los enlaces del artículo. Todos sabemos que un artículo de Wikipedia tiene MUCHOS enlaces, y puede que no queramos una lista completa de ellos. El resultado tendrá enlaces externos e internos, referencias y citas, por lo que necesitamos clasificarlos en varias categorías.

Para resolver este problema, vamos a utilizar una función lambda. Básicamente, la lambda tomará como parámetro cada elemento de la lista de resultados y aplicará la condición que definamos, igual que si utilizáramos un filtro.

Como ejemplo práctico, supongamos que necesitamos extraer todos los enlaces internos, acceder a sus artículos y hacer un resumen de cada uno. Teniendo en cuenta que uno de los casos de uso de Python es la Inteligencia Artificial, este ejemplo podría ser una excelente aplicación para obtener datos de entrenamiento.

En primer lugar, tendremos que instalar la biblioteca NLTK, ya que calcular un resumen implica procesar el lenguaje humano.

pip install -U nltk

Y, por supuesto, importarla en nuestro código:

import re
import nltk
import heapq
# need to download only for the first execution
# warning: the size of the dataset is big; hence it will take time
nltk.download()

Nota: si eres usuario de macOS, es posible que te aparezca un error «SSL: certificate verify failed». La causa puede ser que Python 3.6 utiliza una versión integrada de OpenSSL. Todo lo que tienes que hacer es abrir la ubicación donde instalaste Python y ejecutar este archivo:

/Your/Path/Here/Python 3.6/Install Certificates.command

Como puedes ver, también hemos importado la biblioteca re, utilizada para operaciones con expresiones regulares, y heapq, una implementación de la cola de montón.

Bien, ya tenemos todo lo necesario para empezar a escribir el código. Comencemos extrayendo los enlaces internos. Si vuelves al navegador, notarás algunas cosas sobre los elementos que nos interesan.

Esas cosas serían:

  • El atributo href tiene un valor;
  • El valor de href comienza por «/wiki/»;
  • El elemento padre del enlace es una etiqueta ;

Estas características nos ayudarán a diferenciar los enlaces que necesitamos de todos los demás.

Ahora que sabemos cómo encontrar los enlaces, veamos cómo podemos extraerlos.

count = 0
 
def can_do_summary(tag):
    global count
    if count > 10: return False
 
    # Reject if parent is not a paragraph
    if not tag.parent.name == 'p': return False
 
    href = tag.get('href')
    # Reject if href is not set
    if href is None: return False
 
    # Reject is href value does not start with /wiki/
    if not href.startswith('/wiki/'): return False
 
    compute_summary(href)
    return True
 
 
def extract_links(soup):
    soup.find_all(lambda tag: tag.name == 'a' and can_do_summary(tag))
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_links(soup)
 
main()

Muy bien, ¿qué ha pasado aquí? Si nos fijamos en la función extract_links(), vemos que, en lugar del nombre de una etiqueta, hemos pasado una función lambda como parámetro al método .find_all(). Eso significa que seleccionamos solo aquellas que cumplen nuestra condición de entre todas las etiquetas del documento HTML.

Como puedes ver, la condición de una etiqueta es que sea un enlace y que sea aceptada por la función can_do_summary() definida anteriormente. Allí, rechazamos todo lo que no coincida con las características observadas anteriormente. Además, hemos utilizado una variable global para limitar el número de enlaces extraídos a 10. Si los necesitas todos, no dudes en eliminar la variable count.

Al final, llamamos a la función compute_summary() para el enlace recién encontrado. Ahí es donde se resume el artículo.

def compute_summary(href):
    global count
    full_link = 'https://en.wikipedia.org' + href
    page = requests.get(full_link)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    # Concatenate article paragraphs
    paragraphs = soup.find_all('p')
    article_text = ""
    for p in paragraphs:
        article_text += p.text
 
    # Removing Square Bracket, extra spaces, special characters and digits
    article_text = re.sub(r'\[[0-9]*\]', ' ', article_text)
    article_text = re.sub(r'\s+', ' ', article_text)
    formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text)
    formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)
 
    # Converting text to sentences
    sentence_list = nltk.sent_tokenize(article_text)
 
    # Find frequency of occurrence of each word
    stopwords = nltk.corpus.stopwords.words('english')
 
    word_frequencies = {}
    for word in nltk.word_tokenize(formatted_article_text):
        if word not in stopwords:
            if word not in word_frequencies.keys():
                word_frequencies[word] = 1
            else:
                word_frequencies[word] += 1
 
    maximum_frequency = max(word_frequencies.values())
 
    for word in word_frequencies.keys():
        word_frequencies[word] = (word_frequencies[word] / maximum_frequency)
 
    # Calculate the score of each sentence
    sentence_scores = {}
    for sent in sentence_list:
        for word in nltk.word_tokenize(sent.lower()):
            if word in word_frequencies.keys():
                if len(sent.split(' ')) < 30:
                    if sent not in sentence_scores.keys():
                        sentence_scores[sent] = word_frequencies[word]
                    else:
                        sentence_scores[sent] += word_frequencies[word]
 
    # Pick top 7 sentences with highest score
    summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
    summary = '\n'.join(summary_sentences)
    count += 1

En resumen, realizamos una solicitud HTTP a la URL recién encontrada y convertimos el resultado en un objeto BeautifulSoup, tal y como hicimos al principio del artículo.

Para calcular un resumen, extraemos todos los párrafos del artículo y los concatenamos. A continuación, eliminamos todos los caracteres especiales que podrían interferir en los cálculos.

En términos sencillos, un resumen se elabora calculando las palabras más frecuentes y asignando a cada frase una puntuación basada en la frecuencia de sus palabras. Al final, seleccionamos las 7 frases con la puntuación más alta.

Este no es el tema de nuestro artículo, pero puedes leer más aquí si sientes curiosidad o incluso te apasiona el procesamiento del lenguaje natural.

Paso 6: Genera un CSV para almacenar tus datos

Pasando al último paso de esta guía, tenemos que examinar los resultados del scraping. Hasta ahora, solo los hemos mostrado en la terminal porque solo había unas pocas filas de datos.

Pero el scraping en la vida real implica una cantidad considerable de información, por lo que deberíamos ver cómo podemos guardar los resultados en un archivo.

Usemos la biblioteca nativa csv (por lo que no es necesario instalar nada más) y abramos un archivo llamado summaries.csv.

import csv
summaries_file = open('summaries.csv', mode='a', encoding='utf-8')

La biblioteca creará el archivo si no existe. Además, lo abrimos en modo «append» porque cada enlace se procesa secuencialmente, uno por uno.

    summaries_writer = csv.writer(summaries_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    summaries_writer.writerow([full_link, summary])

Al final de la función compute_summary(), simplemente inicializamos el escritor y comenzamos a añadir los datos. Una fila se compone de la URL del artículo y su resumen.

Paso 6.1: Generar un archivo JSON

Otro formato de serialización de datos que se ha popularizado en los últimos años es JavaScript Object Notation (JSON). Es fácilmente legible para los humanos y muy útil si quieres pasar los datos extraídos a una API u otra aplicación.

En Python, la forma más sencilla de escribir un archivo JSON es pasar los datos a un objeto dict.

import json
 
summaries_file = open('summaries.json', mode='a', encoding='utf-8')
data = {}
data['summaries'] = []

Utilizaremos la biblioteca nativa para archivos JSON y abriremos un nuevo archivo, tal y como hicimos anteriormente con nuestro CSV. A continuación, inicializamos un objeto dict vacío y una lista vacía que contendrá nuestros resúmenes.

data['summaries'].append({
'url': full_link,
      'summary': summary
})

Al final de la función compute_summary(), justo donde antes escribíamos en el CSV, ahora añadimos un nuevo objeto dict a la lista final.

json.dump(data, summaries_file, indent=4)

Y, por último, en nuestra función main(), después de ejecutar el proceso extract_links(), escribimos el objeto final en el archivo. El parámetro indent solo formateará el resultado de forma más clara.

Conclusión y alternativas

Bueno, eso es todo, el final de nuestro tutorial. Espero que te haya sido útil y te haya dado una buena idea sobre el web scraping con Python.

Hemos aprendido cuáles son sus ventajas y cómo puede mejorar tu negocio o aplicación. Al mismo tiempo, hemos equilibrado esta información con algunos de los retos que se plantean en el web scraping.

Si eres desarrollador, puede que te resulte emocionante crear tu propio web scraper superando todos estos problemas. Puede ser una experiencia de aprendizaje genial.

Pero como propietario de un negocio (o como alguien que necesita datos para una aplicación a gran escala en la vida real), es posible que quieras evitar los costes que conlleva (tiempo, dinero, personal).

En esta situación, el uso de una API dedicada resolverá el problema. WebScrapingAPI supera todos los posibles obstáculos: renderización de JavaScript, proxies, CAPTCHAs, etc., y ofrece funciones personalizables. Además, si no estás del todo seguro, recuerda que hay una opción de plan gratuito, así que ¿por qué no lo pruebas?

Acerca del autor
Raluca Penciuc, Desarrollador full-stack @ WebScrapingAPI
Raluca PenciucDesarrollador full-stack

Raluca Penciuc es desarrolladora full stack en WebScrapingAPI, donde se dedica a crear rastreadores, mejorar las técnicas de evasión y buscar formas fiables de reducir la detección en los sitios web de destino.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.