
Aloísio Vítor
Image Processing Expert

SeleniumBase es un framework de Python que simplifica la automatización web y las pruebas. Amplía las capacidades de Selenium WebDriver con una API más fácil de usar, selectores avanzados, esperas automáticas y herramientas de prueba adicionales.
Antes de comenzar, asegúrese de tener Python 3 instalado en su sistema. Siga estos pasos para configurar SeleniumBase:
Instala SeleniumBase:
pip install seleniumbase
Verifica la instalación:
sbase --help
Comencemos creando un script simple que navega a quotes.toscrape.com y extrae citas y autores.

Ejemplo: Raspa las citas y sus autores de la página de inicio.
# scrape_quotes.py
from seleniumbase import BaseCase
class QuotesScraper(BaseCase):
def test_scrape_quotes(self):
self.open("https://quotes.toscrape.com/")
quotes = self.find_elements("div.quote")
for quote in quotes:
text = quote.find_element("span.text").text
author = quote.find_element("small.author").text
print(f"\"{text}\" - {author}")
if __name__ == "__main__":
QuotesScraper().main()
Ejecuta el script:
python scrape_quotes.py
Salida:
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.” - Albert Einstein
...
Para mejorar tus habilidades de raspado web, exploremos ejemplos más avanzados usando SeleniumBase.
Muchos sitios web muestran contenido en múltiples páginas. Modifiquemos nuestro script para navegar por todas las páginas y raspar citas.
# scrape_quotes_pagination.py
from seleniumbase import BaseCase
class QuotesPaginationScraper(BaseCase):
def test_scrape_all_quotes(self):
self.open("https://quotes.toscrape.com/")
while True:
quotes = self.find_elements("div.quote")
for quote in quotes:
text = quote.find_element("span.text").text
author = quote.find_element("small.author").text
print(f"\"{text}\" - {author}")
# Verifica si hay una página siguiente
if self.is_element_visible('li.next > a'):
self.click('li.next > a')
else:
break
if __name__ == "__main__":
QuotesPaginationScraper().main()
Explicación:
is_element_visible para comprobar el botón "Siguiente".Algunos sitios web cargan contenido dinámicamente utilizando AJAX. SeleniumBase puede manejar estos escenarios esperando a que los elementos se carguen.
Ejemplo: Raspa las etiquetas del sitio web, que se cargan dinámicamente.
# scrape_dynamic_content.py
from seleniumbase import BaseCase
class TagsScraper(BaseCase):
def test_scrape_tags(self):
self.open("https://quotes.toscrape.com/")
# Haz clic en el enlace 'Top Ten tags' para cargar las etiquetas dinámicamente
self.click('a[href="/tag/"]')
self.wait_for_element("div.tags-box")
tags = self.find_elements("span.tag-item > a")
for tag in tags:
tag_name = tag.text
print(f"Tag: {tag_name}")
if __name__ == "__main__":
TagsScraper().main()
Explicación:
div.tags-box se cargue para asegurar que el contenido dinámico esté disponible.wait_for_element asegura que el script no proceda hasta que el elemento esté disponible.A veces, necesitas iniciar sesión en un sitio web antes de raspar contenido. Aquí te mostramos cómo puedes manejar el envío de formularios.
Ejemplo: Iniciar sesión en el sitio web y raspar citas desde la página del usuario autenticado.
# scrape_with_login.py
from seleniumbase import BaseCase
class LoginScraper(BaseCase):
def test_login_and_scrape(self):
self.open("https://quotes.toscrape.com/login")
# Completa el formulario de inicio de sesión
self.type("input#username", "testuser")
self.type("input#password", "testpass")
self.click("input[type='submit']")
# Verifica el inicio de sesión buscando un enlace de cierre de sesión
if self.is_element_visible('a[href="/logout"]'):
print("¡Inició sesión correctamente!")
# Ahora raspa las citas
self.open("https://quotes.toscrape.com/")
quotes = self.find_elements("div.quote")
for quote in quotes:
text = quote.find_element("span.text").text
author = quote.find_element("small.author").text
print(f"\"{text}\" - {author}")
else:
print("Error de inicio de sesión.")
if __name__ == "__main__":
LoginScraper().main()
Explicación:
Nota: Dado que quotes.toscrape.com permite cualquier nombre de usuario y contraseña para demostración, podemos usar credenciales ficticias.
Los sitios web a menudo presentan datos en tablas. Aquí te mostramos cómo extraer datos de tablas.
Ejemplo: Raspa datos de una tabla (ejemplo hipotético ya que el sitio web no tiene tablas).
# scrape_table.py
from seleniumbase import BaseCase
class TableScraper(BaseCase):
def test_scrape_table(self):
self.open("https://www.example.com/table-page")
# Espera a que la tabla se cargue
self.wait_for_element("table#data-table")
rows = self.find_elements("table#data-table > tbody > tr")
for row in rows:
cells = row.find_elements("td")
row_data = [cell.text for cell in cells]
print(row_data)
if __name__ == "__main__":
TableScraper().main()
Explicación:
quotes.toscrape.com no tiene tablas, reemplaza la URL con un sitio web real que contenga una tabla.Mientras que quotes.toscrape.com no tiene CAPTCHAs, muchos sitios web del mundo real sí. Para prepararte para estos casos, demostraremos cómo integrar CapSolver en nuestro script de SeleniumBase usando la extensión de navegador CapSolver.
Descarga la extensión de CapSolver:
./capsolver_extension.Localiza el archivo de configuración:
config.json ubicado en el directorio capsolver_extension/assets.Actualiza la configuración:
enabledForcaptcha y/o enabledForRecaptchaV2 en true dependiendo de los tipos de CAPTCHA que quieras resolver.captchaMode o el reCaptchaV2Mode en "token" para la resolución automática.Ejemplo de config.json:
{
"apiKey": "YOUR_CAPSOLVER_API_KEY",
"enabledForcaptcha": true,
"captchaMode": "token",
"enabledForRecaptchaV2": true,
"reCaptchaV2Mode": "token",
"solveInvisibleRecaptcha": true,
"verbose": false
}
"YOUR_CAPSOLVER_API_KEY" con tu clave de API real de CapSolver.Para usar la extensión de CapSolver en SeleniumBase, necesitamos configurar el navegador para que cargue la extensión cuando se inicie.
Modifica tu script de SeleniumBase:
ChromeOptions de selenium.webdriver.chrome.options.Ejemplo:
from seleniumbase import BaseCase
from selenium.webdriver.chrome.options import Options as ChromeOptions
import os
class QuotesScraper(BaseCase):
def setUp(self):
super().setUp()
# Ruta a la extensión de CapSolver
extension_path = os.path.abspath('capsolver_extension')
# Configura las opciones de Chrome
options = ChromeOptions()
options.add_argument(f"--load-extension={extension_path}")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
# Actualiza el controlador con las nuevas opciones
self.driver.quit()
self.driver = self.get_new_driver(browser_name="chrome", options=options)
Asegúrate de que la ruta de la extensión sea correcta:
extension_path apunte al directorio donde descomprimiste la extensión de CapSolver.Aquí tienes un script completo que integra CapSolver en SeleniumBase para resolver CAPTCHAs automáticamente. Seguiremos usando https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php como nuestro sitio de ejemplo.
# scrape_quotes_with_capsolver.py
from seleniumbase import BaseCase
from selenium.webdriver.chrome.options import Options as ChromeOptions
import os
class QuotesScraper(BaseCase):
def setUp(self):
super().setUp()
# Ruta a la carpeta de la extensión de CapSolver
# Asegúrate de que esta ruta apunte correctamente a la carpeta de la extensión de Chrome de CapSolver
extension_path = os.path.abspath('capsolver_extension')
# Configura las opciones de Chrome
options = ChromeOptions()
options.add_argument(f"--load-extension={extension_path}")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
# Actualiza el controlador con las nuevas opciones
self.driver.quit() # Cierra cualquier instancia de controlador existente
self.driver = self.get_new_driver(browser_name="chrome", options=options)
def test_scrape_quotes(self):
# Navega al sitio de destino con reCAPTCHA
self.open("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php")
# Comprueba la presencia de CAPTCHA y resuelve si es necesario
if self.is_element_visible("iframe[src*='recaptcha']"):
# La extensión de CapSolver debería manejar el CAPTCHA automáticamente
print("CAPTCHA detectado, esperando a que la extensión de CapSolver lo resuelva...")
# Espera a que se resuelva el CAPTCHA
self.sleep(10) # Ajusta el tiempo en función del tiempo medio de resolución
# Procede con las acciones de raspado después de que se resuelva el CAPTCHA
# Ejemplo de acción: hacer clic en un botón o extraer texto
self.assert_text("reCAPTCHA demo", "h1") # Confirma el contenido de la página
def tearDown(self):
# Limpia y cierra el navegador después de la prueba
self.driver.quit()
super().tearDown()
if __name__ == "__main__":
QuotesScraper().main()
Explicación:
Método setUp:
setUp para configurar el navegador Chrome con la extensión de CapSolver antes de cada prueba.Método test_scrape_quotes:
Método tearDown:
Ejecutando el script:
python scrape_quotes_with_capsolver.py
Nota: Aunque quotes.toscrape.com no tiene CAPTCHAs, la integración de CapSolver prepara tu raspador para sitios que sí los tienen.
Reclama tu Código extra para las mejores soluciones de captcha en CapSolver: scrape. Después de canjearlo, obtendrás un bono extra del 5% después de cada recarga, sin límite de veces.

En esta guía, hemos explorado cómo realizar el raspado web usando SeleniumBase, cubriendo las técnicas básicas de raspado y ejemplos más avanzados como el manejo de la paginación, el contenido dinámico y el envío de formularios. También hemos demostrado cómo integrar CapSolver en tus scripts de SeleniumBase para resolver CAPTCHAs automáticamente, asegurando sesiones de raspado ininterrumpidas.
Aprende a resolver desafíos de AWS WAF y CAPTCHAs sin navegador. Utiliza la API de CapSolver para generar tokens y evadir códigos de estado 405.

Configurar el raspado de web en Linux con Python, proxies y manejo de CAPTCHA. Una guía práctica para desarrolladores que cubre Scrapy, Playwright, CapSolver y tuberías de datos.

Aprende qué desencadena el error de Cloudflare 1020 Acceso denegado, cómo funciona el Firewall de Aplicaciones Web y la detección de bots, y cómo los desarrolladores pueden reducir los falsos positivos en flujos de trabajo de automatización legítimos.
