Scraping con Python en sitios con autenticación




Python es un lenguaje de programación de lenguaje de alto nivel. BeautifulSoup es una potente libreía que permite la creación de tareas automáticas. El articulo proporciona conceptos básicos de Python y BeautifulSoup. Python es un lenguaje de programación que tiene dos paradigmas de programación procedimental y orientado a objetos. Se utiliza en diversas aplicaciones como la ciencia de datos, aprendizaje automático e IA.

Es uno de los lenguajes de desarrollo más importantes en el mundo de TI. En los últimos años ha aumentado considerablemente el uso de Python. Es versátil, fácil de aprender y tiene una comunidad cada vez mayor con una amplia gama de librerías y herramientas disponibles.

Requisitos y Librerías

Para realizar este scraping vamos a necesitar:

  • Obtener datos a través de peticiones HTTP por lo que vamos a utilizar la librería request
  • Extracción de datos a través del documento de HTML que vamos a emplear la librería Beautiful Soup

Configuración

Nuestra configuración es bastante simple. Sólo tienes que crear una carpeta e instalar Beautiful Soup & requests. Para crear una carpeta e instalar las librerías escribe los siguientes comandos. Asumo que ya has instalado Python 3

pip3 install beautifulsoup4
pip3 install requests

Ahora, crea un archivo dentro de esa carpeta con el nombre que quieras. Yo estoy usando scraping.py.

A continuación, importar las librerías de Beautiful Soup y request en tu fichero del script. Como esto:

from bs4 import BeautifulSoup
import requests

Sólo queremos obtener el HTML de un contenido de zona de usuarios logueados.

Sesión

Utilizaremos el objeto Session que nos facilita la librería request para guardar la sesión del usuario. Esta sesión la utilizaremos para realizar las peticiones posteriores.

Todas las cookies persistirán dentro de la sesión para cada petición. Es decir, si nos registramos, la sesión nos recordará y utilizará estas cookies para todas las futuras peticiones que hagamos.

client = requests.Session()

Construyendo el scraper

Vamos a utilizar para el ejemplo una web de entrenamiento que hemos montado en ParaScrapear.com que tiene una sección de iniciar sesión.

Ahora, tenemos todos los ingredientes en su lugar para construir un raspador. Así que vamos a empezar a cocinar. Abramos las herramientas de desarrollador (en Chrome se abre con el botón F12), vamos a la pestaña de Network e iniciemos sesión para poder coger la URL y los parámetros.

La URL se muestra del login es https://parascrapear.com/login, así que vamos a guardarla. Aquí es donde irá nuestra primera solicitud.

Dentro de esta misma petición si vamos abajo del todo como se muestra en la siguiente imagen, podemos ver que se enviamos 3 campos en el formulario que son csrf_token, username y password. Por lo tanto vamos a tener que replicar esto mismo en nuestro script.


Ahora, la pregunta es cómo conseguir ese token. La respuesta es muy sencilla. Haremos una petición HTTP a la página de login y luego usaremos BeautifulSoup para extraer el token, como hacemos en el siguiente código;

html = client.get("https://parascrapear.com/login").content
soup = BeautifulSoup(html, "html.parser")
csrf = soup.find('input', {'name': 'loginCsrfParam'}).get('value')

Ahora, hemos extraido el token CSRF. Ahora sólo queda iniciar la sesión y confirmar que estamos logueados.

Iniciar sesión

Vamos a iniciar la sesión haciendo una petición POST a “LOGIN_URL”

login_information = {
    'csrf_token': csrf,
    'username': 'admin',
    'session_password': 'admin',
}
client.post("https://parascrapear.com/login", data=login_information)

Ahora básicamente has terminado con tu parte de inicio de sesión. Has hecho la solicitud para iniciar la sesión. Todas las demás solicitudes que realices en el mismo script se considerarán iniciadas.

Scrapeando el contenido sólo para usuarios logueados

Ahora vamos a hacer una nueva petición pero usando el mismo client que debe tener guardado la sesión con el usuario logueado y comprobar que efectivamente nos toma como usuario registrado.

s = client.get('https://parascrapear.com/').text
print(s)

Y este es el resultado, en el que podemos ver después de ejecutar el script como me salte el html de <a href=”/logout”>Cerrar sesión</a>

Extracción de la información

Ahora, el scraping verdadero vas a querer extraer diferentes campos de información. Esta guía no cubre esto, pero si quieres, puedes ir a mi otra guía sobre cómo hacer scraping con Beautiful Soup. Es muy fácil continuar desde donde lo dejaste aquí.

Conclusión

Aquí tienes el código completo:

import requests
from bs4 import BeautifulSoup

client = requests.Session()

html = client.get("https://parascrapear.com/login").content
soup = BeautifulSoup(html, "html.parser")
csrf = soup.find('input', {'name': 'csrf_token'}).get('value')

login_information = {
    'csrf_token': csrf,
    'username': 'admin',
    'session_password': 'admin',
}
client.post("https://parascrapear.com/login", data=login_information)

s = client.get('https://parascrapear.com/').text
print(s)

En este artículo, hemos entendido cómo podemos scrapear datos usando session & BeautifulSoup sin importar el tipo de sitio web.

Siéntate libre de comentar y preguntarme cualquier cosa. Puedes seguirme en Twitch y Youtube.

Reader Interactions

¿Olvidaste tu contraseña?