1. Tecnologie antibot: chi sta giocando a gatto e topo con noi?
Oggi ci immergeremo in uno degli argomenti più affascinanti e, si può dire, controversi dello web scraping: il bypass della protezione dai bot e la lotta contro i CAPTCHA. Come spesso accade nella vita di un programmatore, per ogni bullone astuto c'è sempre un dado con la filettatura opposta, quindi vediamo come possiamo affrontare questi ostacoli.
Prima di iniziare a cercare delle scappatoie, cerchiamo di capire con cosa abbiamo a che fare. Le tecnologie antibot non sono altro che sistemi che proteggono i siti da attenzione eccessiva, e spesso indesiderata, da parte di programmi automatizzati. Ecco alcuni dei metodi più comuni:
- CAPTCHA: Il CAPTCHA è come un'arma nucleare nel mondo degli antibot. Lo scopo è filtrare le richieste dei bot presentando agli utenti compiti che richiedono un’attività umana: per esempio, scegliere tutte le immagini con cani o inserire una combinazione di lettere sfocate.
- Analisi del comportamento: Alcuni siti analizzano la velocità con cui compili i moduli o interagisci con gli elementi della pagina. Troppo veloce? E sei già stato bannato.
- Ritardi e limitazioni nelle richieste: Se un sito sospetta che tu non sia umano, potrebbe aumentare i ritardi tra le richieste o persino bloccarti.
2. Metodi per aggirare gli antibot
Ora che conosciamo il nemico, vediamo alcuni metodi per aggirarlo.
Risolvere i CAPTCHA
Il metodo più ovvio e al contempo più complicato è l'automazione della risoluzione dei CAPTCHA. Sì, è possibile, ma servono strumenti specifici e servizi di terze parti. I CAPTCHA possono essere di vario tipo, inclusi quelli testuali, grafici e persino audio.
Per automatizzare la risoluzione dei CAPTCHA puoi usare API di servizi come 2Captcha o Anti-Captcha, che offrono soluzioni ai CAPTCHA a un costo contenuto. Vediamo come può essere implementato in pratica:
import requests
def solve_captcha(api_key, site_url, captcha_image_url):
# Carichiamo l'immagine del CAPTCHA
captcha_image = requests.get(captcha_image_url).content
# Inviamo l'immagine al servizio e otteniamo l'ID del task
response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
captcha_id = response.text.split('|')[1]
# Otteniamo la soluzione del CAPTCHA
solution_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
solution_response = requests.get(solution_url)
while 'CAPCHA_NOT_READY' in solution_response.text:
solution_response = requests.get(solution_url)
return solution_response.text.split('|')[1]
# Esempio di utilizzo della funzione
api_key = 'LA_TUA_CHIAVE_2CAPTCHA'
site_url = 'https://example.com'
captcha_image_url = 'https://example.com/captcha_image'
captcha_solution = solve_captcha(api_key, site_url, captcha_image_url)
print("Soluzione CAPTCHA:", captcha_solution)
Questo codice illustra come inviare richieste per risolvere un CAPTCHA. Tuttavia, tali metodi potrebbero non essere efficaci per compiti grafici complessi o se il sito cambia attivamente i suoi algoritmi.
Simulazione del comportamento umano
Un altro modo per ingannare il sistema è simulare il comportamento umano. Puoi aggiungere ritardi casuali nei tuoi script, cambiare user-agent, emulare interazioni bidirezionali, e persino utilizzare metodi di movimento del mouse con Selenium:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get('https://example.com')
# Emuliamo il movimento del mouse
actions = ActionChains(driver)
element = driver.find_element_by_id('button')
actions.move_to_element(element)
actions.perform()
# Ritardo per creare un'interazione naturale
time.sleep(2)
# Eseguiamo l'azione
element.click()
Parleremo di Selenium in dettaglio nelle prossime lezioni.
Uso di IP dinamici e proxy
Puoi anche utilizzare server proxy per cambiare l'indirizzo IP da cui vengono inviate le richieste. Questo può aiutare a bypassare le limitazioni sul numero di richieste da un singolo IP. Esistono servizi come Bright Data e Smartproxy.
import requests
proxy = {
"http": "http://123.456.789.012:8080",
"https": "http://123.456.789.012:8080",
}
response = requests.get('https://example.com', proxies=proxy)
print(response.content)
3. Osservazioni importanti
Implementare metodi per aggirare gli antibot richiede conoscenze ed esperimenti. È importante ricordare che non tutti i metodi sono legali o accettati dal sito. Controlla sempre cosa è consentito nel "robots.txt", e rispetta le Buone Regole nello scraping web, evitando di sovraccaricare i server. Questo non solo ti eviterà problemi legali, ma mostrerà anche rispetto per il lavoro altrui.
Non avviare mai un parser serio dal tuo IP di casa. Per uno scraping accademico non accadrà mai nulla, ma se il tuo script dovesse bloccare un server inviando accidentalmente diverse migliaia di richieste contemporaneamente, potrebbero sorgere problemi. Dopo le domande, potrebbero venire le persone a chiedertene conto.
GO TO FULL VERSION