In questo tutorial, impareremo a sfruttare la potenzialità di Crawlee per Python, una soluzione avanzata per crawling e scraping che offre molteplici vantaggi in termini di automazione, rendering JavaScript, gestione precisa dei dati e rappresentazione grafica del contenuto. Creeremo una pipeline completa che include:

    • Configurazione ambiente con Python
    • Generazione di un sito demo reale
    • Scraping HTML con BeautifulSoup
    • Scraping mirato con Parsel
    • Rendering JavaScript con Playwright
    • Analisi e salvataggio dei dati

Preparazione dell'Environment Crawlee

Poiché stiamo lavorando in un ambiente Python, è fondamentale importare le librerie necessarie: BeautifulSoup, Crawlee, Pydantic, Pandas, e Playwright. Utilizzeremo inoltre librerie di supporto come os, re, asyncio, e matplotlib.

Iniziamo importando le librerie principali e configurando i parametri per la pipeline:

import os

import sys

import re

import csv

import json

import time

import math

import shutil

import socket

import hashlib

import asyncio

import textwrap

import subprocess

import threading

from pathlib import Path

from functools import partial

from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler

from importlib.metadata import version, PackageNotFoundError

Gestiamo le dipendenze e verifichiamo la compatibilità delle versioni di Crawlee e Pydantic. È essenziale ottenere le versioni corrette per garantire la compatibilità tra le varie librerie:

SETUPSENTINEL = "/content/.crawleepythontutorialsetupdonev2"

def sh(command, check=True, quiet=False):

print(f"\n$ {command}")

...

if needs_setup:

print("PHASE 1: Installing compatible Crawlee + Pydantic + Playwright dependencies.")

...

Inizializzazione dei Pacchetti

Creiamo funzioni utili per l'importazione e la gestione delle librerie:

def packageversion(packagename):

try:

return version(package_name)

except PackageNotFoundError:

return None

...

def safe_slug(value):

value = re.sub(r"[^a-zA-Z0-9]+", "-", str(value)).strip("-").lower()

return value or "item"

...

Creazione del Sito Demo

Costruiamo un sito Web locale per simulare l'ambiente in cui operiamo. Questo include:

    • Pagine dei prodotti
    • Documentazione
    • Blog con collegamenti interni
    • Metadata JSON-LD

Ecco i dati principali per i prodotti:

PRODUCTS = [

{

"sku": "CRW-101",

"name": "Crawler Reliability Kit",

"category": "automation",

"price": 149.0,

"rating": 4.8,

"stock": 18,

"features": ["retry policy", "queue replay", "structured logs"],

"related": ["CRW-202", "CRW-303"],

},

{

"sku": "CRW-202",

"name": "Playwright Rendering Pack",

"category": "browser",

"price": 249.0,

"rating": 4.7,

"stock": 9,

"features": ["headless chromium", "screenshots", "dynamic DOM extraction"],

"related": ["CRW-101", "CRW-404"],

},

{

"sku": "CRW-303",

"name": "RAG Extraction Bundle",

"category": "ai-data",

"price": 199.0,

"rating": 4.9,

"stock": 13,

"features": ["clean text chunks", "metadata capture", "JSONL export"],

"related": ["CRW-101", "CRW-505"],

},

{

"sku": "CRW-404",

"name": "Anti-Fragile Session Toolkit",

"category": "resilience",

"price": 299.0,

"rating": 4.6,

"stock": 5,

"features": ["session rotation", "state recovery", "graceful failures"],

"related": ["CRW-202", "CRW-505"],

},

{

"sku": "CRW-505",

"name": "Data Export Control Plane",

"category": "storage",

"price": 179.0,

"rating": 4.5,

"stock": 21,

"features": ["datasets", "key-value store", "CSV and JSON export"],

"related": ["CRW-303", "CRW-404"],

},

]

Creiamo funzioni per generare le pagine HTML:

def layout(title, body, extrahead="", extrascript=""):

css = ...

layout_html = ...

return layout_html

Scraping con BeautifulSoup

Utilizziamo BeautifulSoupCrawler per ottenere dati HTML, come:

    • Titoli
    • Metadata
    • Anteprime testo
    • Collegamenti

Scraping mirato con Parsel

Utilizziamo CSS e XPath per l’estrazione precisa:

with ParselCrawler(maxrequestsper_crawl=5) as crawler:

@crawler.router.default_handler

async def parse_product(context):

...

Rendering JavaScript con Playwright

Utilizziamo headless Chromium per caricare i contenuti generati da JavaScript:

with PlaywrightCrawler() as crawler:

@crawler.router.default_handler

async def page_function(context):

...

Analisi e Processamento Downstream

Gli estratti vengono salvati in formati come CSV, JSON e JSONL per l’analisi o l’elaborazione successiva. Lavoriamo in parallelo e salviamo i dati in directory specifiche.