Saltar a contenido

Guía del shell interactivo de Scrapling

Un entorno REPL para extraer datos web, pensado para desarrolladores y profesionales de datos

El shell interactivo de Scrapling es un entorno basado en IPython, preparado para extraer datos web. Da acceso inmediato a todas las funciones de Scrapling, atajos útiles, gestión automática de páginas y herramientas como la conversión de comandos curl.

Requisitos previos

  1. Lee la página de conceptos básicos de los fetchers para entender qué es el objeto Response y qué fetcher usar.
  2. Lee la página de selección de elementos para aprender a buscar y extraer elementos de un objeto Selector/Response.
  3. Lee la página de clases principales para conocer las propiedades y los métodos que la clase Response hereda de Selector.
  4. Lee al menos una página de la sección de fetchers para las solicitudes que usarás aquí: solicitudes HTTP u obtención con navegador.

¿Por qué usar el shell interactivo?

Con el shell interactivo puedes explorar y probar al momento, sin tener que editar y ejecutar un script en cada intento. Es útil para:

  • Crear prototipos rápidos: Prueba estrategias de extracción al instante.
  • Explorar datos: Navega por sitios web y extrae datos de forma interactiva.
  • Aprender Scrapling: Prueba sus funciones en tiempo real.
  • Depurar scrapers: Revisa las solicitudes y sus resultados paso a paso.
  • Convertir procesos: Convierte un comando curl de las DevTools del navegador en una solicitud de Fetcher con una sola línea.

Primeros pasos

Iniciar el shell

# Start the interactive shell
scrapling shell

# Execute code and exit (useful for scripting)
scrapling shell -c "get('https://quotes.toscrape.com'); print(len(page.css('.quote')))"

# Set logging level
scrapling shell --loglevel info

Al abrirlo, verás el banner de Scrapling y podrás empezar a extraer datos, como en el vídeo anterior:

# No imports needed - everything is ready!
get('https://news.ycombinator.com')

# Explore the page structure
page.css('a')[:5]  # Look at first 5 links

# Refine your selectors
stories = page.css('.titleline>a')
len(stories)  # 30

# Extract specific data
for story in stories[:3]:
    title = story.text
    url = story['href']
    print(f"{title}: {url}")

# Try different approaches
titles = page.css('.titleline>a::text')  # Direct text extraction
urls = page.css('.titleline>a::attr(href)')  # Direct attribute extraction

Atajos incluidos

El shell ofrece atajos para evitar código repetido:

  • get(url, **kwargs) - Solicitud HTTP GET (en lugar de Fetcher.get).
  • post(url, **kwargs) - Solicitud HTTP POST (en lugar de Fetcher.post).
  • put(url, **kwargs) - Solicitud HTTP PUT (en lugar de Fetcher.put).
  • delete(url, **kwargs) - Solicitud HTTP DELETE (en lugar de Fetcher.delete).
  • fetch(url, **kwargs) - Obtención con un navegador Stealthy (en lugar de StealthyFetcher.fetch).

Las clases más usadas están disponibles sin importarlas, entre ellas Fetcher, AsyncFetcher, StealthyFetcher y Selector.

Gestión automática de páginas

El shell lleva un registro de tus solicitudes y páginas:

  • Acceso a la página actual

    page y response se actualizan de forma automática con la última página obtenida:

    get('https://quotes.toscrape.com')
    # 'page' and 'response' both refer to the last fetched page
    page.url  # 'https://quotes.toscrape.com'
    response.status  # Prints 200; Same as page.status
    
  • Historial de páginas

    pages conserva las últimas cinco páginas en un objeto Selectors:

    get('https://site1.com')
    get('https://site2.com')
    get('https://site3.com')
    
    # Access last 5 pages
    len(pages)  # `Selectors` object with `page` history -> 3
    pages[0].url  # First page in history -> 'https://site1.com'
    pages[-1].url  # Most recent page -> 'https://site3.com'
    
    # Work with historical pages
    for i, old_page in enumerate(pages):
        print(f"Page {i}: {old_page.url} - {old_page.status}")
    

Otros comandos útiles

Ver la página

Abre las páginas obtenidas en tu navegador:

get('https://quotes.toscrape.com')
view(page)  # Opens the page HTML in your default browser

Integración con comandos curl

El shell incluye las funciones uncurl y curl2fetcher para convertir comandos curl de las DevTools del navegador en solicitudes de Fetcher.

Primero, copia una solicitud como comando curl:

Copiar una solicitud como comando curl desde Chrome

  • Convertir un comando curl en un objeto de solicitud

    curl_cmd = '''curl 'https://scrapling.requestcatcher.com/post' \
      -X POST \
      -H 'Content-Type: application/json' \
      -d '{"name": "test", "value": 123}' '''
    
    request = uncurl(curl_cmd)
    request.method  # -> 'post'
    request.url  # -> 'https://scrapling.requestcatcher.com/post'
    request.headers  # -> {'Content-Type': 'application/json'}
    
  • Ejecutar un comando curl directamente

    # Convert and execute in one step
    curl2fetcher(curl_cmd)
    page.status  # -> 200
    

Funciones de IPython

El shell hereda todas las funciones de IPython:

# Magic commands
%time page = get('https://example.com')  # Time execution
%history  # Show command history
%save filename.py 1-10  # Save commands 1-10 to file

# Tab completion works everywhere
page.c<TAB>  # Shows: css, cookies, headers, etc.
Fetcher.<TAB>  # Shows all Fetcher methods

# Object inspection
get? # Show get documentation

Ejemplos

Estos son algunos ejemplos generados con IA:

Recopilar datos de tiendas en línea

# Start with product listing page
catalog = get('https://shop.example.com/products')

# Find product links
product_links = catalog.css('.product-link::attr(href)').getall()
print(f"Found {len(product_links)} products")

# Sample a few products first
for link in product_links[:3]:
    product = get(catalog.urljoin(link))
    name = product.css('.product-name::text').get('')
    price = product.css('.price::text').get('')
    print(f"{name}: {price}")

# Scale up with sessions for efficiency
from scrapling.fetchers import FetcherSession
with FetcherSession() as session:
    products = []
    for link in product_links:
        product = session.get(catalog.urljoin(link))
        products.append({
            'name': product.css('.product-name::text').get(''),
            'price': product.css('.price::text').get(''),
            'url': link
        })

Integrar y probar API

>>> # Test API endpoints interactively
>>> response = get('https://jsonplaceholder.typicode.com/posts/1')
>>> response.json()
{'userId': 1, 'id': 1, 'title': 'sunt aut...', 'body': 'quia et...'}

>>> # Test POST requests
>>> new_post = post('https://jsonplaceholder.typicode.com/posts', 
...                 json={'title': 'Test Post', 'body': 'Test content', 'userId': 1})
>>> new_post.json()['id']
101

>>> # Test with different data
>>> updated = put('https://jsonplaceholder.typicode.com/posts/1',
...               json={'title': 'Updated Title'})

Obtener ayuda

Si necesitas más ayuda de la que ofrece la terminal, consulta:

¡Eso es todo! Disfruta extrayendo datos. El shell hace que obtener datos web sea tan fácil como una conversación.