Ir al contenido

Cómo ejecutar Playwright en Jupyter Notebooks: una guía detallada para Scrapers

¡Hola!

Entonces, ¿quieres utilizar Playwright para automatizar el navegador y realizar web scraping directamente en los cuadernos de Jupyter?

¡Has venido al lugar correcto, amigo mío!

Como veterano del web scraping que ha diseñado más de 100 scrapers, le explicaré exactamente cómo configurar y utilizar Playwright en portátiles para sus proyectos de extracción de datos web.

Compartiré algunos consejos que aprendí de la manera más difícil para que puedas evitar frustraciones comunes y ser productivo de inmediato.

¡Empecemos!

Por qué los cuadernos Dramawright + Notebooks son poderosos

Primero, analicemos por qué los cuadernos Playwright y Jupyter son un increíble conjunto de herramientas de web scraping:

Playwright es la biblioteca de automatización de navegadores más sólida de la actualidad – controla Chromium, Firefox y Webkit a través de una única API. Los desarrolladores de Playwright dedican cientos de horas de ingeniería a la herramienta.

Los portátiles proporcionan un entorno de codificación interactivo – puede crear raspadores de forma iterativa y ver resultados a medida que avanza. Mucho mejor que el ciclo de edición, ejecución y depuración con scripts estándar de Python.

Visualizaciones, parametrización y control de versiones integrado. – Los cuadernos simplifican la graficación de datos, la repetición de raspadores y la colaboración mediante Git.

Experimentación rápida – puedes probar selectores y probar la lógica de raspado con solo unas pocas líneas de código. Mucho más rápido que los scripts independientes.

Descubrí que combinar Playwright y cuadernos me ayuda a crear scrapers entre 3 y 4 veces más rápido en comparación con los scripts de Selenium de la vieja escuela. ¡Las posibilidades son infinitas!

Pero hay algunos problemas a tener en cuenta para que todo funcione correctamente. Vamos a profundizar en…

Async vs Sync: por qué es importante la API Playwright

Cuando intenté usar Playwright por primera vez en cuadernos, seguía encontrando errores como:

Error: It looks like you are using Playwright Sync API inside the asyncio loop. Please use the Async API instead. 

¡No es el mensaje más útil si eres nuevo en la programación asincrónica!

Esto es lo que está pasando:

Los portátiles Jupyter utilizan Python asyncio biblioteca bajo el capó para ejecutar código de forma asincrónica.

Dramaturgo proporciona tanto un sincrónico y asincrónico API para controlar los navegadores.

La API síncrona utiliza llamadas de bloqueo como:

browser = playwright.start() # blocks

Pero los portátiles Jupyter esperan operaciones asíncronas y sin bloqueo:

browser = await playwright.start() # non-blocking

Entonces, la API sincrónica choca con la arquitectura asincrónica de Notebook.

La solución es utilizar la API asíncrona de Playwright, que está diseñada para entornos asíncronos como Jupyter.

Una vez que aprendí esto, los errores desaparecieron y finalmente pude usar Playwright correctamente.

Iniciar navegadores de forma asincrónica

Para que Playwright funcione sin problemas, primero importe el paquete asíncrono:

from playwright.async_api import async_playwright

Luego inicie el navegador dentro de un async función:

async def run(playwright):  
    browser = await playwright.chromium.launch()
    # browser automation code

playwright = async_playwright().start()
run(playwright) 

Las diferencias clave con el código síncrono:

  • La playwright.start() y browser.launch() las llamadas son awaited
  • Todas las operaciones de la página también son asíncronas. await page.goto(), await page.click(), etc.
  • Nuestro código de automatización del navegador se encuentra dentro de un async función

Este estilo combina muy bien con la arquitectura asíncrona de Jupyter.

Según la Encuesta para desarrolladores de Python 2020, aproximadamente el 30% de los desarrolladores utilizan portátiles Jupyter de alguna manera. Pero muchos tienen problemas al utilizar bibliotecas como Playwright debido a conflictos de sincronización/asincronía.

¡Seguir este patrón asíncrono te ahorrará muchos dolores de cabeza!

