Guida passo per passo alla creazione di un web crawler da zero

Commenti: 0

I web crawler sono utilizzati per il monitoraggio dei prezzi, l'aggregazione di notizie, l'analisi dei concorrenti, l'indicizzazione dei motori di ricerca e altre attività che richiedono la raccolta di dati strutturati dai siti web. Questa guida spiega come costruire un web crawler da zero, a partire dalla pianificazione del progetto e dalle scelte tecnologiche, fino alla configurazione dell'ambiente e all'archiviazione dei dati. Fornisce una base che può essere successivamente estesa a progetti più complessi e su larga scala.

Cos'è un crawler web e come funziona

È un programma che visita automaticamente le pagine web e ne raccoglie le informazioni. Funziona inviando chiamate HTTP a un sito, recuperando l'HTML di ogni pagina e quindi elaborando l'HTML per estrarre i dati richiesti. Successivamente, segue i collegamenti interni e ripete il processo fino a quando non raggiunge limiti predefiniti o condizioni di stop. Questo processo non è lo stesso del web scraping. Per un confronto dettagliato, vedere Web scraping vs web crawling.

Tali strumenti sono ampiamente utilizzati per:

  • monitoraggio dei prezzi nel commercio elettronico
  • raccolta di contatti e elenchi
  • costruire insiemi di dati per l'analisi
  • indicizzazione dei contenuti per i motori di ricerca

In questi scenari, costruire il proprio web crawler è spesso l'approccio migliore: è possibile sintonizzare il programma sulle proprie esigenze, controllare la frequenza delle richieste e definire quali informazioni raccogliere e come.

Pianificazione di un progetto di web crawler

Prima di iniziare la codifica, definite i parametri fondamentali del vostro progetto per evitare problemi comuni e garantire un funzionamento stabile.

  1. Obiettivi della raccolta dati. Specificate perché avete bisogno dello strumento: monitoraggio dei prezzi, raccolta di contatti, indicizzazione dei contenuti, creazione di set di dati analitici e così via.
  2. Siti e tipi di dati target. Decidete quali risorse eseguirete il crawling e quali informazioni vi servono. Ciò influisce sull'architettura e sulle scelte tecnologiche.
  3. Frequenza di aggiornamento. Stimate la frequenza con cui avete bisogno di dati nuovi per evitare di sovraccaricare i sistemi o di lavorare con informazioni obsolete.
  4. Vincoli tecnici e legali. Controllare il file robots.txt, la protezione anti-bot, le leggi sulla protezione dei dati e le condizioni d'uso del sito.
  5. Elaborazione e archiviazione. Decidete in quale formato memorizzare le informazioni e come analizzarle in seguito.

Uno strumento ben pianificato funziona in modo affidabile, utilizza le risorse in modo efficiente e fornisce risultati di alta qualità.

Scegliere la lingua e gli strumenti giusti

È possibile costruire un web crawler in diversi linguaggi di programmazione, tra cui Python, Java e PHP. Python si distingue per la sua sintassi semplice e per il ricco ecosistema di librerie per le richieste HTTP e l'analisi dell'HTML (come requests, BeautifulSoup, lxml). Java è una scelta solida per progetti aziendali e su larga scala. PHP è più comune nello sviluppo web e meno conveniente per i crawler autonomi.

Per un primo tentativo, considereremo come costruire un web crawler in Python, che di solito è la scelta ottimale perché consente di implementare e testare rapidamente le funzionalità di base.

Impostazione dell'ambiente

Iniziate installando Python dal sito sito web ufficiale. Installare quindi le librerie fondamentali che si utilizzeranno: requests per l'invio di richieste HTTP e BeautifulSoup per l'analisi dell'HTML:


pip install requests beautifulsoup4

Vale anche la pena di organizzare la struttura del progetto fin dall'inizio: file separati per la logica principale, la configurazione e le utilità. In questo modo la manutenzione e il ridimensionamento futuri saranno molto più semplici.

Come costruire un crawler web (esempio di codice)

Uno script di base può essere composto da tre parti principali: inviare una richiesta, elaborare l'HTML e seguire i collegamenti.


from bs4 import BeautifulSoup
import time
import random

# Configuration
url = "https://quotes.toscrape.com/"  # Replace this with your target site
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
timeout = 5  # server response timeout
max_retries = 3  # maximum number of retries on errors
# You can add your proxy here if needed
proxies = {
    "http": "http://username:password@proxyserver:port",
    "https": "https://username:password@proxyserver:port"
}

# Function to check access via robots.txt
def can_crawl(base_url, path="/"):
    try:
        robots_url = base_url.rstrip("/") + "/robots.txt"
        r = requests.get(robots_url, headers=headers, timeout=timeout)
        if r.status_code == 200 and f"Disallow: {path}" in r.text:
            print(f"Service {path} forbidden for scraping robots.txt")
            return False
    except requests.RequestException:
        # If robots.txt is unavailable, continue
        pass
    return True

# Main logic
if can_crawl(url):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, headers=headers, timeout=timeout, proxies=proxies)
            response.raise_for_status()

            soup = BeautifulSoup(response.text, 'lxml')

            # Collect links
            links = [a['href'] for a in soup.find_all('a', href=True)]  # You can change selector here
            print("Found links:", links)

            # Delay between requests to simulate more realistic behavior
            time.sleep(random.uniform(3, 7))  # better than a fixed 5-second delay
            break  # if everything succeeds, exit the retry loop

        except requests.RequestException as e:
            print(f"Request error (attempt {attempt+1}): {e}")
            wait = 2 ** attempt
            print(f"Waiting {wait} seconds before retry...")
            time.sleep(wait)
else:
    print("The crawler cannot process this resource due to robots.txt rules")

Questo script mostra il flusso di lavoro di base: fare una richiesta, analizzare l'HTML e raccogliere i link.

Gestione della paginazione e della navigazione del sito

Per i siti a più pagine, è necessario un ciclo che attraversi tutte le pagine. Esempio:


for page in range(1, 6):
    url = f"https://google.com/page/{page}"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    # data processing

Rispetto di Robots.txt e dei limiti di velocità

Un crawling responsabile comprende il controllo del file robots.txt di un sito e il rispetto delle sue regole. È inoltre necessario introdurre dei ritardi tra le richieste, in modo da non sovraccaricare il server. Con la funzione time.sleep(), si possono aggiungere pause tra le richieste di pagine.


import time
from bs4 import BeautifulSoup

for page in range(1, 6):
    url = f"https://google.com/page/{page}"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    # data processing
	
    time.sleep(5) # delay in seconds

Memorizzazione dei dati raccolti

È possibile memorizzare i dettagli raccolti in formati convenienti come CSV o JSON. Ad esempio, per salvare un elenco di link:


import json

data = {"links": links}
with open("links.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

Conclusione

Seguendo questi passaggi, si ottiene un web crawler di base che può essere esteso per compiti più avanzati. È possibile scalare il codice, integrare il supporto proxy, gestire un gran numero di pagine o passare a framework più potenti come Scrapy per scenari complessi di raccolta dati.

Commenti:

0 Commenti