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.