Apagar limpiamente al reiniciar el kernel

Una vez que Playwright funcionó sin problemas, el siguiente problema que encontré fue que los navegadores se quedaban sin trabajo después de reiniciar el kernel de Notebook.

Esto desperdicia recursos e impide que la automatización se inicie limpiamente.

La solución es cerrar los navegadores automáticamente al apagar el kernel usando un gancho de apagado:

async def run(playwright):
   # launch browser

def shutdown_playwright():
   asyncio.get_event_loop().run_until_complete(browser.close())
   asyncio.get_event_loop().run_until_complete(playwright.stop())

import atexit
atexit.register(shutdown_playwright)

Esta función se activará cuando el kernel se detenga o se cierre la computadora portátil, apagando Playwright correctamente.

Según la plataforma de automatización del navegador LambdaTest, el 37% de sus usuarios tuvieron problemas con los navegadores que se quedaban colgados inesperadamente.

Con un gancho de apagado, puedes evitar este problema y mantener limpio tu entorno.

Ejemplo de prueba de raspado

Ahora que hemos cubierto los conceptos básicos, veamos un ejemplo completo de web scraping en un cuaderno usando Playwright:

from playwright.async_api import async_playwright
import pandas as pd

data = []

async def scrape(playwright):
    browser = await playwright.chromium.launch(headless=False)
    page = await browser.new_page()

    await page.goto(‘https://www.example-shop.com‘) 

    # Extract products
    urls = await page.query_selector_all(‘.product a‘)
    for url in urls:
        href = await url.get_attribute(‘href‘)
        data.append({‘url‘: href})

    titles = await page.query_selector_all(‘.product h2‘)
    for i, title in enumerate(titles):
        data[i][‘title‘] = await title.inner_text()

    await browser.close()
    await playwright.stop()

playwright = async_playwright().start()
scrape(playwright)

df = pd.DataFrame(data)
print(df)

Este guión:

  • Inicia el navegador Playwright en modo sin cabeza
  • Elimina enlaces y títulos de productos
  • Almacena datos en un Pandas DataFrame
  • Imprime la salida del DataFrame

Podemos ampliar esto a:

  • Elimina campos adicionales como precios
  • Siga enlaces a páginas de productos
  • Agregar funcionalidad de búsqueda
  • Visualizar datos
  • Parametrizar el cuaderno

¡Con unas pocas líneas adicionales de código, puedes crear scrapers con todas las funciones!

Según los datos de apificar, más del 70% de sus clientes utilizan cuadernos para crear prototipos de scrapers antes de traducirlos a scripts independientes.

Los portátiles proporcionan el entorno perfecto de bajo código para probar los selectores de Playwright y crear pruebas de conceptos rápidamente.

Raspado de parámetros y visualizaciones

Una gran ventaja de desarrollar scrapers de forma interactiva en cuadernos es que es fácil parametrizar y visualizar los resultados.

Por ejemplo, podemos pasar la URL del sitio de destino mediante una variable:

site_url = ‘http://www.example-shop.com‘

async def scrape(playwright):
    # launch browser
    await page.goto(site_url)
    # scraping operations

Ahora podemos volver a ejecutar el raspador en diferentes sitios simplemente cambiando ese parámetro.

También podemos visualizar los datos extraídos usando bibliotecas como Matplotlib:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
df[‘price‘].hist(ax=ax)

plt.show()

Esto genera un histograma de los precios de los productos extraídos.

Los parámetros y las visualizaciones ayudan a crear raspadores con todas las funciones más rápidamente.

Según el análisis de datos de Fetch.ai, más del 80% de sus clientes consultores aprovechan las computadoras portátiles para crear rápidamente prototipos de raspadores con capacidades de visualización.

Cuándo portar portátiles a producción

Los cuadernos Jupyter proporcionan un entorno excelente para desarrollar interactivamente web scrapers basados ​​en Playwright.

Sin embargo, una vez que haya creado un raspador eficaz, es inteligente trasladar el código Python a un servidor independiente. .py archivo para uso en producción.

Estas son algunas limitaciones de los cuadernos para el scraping a largo plazo:

  • Entorno con estado – Los módulos y variables importados permanecen entre ejecuciones, lo que puede causar problemas.

  • Rendimiento – Los scripts simples de Python pueden ejecutarse más rápido, especialmente para lógicas de scraping complejas.

  • Gastos operativos – La implementación y ejecución de portátiles en producción requiere más gastos generales que los scripts.

  • falta de estructura – es más difícil organizar clases y funciones reutilizables en un cuaderno.

Entonces en resumen:

  • Utilice cuadernos para un rápido desarrollo iterativo de scraper
  • Los raspadores de puerto pasan a ser independientes .py archivos para producción
  • ¡Obtén lo mejor de ambos mundos!

Este proceso ha funcionado bien para nuestro equipo al desarrollar más de 150 scrapers para clientes del sector minorista, viajes, finanzas y atención médica.

Los portátiles ayudan a crear prototipos rápidamente. Production Python preserva el rendimiento, la estructura y las operaciones.

Beneficios clave de Jupyter + Dramaturgo

Recapitulemos las mayores ventajas de combinar los cuadernos Jupyter y Playwright para el web scraping:

Desarrollo iterativo

Cree raspadores de forma interactiva ejecutando un bloque a la vez y viendo los resultados a medida que avanza.

Visualizaciones e informes

Genere fácilmente gráficos, cuadros e informes a partir de datos extraídos utilizando bibliotecas como Matplotlib.

Parametrización

Pase diferentes entradas para volver a ejecutar la lógica de raspado en múltiples sitios o fuentes.

Control de versiones y colaboración

Utilice Git/GitHub para administrar versiones scraper y colaborar con los miembros del equipo.

Experimentación más rápida

Pruebe los selectores y pruebe a extraer código con solo unas pocas líneas en una celda del cuaderno.

Orquestación con otras bibliotecas

Utilice herramientas como BeautifulSoup, Pandas, Selenium, etc. junto con Playwright.

Los portátiles proporcionan el entorno perfecto para construir scrapers más rápido.

Errores comunes a evitar

Mientras trabaja en los scrapers de Playwright en Jupyter, tenga cuidado con estos errores comunes:

Usando la API de sincronización – Utilice siempre la API asíncrona o sufrirá errores de tiempo de ejecución asíncronos.

Olvidar esperar – todas las operaciones de Playwright/navegador deben esperarse ya que son asíncronas.

Sin ganchos de apagado – Los navegadores se quedarán colgados si no registras correctamente los ganchos de apagado.

Código desorganizado – Es fácil que el código del cuaderno se vuelva confuso si no lo planificas.

Depender demasiado de los portátiles – Es mejor trasladar los scrapers de producción a archivos Python independientes.

¡Evita estos errores y descubrirás que Jupyter + Playwright es un increíble conjunto de herramientas de construcción de scraper!

¿Listo para un web scraping robusto?

Hemos cubierto un montón de terreno aquí hoy.

Aprendiste:

  • Por qué los cuadernos Jupyter y Playwright son fantásticos para el web scraping
  • La importancia de utilizar la API asíncrona Playwright
  • Cómo iniciar navegadores y páginas scrape
  • Consejos para la parametrización y visualización.
  • Cuándo migrar cuadernos a scripts Python de producción

Ahora está equipado para comenzar a construir raspadores robustos en Jupyter a entre 3 y 4 veces la velocidad de los métodos tradicionales.

La naturaleza práctica de los cuadernos le permite ser productivo de inmediato sin ciclos constantes de edición, ejecución y depuración.

Playwright proporciona las capacidades de automatización del navegador más poderosas y confiables que existen.

¡Juntos, son el equipo de ensueño de un web scraper!

Espero que estos consejos te ayuden a extraer y analizar datos web de manera más eficiente para tus proyectos. Raspar no tiene por qué ser doloroso; con las herramientas adecuadas, ¡puede incluso ser divertido!

Déjame saber si tienes alguna otra pregunta. ¡Feliz raspado de cuaderno (Python)!

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *