1. Technologies anti-bots : qui joue au chat et à la souris avec nous ?
Aujourd'hui, on plonge dans l'un des sujets les plus fascinants et, disons-le franchement, controversés du web scraping: le contournement des protections anti-bots et la lutte contre les CAPTCHA. Comme souvent dans la vie d'un développeur, pour chaque boulon malin, il y a un écrou à pas inversé. Alors, voyons comment on peut gérer ces obstacles.
Avant de chercher des failles, comprenons à quoi on a affaire. Les technologies anti-bots, ce sont essentiellement des systèmes qui protègent les sites contre une attention excessive, et souvent indésirable, de programmes automatisés. Voici quelques méthodes courantes :
- CAPTCHA : Le CAPTCHA, c'est un peu comme l'arme nucléaire dans le monde des anti-bots. L'objectif est de filtrer les requêtes des bots en posant aux utilisateurs des tâches nécessitant une intervention humaine : sélectionner toutes les images avec des taxis ou entrer une combinaison floue de lettres, par exemple.
- Analyse du comportement : Certains sites analysent la vitesse à laquelle vous remplissez des formulaires ou interagissez avec les éléments d'une page. Trop rapide ? Et hop, vous êtes bloqué.
- Délais et limitations des requêtes : Si un site commence à soupçonner que vous n'êtes pas un humain, il peut augmenter les délais entre les requêtes ou carrément vous bloquer.
2. Méthodes pour contourner les anti-bots
Maintenant qu'on connaît l'ennemi, examinons quelques techniques pour le contourner.
Résolution de CAPTCHA
La méthode la plus évidente, mais aussi la plus complexe, est l'automatisation de la résolution des CAPTCHA. Oui, c'est faisable, mais cela nécessite des outils spécifiques et des services tiers. Les CAPTCHA existent sous diverses formes : textuels, graphiques et même audio.
Pour automatiser la résolution des CAPTCHA, on peut utiliser des API de services comme 2Captcha ou Anti-Captcha, qui proposent des solutions moyennant de petits frais. Voyons comment cela peut être implémenté en pratique :
import requests
def solve_captcha(api_key, site_url, captcha_image_url):
# Chargement de l'image du CAPTCHA
captcha_image = requests.get(captcha_image_url).content
# Envoi de l'image au service et récupération de l'ID de la tâche
response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
captcha_id = response.text.split('|')[1]
# Récupération de la solution du 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]
# Exemple d'utilisation de la fonction
api_key = 'VOTRE_CLÉ_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("Solution du CAPTCHA :", captcha_solution)
Ce code illustre comment on peut envoyer une requête pour résoudre un CAPTCHA. Cependant, ces méthodes peuvent être inefficaces pour des tâches graphiques complexes ou si le site change fréquemment ses algorithmes.
Imitation du comportement humain
Une autre méthode consiste à imiter le comportement humain. Vous pouvez insérer des délais aléatoires dans vos scripts, modifier le user-agent, émuler des interactions bidirectionnelles et même utiliser des mouvements de souris avec Selenium :
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get('https://example.com')
# Simulation du mouvement de la souris
actions = ActionChains(driver)
element = driver.find_element_by_id('button')
actions.move_to_element(element)
actions.perform()
# Délai pour créer une interaction naturelle
time.sleep(2)
# Exécution d'une action
element.click()
Nous parlerons plus en détail de Selenium dans les prochaines conférences.
Utilisation de IP dynamiques et proxies
Vous pouvez également utiliser des serveurs proxy pour changer l'adresse IP depuis laquelle les requêtes sont envoyées. Cela peut aider à contourner les limitations sur le nombre de requêtes par IP. Pour cela, il existe des services comme Bright Data et 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. Remarques importantes
La mise en œuvre des contournements anti-bots nécessite des connaissances et des expérimentations. Il est important de se rappeler que toutes les méthodes ne sont pas légales ou approuvées par le site. Vérifiez toujours ce qui est autorisé dans "robots.txt", et respectez les Bonnes Pratiques en web scraping, en évitant de surcharger les serveurs. Cela vous évitera des problèmes juridiques et montrera aussi du respect pour le travail des autres.
Ne lancez jamais un script de parsing sérieux depuis votre IP personnelle. Pour un parsing éducatif, ça ne posera pas de problème, mais si votre script met un serveur hors ligne en envoyant accidentellement plusieurs milliers de requêtes en même temps, on pourrait venir vous poser des questions. Et après les questions viennent les gens qui veulent en poser plus.
GO TO FULL VERSION