Tattiche avanzate di web scraping in Python

Commenti: 0

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.

Perché Python è ideale per lo scraping del Web

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.

Tattiche di scraping con Python

Questo blocco mostra all'utente come effettuare lo scraping di siti web complessi utilizzando tecniche più sofisticate integrate in Python. L'utente imparerà a:

  • Evitare di essere bloccati dalla protezione bot: gestire CAPTCHA, honeypots e fingerprinting TLS.
  • Agite come un utente reale per evitare di essere bloccati.
  • Controllare i cookie e le sessioni per mantenere l'autenticazione durante l'accesso alle pagine riservate.
  • Gestire i dati ottenuti dalle API e gestire i dati caricati in modo asincrono.
  • Proteggere lo script dalle modifiche sulla pagina e perfezionare la logica per le risorse dinamiche.

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.

Tattica 1: Gestire i CAPTCHA e le misure anti-bot

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.

Tattica 2: Emulare il comportamento umano

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.

  • Modifica dello User-Agent:
    
    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)
    
    
    
  • Movimento del cursore:
    
    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()
    
    
    

Tattica 3: Evitare le trappole Honeypot

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.

Tattica 4: Gestione di cookie e sessioni

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.

Tattica 5: Implementare il backoff esponenziale per il ritentativo delle richieste per lo scraping di dati in Python

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)


Tattica 6: Utilizzare i browser senza testa per le interazioni complesse

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.

Tattica 7: Scraping di dati in Python dal caricamento asincrono

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.

Tattica 8: Rilevare ed evitare il fingerprinting TLS

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.

  • Integrazione delle deleghe:
    
    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)
    
    
    

Tattica 9: Sfruttare gli endpoint API quando sono disponibili

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.

Tattica 10: Monitorare le modifiche alla struttura del sito web

I siti web possono modificare il loro codice, il che può ritardare lo scraping. Come contropartita, si consideri quanto segue:

  • Passare dall'uso dei selettori CSS a XPath;
  • Utilizzare test automatizzati per monitorare periodicamente la struttura della pagina;
  • Creare un codice intelligente in grado di gestire le probabili modifiche. Un modo per cercare gli elementi in base al loro contenuto piuttosto che in base a percorsi predeterminati.

Tattica 11: Garantire la conformità ai termini di servizio del sito web

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.

Scraping di dati in Python: Conclusione

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.

Commenti:

0 Commenti