it
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
한국인
Gaeilge
اردو
Indonesia
Polski 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.
È 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:
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.
Prima di iniziare la codifica, definite i parametri fondamentali del vostro progetto per evitare problemi comuni e garantire un funzionamento stabile.
Uno strumento ben pianificato funziona in modo affidabile, utilizza le risorse in modo efficiente e fornisce risultati di alta qualità.
È 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.
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.
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.
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
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
È 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)
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