Skip to content

Razdnut/web_scraper

Repository files navigation

Web Scraper - Guida Completa

Un toolkit completo per il web scraping in Python con supporto per siti statici e dinamici.

📋 Caratteristiche

  • Scraping Base: Per siti HTML statici usando requests e BeautifulSoup
  • Scraping Avanzato: Per siti con JavaScript usando Selenium
  • Estrazione Dati Strutturati: Supporto per tabelle, liste e dati complessi
  • Filtri Link Mirati: Ricerca per parola chiave o estensione di file (es. PDF, CSV)
  • Export Multipli: Salvataggio in JSON, CSV e altri formati
  • Rate Limiting: Controllo automatico della velocità di scraping
  • Gestione Errori: Retry automatico e logging degli errori
  • Esempi Pratici: Template pronti per casi d'uso comuni

🚀 Installazione

1. Installa Python

Assicurati di avere Python 3.8 o superiore installato.

2. Installa le dipendenze

pip install -r requirements.txt

3. Installa ChromeDriver (per scraping avanzato)

Per usare Selenium, devi installare ChromeDriver:

Windows:

# Scarica da: https://chromedriver.chromium.org/
# Oppure usa chocolatey:
choco install chromedriver

Linux:

sudo apt-get install chromium-chromedriver

Mac:

brew install chromedriver

📖 Utilizzo Base

Scraper Semplice (Siti Statici)

from scraper_base import WebScraperBase

# Inizializza lo scraper
scraper = WebScraperBase("https://example.com")

# Recupera una pagina
soup = scraper.get_page("https://example.com/articoli")

# Estrai dati
selectors = {
    'titolo': 'h2.title',
    'descrizione': 'p.description',
    'data': 'span.date'
}
dati = scraper.extract_data(soup, selectors)

# Salva i risultati
scraper.save_to_json(dati, 'risultati.json')
scraper.save_to_csv(dati, 'risultati.csv')

Filtrare Link per Keyword/Estensione

from scraper_base import WebScraperBase

scraper = WebScraperBase("https://example.com")
soup = scraper.get_page("https://example.com/documenti")

matches = scraper.filter_links(
    soup,
    selector='a.download',
    keyword="report",
    file_extension="pdf"
)

for match in matches:
    print(match["link"], match["match"])

Nella dashboard Streamlit trovi la sezione Filtri Keyword / Estensione: puoi lasciare vuoti i selettori CSS e usare solo i filtri per individuare rapidamente documenti (.pdf, .csv, ecc.) o link che contengono una determinata parola chiave.

Scraper Avanzato (Siti con JavaScript)

from scraper_avanzato import WebScraperAvanzato

# Usa il context manager per chiudere automaticamente il browser
with WebScraperAvanzato(headless=True) as scraper:
    # Carica la pagina
    scraper.get_page("https://example.com", wait_for_selector=".content")
    
    # Scrolla per caricare contenuti dinamici
    scraper.scroll_to_bottom(pause_time=1.0, max_scrolls=5)
    
    # Estrai dati
    selectors = {
        'titolo': 'h2.article-title',
        'autore': 'span.author'
    }
    dati = scraper.extract_structured_data(selectors)
    
    # Salva
    scraper.save_to_json(dati, 'risultati_avanzati.json')

📚 Esempi Pratici

Il file esempi_pratici.py contiene template pronti per:

1. Scraping di Notizie

from esempi_pratici import ScraperNotizie

scraper = ScraperNotizie("https://sito-notizie.com")
articoli = scraper.scrape_articoli(
    url="https://sito-notizie.com/tecnologia",
    max_pages=5
)
scraper.save_to_json(articoli, 'notizie.json')

2. Scraping E-commerce

from esempi_pratici import ScraperEcommerce

with ScraperEcommerce(headless=True) as scraper:
    prodotti = scraper.scrape_prodotti(
        url="https://shop.com/elettronica",
        categoria="Elettronica"
    )
    scraper.save_to_json(prodotti, 'prodotti.json')

3. Scraping Tabelle HTML

from esempi_pratici import ScraperTabelle

scraper = ScraperTabelle("https://example.com")
dati = scraper.scrape_tabella(
    url="https://example.com/statistiche",
    table_selector='table.data-table'
)
scraper.save_to_json(dati, 'tabella.json')

🎯 Selettori CSS

