Python
Tutorial Python: Autenticación y acceso a recursos protegidos
Beautiful Soup: Aprende a gestionar cookies, sesiones y tokens para scraping. Automatiza el acceso a contenidos protegidos y supera autenticaciones web.
Aprende Python GRATIS y certifícateMantenimiento de sesiones con cookies y tokens
Al realizar web scraping, es común encontrarse con sitios web que requieren mantener una sesión activa para acceder a ciertos contenidos. Esto implica manejar cookies y tokens que el servidor utiliza para identificar y autenticar al usuario durante la navegación.
Las cookies son pequeños archivos de datos que los sitios web envían al navegador para almacenar información de sesión. Cuando se hace una solicitud HTTP, el navegador envía estas cookies de vuelta al servidor, lo que permite mantener un estado consistente entre solicitudes.
Para mantener una sesión utilizando cookies en el contexto de web scraping, es necesario utilizar una sesión persistente que conserve las cookies entre solicitudes. Aunque Beautiful Soup es excelente para analizar y extraer datos de HTML, no maneja las solicitudes HTTP ni las sesiones. Por ello, es común combinarlo con la librería requests
que permite gestionar sesiones.
A continuación, se muestra un ejemplo de cómo mantener una sesión con cookies:
import requests
from bs4 import BeautifulSoup
# Crear una sesión
sesion = requests.Session()
# Realizar una solicitud inicial para iniciar sesión o establecer cookies
url_login = 'https://www.ejemplo.com/login'
datos_login = {'usuario': 'mi_usuario', 'contraseña': 'mi_contraseña'}
respuesta_login = sesion.post(url_login, data=datos_login)
# Verificar si el inicio de sesión fue exitoso
if respuesta_login.ok:
# Acceder a una página protegida
url_protegida = 'https://www.ejemplo.com/pagina_protegida'
respuesta = sesion.get(url_protegida)
# Analizar el contenido con Beautiful Soup
soup = BeautifulSoup(respuesta.content, 'html.parser')
contenido = soup.find('div', class_='contenido')
print(contenido.text)
else:
print('Error en el inicio de sesión')
En este ejemplo, se utiliza requests.Session()
para crear una sesión que mantendrá las cookies y el estado entre solicitudes. Al realizar sesion.post()
con los datos de inicio de sesión, las cookies de autenticación se almacenan en la sesión y se utilizan automáticamente en las solicitudes subsecuentes.
Los tokens de autenticación, como los tokens JWT (JSON Web Token), son otra forma común de mantener sesiones. Los tokens suelen proporcionarse después de un proceso de autenticación y deben incluirse en las encabezados de las solicitudes para acceder a recursos protegidos.
Ejemplo de uso de un token de autenticación:
import requests
from bs4 import BeautifulSoup
# Suponiendo que ya tenemos un token de autenticación
token = 'abc123def456ghi789'
# Configurar los encabezados con el token
headers = {'Authorization': f'Bearer {token}'}
# Realizar una solicitud a una API o página protegida
url_api = 'https://www.ejemplo.com/api/datos_protegidos'
respuesta = requests.get(url_api, headers=headers)
# Verificar respuesta y analizar contenido
if respuesta.ok:
soup = BeautifulSoup(respuesta.content, 'html.parser')
datos = soup.find_all('item')
for dato in datos:
print(dato.text)
else:
print('Error al acceder a los datos protegidos')
En este caso, el token se incluye en los encabezados de la solicitud bajo la clave 'Authorization'
, siguiendo el estándar de portador (Bearer
). Esto permite al servidor validar el token y conceder acceso a los recursos solicitados.
Es crucial manejar correctamente la persistencia de las sesiones para evitar problemas de autenticación. Al reutilizar la misma sesión o incluir el token en cada solicitud, nos aseguramos de que el servidor nos reconozca y permita el acceso continuado.
Además, es importante estar atento a la caducidad de las sesiones y los tokens. Algunos tokens expiran después de cierto tiempo, por lo que puede ser necesario implementar lógica adicional para renovarlos o volver a autenticarse.
Al trabajar con cookies y tokens, siempre se debe respetar la política de uso del sitio web en cuestión. Algunos sitios prohíben el web scraping o tienen limitaciones específicas, por lo que es fundamental cumplir con sus términos y condiciones para evitar infracciones legales o éticas.
Automatización de inicios de sesión y manejo de formularios de autenticación
En muchos casos, los sitios web protegen su contenido detrás de un proceso de autenticación que requiere un inicio de sesión. Para realizar scraping de estos sitios, es esencial automatizar el envío de formularios de inicio de sesión y manejar correctamente la autenticación.
Para automatizar un inicio de sesión, es necesario analizar el formulario de autenticación y extraer los campos requeridos. Con Beautiful Soup, podemos extraer los elementos del formulario, como los campos de entrada y cualquier token oculto que el servidor utilice para validar la solicitud.
Por ejemplo, para extraer los campos de un formulario de inicio de sesión:
import requests
from bs4 import BeautifulSoup
# URL de la página de inicio de sesión
url_login = 'https://www.ejemplo.com/login'
# Crear una sesión
sesion = requests.Session()
# Obtener la página de inicio de sesión
respuesta_login = sesion.get(url_login)
# Analizar el HTML de la página de inicio de sesión
soup_login = BeautifulSoup(respuesta_login.content, 'html.parser')
# Encontrar el formulario de inicio de sesión
formulario = soup_login.find('form', {'id': 'form-login'})
# Extraer los campos necesarios
datos_formulario = {}
for input_tag in formulario.find_all('input'):
nombre = input_tag.get('name')
valor = input_tag.get('value', '')
if nombre:
datos_formulario[nombre] = valor
# Añadir las credenciales de usuario
datos_formulario['usuario'] = 'mi_usuario'
datos_formulario['contraseña'] = 'mi_contraseña'
En este ejemplo, hemos creado una sesión persistente con requests.Session()
y hemos obtenido el contenido de la página de inicio de sesión. Con Beautiful Soup, hemos analizado el formulario y extraído todos los campos de entrada, incluyendo aquellos que están ocultos y que suelen ser necesarios para la autenticación, como los tokens CSRF.
Los tokens CSRF (Cross-Site Request Forgery) son valores únicos que previenen ataques de tipo falsificación de petición en sitios cruzados. Al extraer y enviar estos tokens junto con nuestras credenciales, nos aseguramos de que el servidor acepte nuestra solicitud de inicio de sesión.
Una vez recopilados los datos necesarios, podemos enviar el formulario:
# URL a la que se envía el formulario
url_envio = formulario.get('action')
url_envio = requests.compat.urljoin(url_login, url_envio)
# Enviar el formulario con los datos
respuesta_post = sesion.post(url_envio, data=datos_formulario)
# Verificar si el inicio de sesión fue exitoso
if 'Bienvenido' in respuesta_post.text:
print('Inicio de sesión exitoso')
else:
print('Error en el inicio de sesión')
Es importante manejar correctamente la URL de envío del formulario, ya que puede ser relativa o absoluta. Utilizamos requests.compat.urljoin
para asegurarnos de que la URL sea correcta.
Tras el inicio de sesión, la sesión mantiene la autenticación para las siguientes solicitudes. Podemos acceder a páginas protegidas de la siguiente manera:
# Acceder a una página protegida
url_protegida = 'https://www.ejemplo.com/area-privada'
respuesta_protegida = sesion.get(url_protegida)
# Analizar el contenido de la página protegida
soup_protegida = BeautifulSoup(respuesta_protegida.content, 'html.parser')
# Extraer información específica
datos = soup_protegida.find('div', class_='datos-usuario')
print(datos.text)
Al utilizar la misma sesión, se mantienen las cookies de sesión que el servidor utiliza para identificar al usuario autenticado.
Es posible que algunos sitios web utilicen métodos de autenticación más complejos, incluyendo redirecciones y cabeceras adicionales. Es fundamental inspeccionar las respuestas del servidor y ajustar las solicitudes según sea necesario. La herramienta de desarrollo de un navegador puede ser útil para analizar las solicitudes y respuestas durante el proceso de inicio de sesión.
Además, es recomendable manejar correctamente los tiempos de espera y verificar el estado de las respuestas para asegurar que las solicitudes se completen con éxito:
# Realizar una solicitud con gestión de errores
try:
respuesta = sesion.get(url_protegida, timeout=10)
respuesta.raise_for_status()
except requests.exceptions.HTTPError as errh:
print('Error HTTP:', errh)
except requests.exceptions.ConnectionError as errc:
print('Error de conexión:', errc)
except requests.exceptions.Timeout as errt:
print('Tiempo de espera agotado:', errt)
except requests.exceptions.RequestException as err:
print('Error:', err)
Al manejar las excepciones de Requests, podemos identificar y solucionar problemas de conexión o autenticación.
Gestión de autenticación básica, digest y basada en tokens (JWT, OAuth)
En la extracción de datos web, es frecuente encontrarse con sitios que requieren autenticación para acceder a recursos protegidos. Existen varios métodos de autenticación comunes, como la autenticación básica, digest y la autenticación basada en tokens (como JWT y OAuth). Comprender cómo manejar estos métodos es esencial para realizar web scraping efectivo y respetuoso.
Para interactuar con sitios web que implementan estos tipos de autenticación, necesitamos emplear la librería requests
junto con Beautiful Soup. Mientras que Beautiful Soup es excelente para analizar y extraer información de HTML, no maneja las solicitudes HTTP ni la autenticación por sí misma.
Autenticación básica
La autenticación básica es un método sencillo en el que el cliente envía un nombre de usuario y una contraseña codificados en Base64 en la cabecera de la solicitud HTTP. Aunque es menos segura que otros métodos, aún se utiliza en muchos sitios.
Ejemplo de cómo manejar la autenticación básica con requests
:
import requests
from bs4 import BeautifulSoup
# Credenciales de autenticación
usuario = 'mi_usuario'
contraseña = 'mi_contraseña'
# Realizar una solicitud con autenticación básica
url_protegida = 'https://www.ejemplo.com/recurso-protegido'
respuesta = requests.get(url_protegida, auth=(usuario, contraseña))
# Verificar si la solicitud fue exitosa
if respuesta.status_code == 200:
# Analizar el contenido con Beautiful Soup
soup = BeautifulSoup(respuesta.content, 'html.parser')
# Extraer información necesaria
datos = soup.find('div', class_='datos')
print(datos.text)
else:
print('No se pudo acceder al recurso protegido.')
En este ejemplo, pasamos una tupla con las credenciales al parámetro auth
de requests.get()
. La librería requests
se encarga de agregar la cabecera de autenticación adecuada.
Autenticación digest
La autenticación digest es más segura que la básica, ya que utiliza un algoritmo de resumen criptográfico (hash) para las credenciales, evitando enviar la contraseña en texto claro. Para manejar este tipo de autenticación, requests
ofrece la clase HTTPDigestAuth
.
Ejemplo de autenticación digest:
import requests
from requests.auth import HTTPDigestAuth
from bs4 import BeautifulSoup
# Credenciales
usuario = 'mi_usuario'
contraseña = 'mi_contraseña'
# Realizar la solicitud con autenticación digest
url_protegida = 'https://www.ejemplo.com/recurso-protegido'
respuesta = requests.get(url_protegida, auth=HTTPDigestAuth(usuario, contraseña))
# Comprobar la respuesta
if respuesta.status_code == 200:
soup = BeautifulSoup(respuesta.content, 'html.parser')
datos = soup.find('div', class_='datos')
print(datos.text)
else:
print('No se pudo autenticar mediante Digest.')
Aquí, usamos HTTPDigestAuth
para manejar el proceso de autenticación digest. requests
gestiona automáticamente los detalles del protocolo.
Autenticación basada en tokens (JWT)
Los JSON Web Tokens (JWT) son un estándar para tokens de acceso que contienen información sobre el usuario y sus permisos. Estos tokens suelen enviarse en la cabecera de autorización de las solicitudes HTTP.
Para acceder a recursos protegidos con JWT, normalmente primero debemos autenticar al usuario y obtener el token de acceso.
Ejemplo de autenticación con JWT:
import requests
from bs4 import BeautifulSoup
# URL para autenticarse y obtener el token
url_auth = 'https://www.ejemplo.com/api/autenticar'
credenciales = {'usuario': 'mi_usuario', 'contraseña': 'mi_contraseña'}
# Autenticarse y obtener el token JWT
respuesta_auth = requests.post(url_auth, json=credenciales)
if respuesta_auth.status_code == 200:
token = respuesta_auth.json().get('token')
# Configurar las cabeceras con el token
cabeceras = {'Authorization': f'Bearer {token}'}
# Acceder al recurso protegido
url_protegida = 'https://www.ejemplo.com/api/recurso-protegido'
respuesta = requests.get(url_protegida, headers=cabeceras)
if respuesta.status_code == 200:
# Analizar el contenido con Beautiful Soup si es HTML
soup = BeautifulSoup(respuesta.content, 'html.parser')
datos = soup.find('div', class_='datos')
print(datos.text)
else:
print('No se pudo acceder al recurso protegido con el token proporcionado.')
else:
print('Error al obtener el token de autenticación.')
En este caso, enviamos las credenciales al endpoint de autenticación para obtener el token JWT. Luego, incluimos el token en las cabeceras de la siguiente solicitud para acceder al recurso protegido.
Autenticación OAuth 2.0
OAuth 2.0 es un protocolo de autorización estándar que permite acceder a recursos en nombre de un usuario, sin necesidad de compartir sus credenciales. Suele utilizarse para acceder a APIs de terceros, como redes sociales o servicios en la nube.
El flujo de trabajo de OAuth 2.0 implica obtener un token de acceso mediante un proceso de autorización. Este proceso puede ser más complejo y puede requerir interacción con el usuario para aprobar los permisos.
Ejemplo básico de uso de OAuth 2.0:
import requests
from bs4 import BeautifulSoup
# Datos de la aplicación
client_id = 'tu_client_id'
client_secret = 'tu_client_secret'
redirect_uri = 'https://www.tuapp.com/callback'
authorization_base_url = 'https://www.ejemplo.com/oauth2/authorize'
token_url = 'https://www.ejemplo.com/oauth2/token'
# Paso 1: Redirigir al usuario a la URL de autorización
from requests_oauthlib import OAuth2Session
oauth = OAuth2Session(client_id, redirect_uri=redirect_uri)
authorization_url, state = oauth.authorization_url(authorization_base_url)
print('Por favor, dirígete a la siguiente URL e ingresa el código de autorización:')
print(authorization_url)
# Paso 2: El usuario autoriza y obtiene un código
codigo_autorizacion = input('Introduce el código de autorización: ')
# Paso 3: Intercambiar el código por un token de acceso
token = oauth.fetch_token(token_url, client_secret=client_secret, code=codigo_autorizacion)
# Paso 4: Acceder al recurso protegido
url_protegida = 'https://www.ejemplo.com/api/recurso-protegido'
respuesta = oauth.get(url_protegida)
if respuesta.status_code == 200:
# Analizar el contenido
soup = BeautifulSoup(respuesta.content, 'html.parser')
datos = soup.find('div', class_='datos')
print(datos.text)
else:
print('No se pudo acceder al recurso protegido con OAuth 2.0.')
En este ejemplo, utilizamos la librería requests-oauthlib
para simplificar el proceso de OAuth 2.0. Este flujo requiere interacción del usuario para obtener el código de autorización.
Integración con Beautiful Soup
Una vez autenticado y con acceso al recurso protegido, puedes utilizar Beautiful Soup para analizar y extraer la información necesaria del contenido HTML. Recuerda que Beautiful Soup se encarga del análisis del DOM, por lo que todas las técnicas estándar para navegar y buscar elementos en el árbol HTML son aplicables.
Ejemplo de extracción de datos después de la autenticación:
# Suponiendo que 'respuesta' contiene el contenido HTML después de la autenticación
soup = BeautifulSoup(respuesta.content, 'html.parser')
# Ejemplo de extracción de tablas
tabla = soup.find('table', id='tabla-datos')
filas = tabla.find_all('tr')
for fila in filas:
celdas = fila.find_all('td')
datos_fila = [celda.text.strip() for celda in celdas]
print(datos_fila)
Utiliza las capacidades de Beautiful Soup para navegar y extraer la información estructurada o no estructurada que necesites.
Uso de librerías complementarias como Requests junto con Beautiful Soup
Para realizar web scraping, es fundamental combinar Beautiful Soup con librerías como Requests. Mientras que Beautiful Soup se encarga del análisis y manipulación de contenido HTML y XML, Requests facilita la obtención de dicho contenido desde la web mediante solicitudes HTTP.
Al utilizar Requests, podemos enviar solicitudes HTTP GET
, POST
, PUT
, entre otras, y gestionar aspectos como cabeceras personalizadas, tiempos de espera y manejo de errores. Esto es especialmente útil cuando necesitamos simular el comportamiento de un navegador o acceder a recursos que requieren configuraciones específicas en la solicitud.
Por ejemplo, para obtener el contenido de una página web y analizarlo con Beautiful Soup:
import requests
from bs4 import BeautifulSoup
# Realizar una solicitud GET a la página deseada
url = 'https://www.ejemplo.com'
respuesta = requests.get(url)
# Verificar que la solicitud fue exitosa
if respuesta.status_code == 200:
# Crear el objeto BeautifulSoup con el contenido HTML
soup = BeautifulSoup(respuesta.content, 'html.parser')
# Extraer información específica
titulo = soup.find('title').text
print(f'Título de la página: {titulo}')
else:
print('No se pudo obtener el contenido de la página.')
En este ejemplo, utilizamos requests.get() para obtener el contenido de la página y luego BeautifulSoup para analizarlo. Es importante verificar el código de estado HTTP para asegurarnos de que la solicitud fue exitosa antes de continuar con el análisis.
Una práctica recomendada es personalizar las cabeceras HTTP para simular un navegador real y evitar bloqueos por parte del servidor. Una cabecera comúnmente modificada es el User-Agent, que identifica el tipo de cliente que realiza la solicitud.
# Definir cabeceras personalizadas
cabeceras = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/115.0.0.0 Safari/537.36'
}
# Realizar la solicitud GET con las cabeceras personalizadas
respuesta = requests.get(url, headers=cabeceras)
Al especificar el User-Agent, es más probable que el servidor responda de manera favorable, ya que muchas veces bloquean solicitudes que parecen automáticas o de bots.
El manejo de tiempos de espera es crucial para evitar que nuestro programa se quede colgado en caso de que el servidor no responda:
# Realizar la solicitud con un tiempo de espera de 10 segundos
respuesta = requests.get(url, headers=cabeceras, timeout=10)
Es recomendable manejar excepciones para capturar errores y mantener la robustez del programa:
try:
respuesta = requests.get(url, headers=cabeceras, timeout=10)
respuesta.raise_for_status()
except requests.exceptions.HTTPError as errh:
print('Error HTTP:', errh)
except requests.exceptions.ConnectionError as errc:
print('Error de conexión:', errc)
except requests.exceptions.Timeout as errt:
print('Tiempo de espera agotado:', errt)
except requests.exceptions.RequestException as err:
print('Error inesperado:', err)
Al manejar adecuadamente las excepciones, podemos identificar problemas específicos y tomar acciones apropiadas.
Para optimizar las solicitudes y mantener ciertos parámetros entre ellas, es útil utilizar una sesión de Requests:
# Crear una sesión
sesion = requests.Session()
# Actualizar las cabeceras de la sesión
sesion.headers.update(cabeceras)
# Realizar múltiples solicitudes con la misma sesión
respuesta1 = sesion.get('https://www.ejemplo.com/pagina1')
respuesta2 = sesion.get('https://www.ejemplo.com/pagina2')
Al utilizar una sesión, mantenemos conexiones persistentes, lo que puede mejorar la eficiencia y permitir el manejo de cookies.
Otro aspecto a considerar es el manejo de la codificación de la respuesta. Requests intenta determinar automáticamente la codificación adecuada, pero podemos especificarla manualmente si es necesario:
# Establecer la codificación correcta
respuesta.encoding = 'utf-8'
Esto es importante al trabajar con páginas que utilizan codificaciones distintas y para asegurar que Beautiful Soup procese correctamente el contenido.
En ocasiones, es útil inspeccionar y manipular las cookies enviadas por el servidor. Con Requests, podemos acceder a ellas fácilmente:
# Acceder a las cookies de la respuesta
cookies = respuesta.cookies
# Utilizar las cookies en una solicitud posterior
respuesta2 = sesion.get('https://www.ejemplo.com/otra-pagina', cookies=cookies)
El uso de Requests también nos permite manejar parámetros de consulta en las URLs de manera cómoda:
# Definir los parámetros de la consulta
parametros = {'busqueda': 'python', 'pagina': 2}
# Realizar la solicitud GET con parámetros
respuesta = requests.get('https://www.ejemplo.com/buscar', params=parametros)
Esto es útil cuando trabajamos con páginas que utilizan parámetros en la URL para filtrar o paginar contenido.
Para sitios que requieren el uso de proxy, Requests permite su configuración de manera sencilla:
# Configurar el proxy
proxies = {
'http': 'http://usuario:contraseña@proxyservidor:puerto',
'https': 'https://usuario:contraseña@proxyservidor:puerto'
}
# Realizar la solicitud a través del proxy
respuesta = requests.get(url, proxies=proxies)
El uso de proxies puede ser esencial cuando necesitamos enviar solicitudes desde diferentes direcciones IP o cumplir con políticas de red específicas.
En algunos casos, es necesario descargar archivos como imágenes, documentos PDF o archivos de datos. Requests facilita esta tarea:
# URL del archivo a descargar
url_archivo = 'https://www.ejemplo.com/archivo.pdf'
# Realizar la solicitud GET
respuesta = requests.get(url_archivo, headers=cabeceras, stream=True)
# Verificar que la solicitud fue exitosa
if respuesta.status_code == 200:
# Guardar el archivo en disco
with open('archivo.pdf', 'wb') as fichero:
for trozo in respuesta.iter_content(chunk_size=8192):
fichero.write(trozo)
print('Archivo descargado exitosamente.')
else:
print('No se pudo descargar el archivo.')
Al utilizar stream=True
, evitamos cargar todo el contenido en memoria, lo cual es crucial para archivos grandes.
La combinación de Requests con Beautiful Soup nos proporciona una herramienta poderosa para realizar web scraping. Al aprovechar las capacidades de Requests para gestionar las solicitudes HTTP y manejar aspectos como cabeceras, cookies, sesiones y proxies, podemos enfocarnos en extraer y procesar la información relevante con Beautiful Soup.
Acceso y scraping de contenido detrás de autenticación
Acceder y extraer información de sitios web protegidos por autenticación presenta desafíos adicionales en el proceso de web scraping. Estos sitios restringen su contenido a usuarios autenticados, lo que implica que nuestras herramientas deben simular con precisión una sesión de usuario legítima para acceder a los datos requeridos.
Una consideración clave es que muchas aplicaciones web implementan mecanismos de protección anti-scraping y medidas de seguridad avanzadas para prevenir accesos no autorizados. Por ello, es fundamental abordar este proceso de manera ética y dentro de los términos y condiciones establecidos por el sitio.
Para acceder al contenido protegido, es esencial replicar fielmente el flujo de autenticación que un usuario real seguiría. Esto puede incluir varios pasos, como gestionar tokens CSRF que cambian dinámicamente, manejar redirecciones o resolver desafíos de seguridad adicionales.
Un enfoque eficaz es aprovechar la librería requests
combinada con Beautiful Soup para manejar solicitudes HTTP y analizar el contenido. Sin embargo, en situaciones más complejas, puede ser necesario utilizar herramientas como requests-html
o Playwright
que permiten ejecutar JavaScript en el lado del cliente, aunque en este contexto nos centraremos en requests
.
Para comenzar, es necesario identificar todos los parámetros y cabeceras que el sitio web utiliza durante el proceso de autenticación. Esto puede implicar inspeccionar las solicitudes en el navegador mediante las herramientas de desarrollo para capturar detalles como tokens ocultos o valores de sesión.
Por ejemplo, algunos sitios generan tokens de sesión o tokens anti-CSRF que deben enviarse en cada solicitud. Estos tokens suelen encontrarse dentro del código HTML como campos ocultos:
import requests
from bs4 import BeautifulSoup
# Crear una sesión persistente
sesion = requests.Session()
# Obtener la página de inicio de sesión
url_login = 'https://www.ejemplo.com/login'
respuesta = sesion.get(url_login)
# Analizar el HTML para extraer el token CSRF
soup = BeautifulSoup(respuesta.text, 'html.parser')
token_csrf = soup.find('input', {'name': 'csrf_token'})['value']
En este fragmento, hemos extraído el token CSRF necesario para autenticarnos. Este paso es crucial, ya que enviar una solicitud sin este token a menudo resultará en un fallo de autenticación.
Una vez recolectados todos los datos necesarios, procedemos a enviar el formulario de autenticación:
# Datos de inicio de sesión incluyendo el token CSRF
datos_login = {
'usuario': 'mi_usuario',
'contrasena': 'mi_contrasena',
'csrf_token': token_csrf
}
# Enviar la solicitud POST para autenticarse
respuesta_login = sesion.post(url_login, data=datos_login)
Tras autenticarnos correctamente, la sesión persistente mantiene las cookies de autenticación que nos permitirán acceder al contenido protegido.
Sin embargo, algunos sitios implementan mecanismos adicionales como huellas digitales del navegador o verificaciones del agente de usuario. Por ello, es recomendable establecer las cabeceras adecuadas para simular un navegador real:
cabeceras = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/113.0.0.0 Safari/537.36',
'Referer': url_login
}
sesion.headers.update(cabeceras)
Al actualizar las cabeceras de la sesión, aumentamos la probabilidad de que el servidor acepte nuestras solicitudes como válidas.
Cuando accedemos a páginas protegidas, es posible que necesitemos manejar redirecciones o comprobar estados de autenticación:
# Acceder al contenido protegido
url_protegida = 'https://www.ejemplo.com/area-protegida'
respuesta_protegida = sesion.get(url_protegida, allow_redirects=False)
# Verificar si somos redirigidos al login nuevamente
if respuesta_protegida.status_code == 302:
print('No autenticado. Verifique sus credenciales.')
else:
soup_protegida = BeautifulSoup(respuesta_protegida.text, 'html.parser')
contenido = soup_protegida.find('div', class_='contenido')
print(contenido.text)
En este caso, al establecer allow_redirects=False
, podemos detectar si el servidor nos redirige al inicio de sesión, lo que indicaría que la autenticación no fue exitosa.
Otro desafío común es la expiración de la sesión. Algunos sitios configuran las sesiones para que expiren después de cierto tiempo o inactividad. Para manejar esto, es posible implementar lógica que detecte la expiración y reautentique automáticamente:
def acceder_contenido_protegido(sesion):
url_protegida = 'https://www.ejemplo.com/area-protegida'
respuesta = sesion.get(url_protegida)
if 'Inicio de sesión' in respuesta.text:
print('Sesión expirada, reautenticando...')
autenticarse(sesion)
return acceder_contenido_protegido(sesion)
else:
return respuesta
def autenticarse(sesion):
# Proceso de autenticación similar al anterior
# ...
pass
# Uso de la función
respuesta_final = acceder_contenido_protegido(sesion)
Implementando funciones recursivas o bucles, podemos garantizar el acceso continuo al contenido, manejando la reautenticación cuando sea necesario.
Es importante también considerar que algunos sitios utilizan CAPTCHAs como medida de seguridad. Resolver CAPTCHAs automáticamente es una práctica que puede estar prohibida y plantea cuestiones éticas y legales. Por lo tanto, se recomienda evitar sitios que implementen este tipo de protección o interactuar con ellos únicamente dentro de lo permitido.
Para una gestión más avanzada de las sesiones y autenticaciones complejas, podemos almacenar y reutilizar las cookies de sesión. Por ejemplo, guardando las cookies en un archivo:
import pickle
# Guardar cookies en un archivo
with open('cookies.pkl', 'wb') as f:
pickle.dump(sesion.cookies, f)
# Cargar cookies desde un archivo
with open('cookies.pkl', 'rb') as f:
sesion.cookies.update(pickle.load(f))
Esta técnica permite mantener la sesión activa entre ejecuciones del script. Sin embargo, es crucial manejar estos datos con cuidado, ya que las cookies pueden contener información sensible.
Ejercicios de esta lección Autenticación y acceso a recursos protegidos
Evalúa tus conocimientos de esta lección Autenticación y acceso a recursos protegidos con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Polimorfismo
Clases y objetos
Listas
Estructuras de control
Diccionarios
Importar módulos y paquetes
Módulo math
Operadores
OOP en python
Estructuras de control
Instalación de Python y creación de proyecto
Listas
Estructuras de control
Encapsulación
Clases y objetos
Encapsulación
Tipos de datos
Crear módulos y paquetes
Herencia de clases
Tuplas
Crear módulos y paquetes
Herencia
Módulo datetime
Excepciones
Operadores
Funciones lambda
Importar módulos y paquetes
Clases y objetos
Diccionarios
Módulo os
Listas
Conjuntos
Funciones lambda
Tuplas
Módulo json
Operadores
Variables
Tipos de datos
Diccionarios en Python
Conjuntos
Módulo math
Excepciones
Módulo csv
Gestor de tareas CRUD
Funciones Python
Módulo json
Tipos de datos
Módulo datetime
Herencia
Análisis de datos de ventas con Pandas
Funciones
Funciones Python
Variables
Módulo csv
Introducción a Python
Polimorfismo
Módulo os
Todas las lecciones de Python
Accede a todas las lecciones de Python y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Python
Introducción Y Entorno
Instalación Y Creación De Proyecto
Introducción Y Entorno
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Funciones Lambda
Programación Funcional
Clases Y Objetos
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Listas
Estructuras De Datos
Tuplas
Estructuras De Datos
Diccionarios
Estructuras De Datos
Conjuntos
Estructuras De Datos
Módulo Csv
Biblioteca Estándar
Módulo Json
Biblioteca Estándar
Módulo Datetime
Biblioteca Estándar
Módulo Math
Biblioteca Estándar
Módulo Os
Biblioteca Estándar
Importar Módulos Y Paquetes
Paquetes Y Módulos
Crear Módulos Y Paquetes
Paquetes Y Módulos
Instalación Beautiful Soup
Web Scraping
Sintaxis General De Beautiful Soup
Web Scraping
Tipos De Selectores
Web Scraping
Web Scraping De Html
Web Scraping
Web Scraping Para Ciencia De Datos
Web Scraping
Autenticación Y Acceso A Recursos Protegidos
Web Scraping
Combinación De Selenium Con Beautiful Soup
Web Scraping
Acceso A Datos Con Mysql, Pymongo Y Pandas
Acceso A Bases De Datos
Certificados de superación de Python
Supera todos los ejercicios de programación del curso de Python y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
Objetivos de aprendizaje de esta lección
- Comprender el uso de cookies para mantener sesiones en web scraping.
- Administrar tokens de autenticación como JWT.
- Automatizar el inicio de sesión y manejo de formularios de autenticación.
- Integrar Beautiful Soup con Requests para acceder a recursos protegidos.
- Entender la gestión de autenticación básica, digest y mediante tokens.
- Desarrollar habilidades prácticas en el manejo de errores y time-outs.