Un toolkit completo per il web scraping in Python con supporto per siti statici e dinamici.
- Scraping Base: Per siti HTML statici usando
requestseBeautifulSoup - 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
Assicurati di avere Python 3.8 o superiore installato.
pip install -r requirements.txtPer usare Selenium, devi installare ChromeDriver:
Windows:
# Scarica da: https://chromedriver.chromium.org/
# Oppure usa chocolatey:
choco install chromedriverLinux:
sudo apt-get install chromium-chromedriverMac:
brew install chromedriverfrom 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')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.
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')Il file esempi_pratici.py contiene template pronti per:
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')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')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')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 rigascraper = WebScraperBase("https://example.com")
scraper.session.cookies.set('nome_cookie', 'valore')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)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 loginwith WebScraperAvanzato() as scraper:
scraper.get_page("https://example.com/feed")
scraper.scroll_to_bottom(pause_time=2.0, max_scrolls=10)with WebScraperAvanzato() as scraper:
scraper.get_page("https://example.com")
scraper.take_screenshot('screenshot.png')with WebScraperAvanzato() as scraper:
scraper.get_page("https://example.com")
result = scraper.execute_script('return document.title')# Controlla sempre il file robots.txt del sito
# https://example.com/robots.txtimport time
for url in urls:
scraper.get_page(url)
time.sleep(2) # Pausa di 2 seconditry:
soup = scraper.get_page(url)
if soup:
dati = scraper.extract_data(soup, selectors)
except Exception as e:
print(f"Errore: {e}")headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}# Non fare troppe richieste consecutive
# Usa pause e limita il numero di pagine
max_pages = 10 # Limita a 10 paginesoup = scraper.get_page(url)
print(soup.prettify()) # Stampa HTML formattato# Testa i selettori nel browser:
# 1. Apri DevTools (F12)
# 2. Console
# 3. document.querySelectorAll('tuo-selettore')# Vedi cosa fa il browser
scraper = WebScraperAvanzato(headless=False)scraper.save_to_json(dati, 'output.json')scraper.save_to_csv(dati, 'output.csv')import pandas as pd
df = pd.DataFrame(dati)
df.to_excel('output.xlsx', index=False)
df.to_csv('output.csv', index=False)- ✅ 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
# 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)# Aumenta il tempo di attesa
scraper = WebScraperAvanzato(wait_time=30)# 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"))
)Questo progetto è fornito "as is" per scopi educativi.
Sentiti libero di modificare e migliorare il codice secondo le tue esigenze!
Per domande o problemi, consulta la documentazione delle librerie: