La raccolta di dati da un sito web è molto più che una semplice raccolta del suo contenuto; c'è molto da fare. Per aggirare limiti, lacune e altri blocchi sofisticati, è necessario utilizzare una moltitudine di metodi aggiuntivi, come lo scraping di dati in Python.
In questo articolo definiremo cos'è lo scraping in Python e spiegheremo perché è lo strumento migliore per questo compito. Inoltre, illustreremo le tattiche che sfruttano le capacità di scraping dei dati di Python. Tutto questo ci aiuterà a recuperare informazioni anche dai siti più sicuri.
Questo strumento è stato progettato specificamente per essere una risorsa eccellente per la raccolta di dati dai siti web. Oltre alla sua usabilità, le librerie di Python come Scrapy, Selenium e BeautifulSoup sono molto potenti. Inoltre, esiste una nuova comunità attiva che continua a sviluppare script e a fornire supporto ai nuovi utenti. Ecco perché Python è oggi molto utilizzato per il web scraping. Vediamo quindi le principali strategie disponibili in questo momento.
Questo blocco mostra all'utente come effettuare lo scraping di siti web complessi utilizzando tecniche più sofisticate integrate in Python. L'utente imparerà a:
Questi approcci contribuirebbero a rendere efficace lo scraping di dati Python, riducendo al minimo le possibilità di essere bloccati o di non poter accedere al server.
Passiamo ora alle tattiche per eseguire lo scraping in Python in modo efficace.
Una pletora di siti web implementa i sistemi di sicurezza CAPTCHA come una solida linea di difesa per salvaguardare le proprie informazioni dallo scraping premeditato di dati da Python. Tali sistemi possono essere sconfitti in molti modi, impiegando servizi di riconoscimento automatico, come 2Captcha o Anti-Captcha, o utilizzando l'apprendimento automatico per identificare cognitivamente le immagini. Un'altra possibilità è quella di ridurre la quantità di query a un livello che il tribunale non associa all'aspettativa di raccolta di informazioni.
Per rendere le query meno ostili, gli utenti devono agire in un modo che si avvicini al comportamento normale. Introdurre tempi casuali tra le azioni, cambiare User-Agent, scorrere la pagina, muovere il puntatore del mouse, simulare la scrittura e altro ancora. L'uso di Selenium o Playwright come strumenti di scraping Python offre all'automazione caratteristiche molto più simili a quelle umane, in modo da evitare i blocchi.
import random
import requests
url = 'https://google.com'
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'dnt': '1',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
headers['user-agent'] = random.choice(user_agents)
response = requests.get(url=url, headers=headers)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_argument("--headless") # Esecuzione del browser senza interfaccia grafica
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")
# Trovare un elemento tramite XPath
element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
# Usare le ActionChains per spostare il cursore
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# Chiudere il browser
driver.quit()
Alcuni siti web incorporano elementi aggiuntivi progettati per gli utenti normali che sono invisibili, ma un bot può accidentalmente attivarli. Questi elementi includono moduli nascosti che, se cliccati e inviati, impediscono al sito di accedere al bot. Prima della raccolta dei dati, utilizzare stili e attributi CSS come display: none o opacity: 0 e astenersi dall'utilizzare tali stili.
Se le richieste vengono effettuate senza una corretta configurazione dei cookie o della sessione, alcuni siti bloccheranno le richieste ripetute considerate troppo semplici. Per ovviare a questo problema, utilizzare requests.Session(), utilizzare i cookie salvati e agire come un vero utente. È inoltre necessario modificare le intestazioni User-Agent, poiché il bot verrà riconosciuto da queste.
Nel caso in cui il server non risponda o restituisca temporaneamente un errore, fare una pausa prima di effettuare ulteriori tentativi di ripetizione del comando. È preferibile il backoff esponenziale, che consiste nell'aumentare il tempo di attesa dopo ogni tentativo fallito. Ad esempio, si può aumentare di 1 secondo, 2 secondi, 4 secondi e così via. In questo modo si riduce la possibilità di essere bloccati, minimizzando le limitazioni del sito web e riducendo il carico di lavoro di scraping dei dati con Python.
import time
import requests
def fetch_with_backoff(url, max_retries=5):
retries = 0
wait_time = 1 # Ritardo di 1 secondo
while retries < max_retries:
try:
response = requests.get(url)
# Se la richiesta ha successo, restituisce il risultato
if response.status_code == 200:
return response.text
print(f"Error {response.status_code}. Retrying in {wait_time} sec.")
except requests.exceptions.RequestException as e:
print(f"Connection error: {e}. Retrying in {wait_time} sec.")
# Attendere prima di riprovare
time.sleep(wait_time)
# Aumentare il ritardo
wait_time *= 2
retries += 1
return None
url = "https://google.com"
html = fetch_with_backoff(url)
Alcuni siti web possono caricare il contenuto in più fasi o funzionare solo dopo aver ricevuto alcuni input dall'utente. In questi casi, è improbabile che librerie come BeautifulSoup siano utili. In questo caso, è utile lo scraping del web con Selenium, Puppeteer e Playwright. Queste librerie consentono di aprire le pagine come farebbe un normale utente, che può cliccare sui pulsanti, digitare il testo e interagire con gli elementi della pagina.
Alcune pagine web non utilizzano JavaScript per mostrare i dati finché l'utente non accede alla pagina web. In questo caso, una richiesta HTTP standard non recupera tutte le informazioni necessarie. Per raccogliere tali informazioni si può usare Selenium, oppure si possono esaminare le richieste di rete usando i DevTools del browser. Questo aiuta a rilevare gli endpoint API nascosti, che possono poi essere utilizzati per recuperare le informazioni con il minimo sforzo.
La stragrande maggioranza dei siti web passa le richieste automatiche al server per un'ulteriore elaborazione. È noto che alcuni siti web verificano le impronte digitali TLS come mezzo per distinguere le richieste automatiche. Ciò significa che il server studia vari attributi di connessione come l'attenzione TLS/SSL utilizzando tecnologie, cifrari e altre connessioni sofisticate. Per ottenere questo risultato si possono mescolare gli attributi di connessione nelle richieste utilizzando intestazioni e proxy personalizzati.
import requests
url = 'username:password@your-proxy'
proxy = 'your-proxy'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
response = requests.get(url=url, proxies=proxies)
Se un sito web offre un'API pubblica, è consigliabile utilizzarla piuttosto che ricorrere allo scraping. Questo approccio è più veloce, più affidabile e ha meno probabilità di essere bloccato. Un buon punto di partenza per trovare un endpoint API è controllare le richieste che il sito web effettua, visibili in DevTools. In assenza di un'API, si dovrà lavorare con il codice HTML.
I siti web possono modificare il loro codice, il che può ritardare lo scraping. Come contropartita, si consideri quanto segue:
In alcuni casi, il web scraping con Python da siti web può violare i termini di utilizzo o addirittura essere considerato illegale in alcune giurisdizioni. Prima di eseguire lo scraping di dati, è indispensabile esaminare il file robots.txt e i termini di servizio insieme alla politica del sito. È anche meglio utilizzare un'API pubblica, se disponibile. Inoltre, è bene fissare dei limiti al numero di richieste per ridurre al minimo la pressione sul server.
Lo scraping avanzato del Web con Python ha i suoi vantaggi, ma farlo nel modo giusto è altrettanto importante. Abbiamo discusso aspetti importanti di questo processo, come l'aggiramento di CAPTCHA, la simulazione di azioni dell'utente, la gestione di cookie e sessioni, la gestione di honeypots e l'esame di dati in applicazioni web asincrone.
Inoltre, tenete presente l'aspetto morale e il relativo contratto del sito utilizzato. Utilizzate gli endpoint API quando disponibili e, se il parsing HTML è inevitabile, seguite tutte le linee guida per ridurre le possibilità di essere bloccati e di avere complicazioni legali.
Con l'uso di questo tutorial sui metodi di web scraping con Python, il potenziale di rischio può essere notevolmente ridotto, mentre l'efficacia può essere aumentata al massimo.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0