I selettori CSS sono fondamentali per il web scraping. Ecco alcuni esempi:

# Selettore per classe
'div.article'           # <div class="article">

# Selettore per ID
'#main-content'         # <div id="main-content">

# Selettore per attributo
'a[href*="articolo"]'   # Link che contengono "articolo"

# Selettori annidati
'div.container > h2'    # h2 figlio diretto di div.container

# Pseudo-selettori
'li:first-child'        # Primo elemento li
'tr:nth-child(2)'       # Seconda riga

🛠️ Funzionalità Avanzate

Gestione dei Cookie

scraper = WebScraperBase("https://example.com")
scraper.session.cookies.set('nome_cookie', 'valore')

Headers Personalizzati

headers = {
    'User-Agent': 'Mozilla/5.0...',
    'Accept-Language': 'it-IT,it;q=0.9',
    'Referer': 'https://google.com'
}
scraper = WebScraperBase("https://example.com", headers=headers)

Autenticazione

with WebScraperAvanzato() as scraper:
    scraper.get_page("https://example.com/login")
    scraper.fill_input('input[name="username"]', 'mio_username')
    scraper.fill_input('input[name="password"]', 'mia_password')
    scraper.click_element('button[type="submit"]')
    time.sleep(3)  # Attendi il login

Scroll Infinito

with WebScraperAvanzato() as scraper:
    scraper.get_page("https://example.com/feed")
    scraper.scroll_to_bottom(pause_time=2.0, max_scrolls=10)

Screenshot

with WebScraperAvanzato() as scraper:
    scraper.get_page("https://example.com")
    scraper.take_screenshot('screenshot.png')

Esecuzione JavaScript

with WebScraperAvanzato() as scraper:
    scraper.get_page("https://example.com")
    result = scraper.execute_script('return document.title')

⚠️ Best Practices

1. Rispetta i robots.txt

# Controlla sempre il file robots.txt del sito
# https://example.com/robots.txt

2. Usa Delay tra le Richieste

import time

for url in urls:
    scraper.get_page(url)
    time.sleep(2)  # Pausa di 2 secondi

3. Gestisci gli Errori

try:
    soup = scraper.get_page(url)
    if soup:
        dati = scraper.extract_data(soup, selectors)
except Exception as e:
    print(f"Errore: {e}")

4. Usa User-Agent Realistici

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

5. Limita il Numero di Richieste

# Non fare troppe richieste consecutive
# Usa pause e limita il numero di pagine
max_pages = 10  # Limita a 10 pagine

🔍 Debugging

Ispeziona il Sorgente HTML

soup = scraper.get_page(url)
print(soup.prettify())  # Stampa HTML formattato

Verifica i Selettori

# Testa i selettori nel browser:
# 1. Apri DevTools (F12)
# 2. Console
# 3. document.querySelectorAll('tuo-selettore')

Modalità Non-Headless

# Vedi cosa fa il browser
scraper = WebScraperAvanzato(headless=False)

📊 Export Dati

JSON

scraper.save_to_json(dati, 'output.json')

CSV

scraper.save_to_csv(dati, 'output.csv')

Pandas DataFrame

import pandas as pd

df = pd.DataFrame(dati)
df.to_excel('output.xlsx', index=False)
df.to_csv('output.csv', index=False)

⚖️ Considerazioni Legali

  • ✅ Leggi sempre i Termini di Servizio del sito
  • ✅ Rispetta il file robots.txt
  • ✅ Non sovraccaricare i server con troppe richieste
  • ✅ Non scrapare dati personali senza permesso
  • ✅ Usa i dati solo per scopi legittimi

🐛 Risoluzione Problemi

ChromeDriver non trovato

# Assicurati che ChromeDriver sia nel PATH
# Oppure specifica il percorso:
from selenium.webdriver.chrome.service import Service
service = Service('/path/to/chromedriver')
driver = webdriver.Chrome(service=service)

Timeout

# Aumenta il tempo di attesa
scraper = WebScraperAvanzato(wait_time=30)

Elementi non trovati

# Verifica il selettore CSS
# Usa wait espliciti
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "tuo-selettore"))
)

📝 Licenza

Questo progetto è fornito "as is" per scopi educativi.

🤝 Contributi

Sentiti libero di modificare e migliorare il codice secondo le tue esigenze!

📧 Supporto

Per domande o problemi, consulta la documentazione delle librerie:

About

Small webscraper Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published