Dans ce tutoriel, vous apprendrez à utiliser la bibliothèque Python cloudscraper pour contourner la détection des bots de Cloudflare, gérer les erreurs courantes et explorer d’autres solutions de scraping pour bénéficier des protections anti-bots les plus robustes.
Comment utiliser cloudscraper dans Python
Dans ce tutoriel, vous allez essayer de scraper des données à partir d’un site web protégé par Cloudflare avec et sans cloudscraper. Pour ce faire, vous utiliserez les paquets Beautiful Soup etRequests. Si vous ne connaissez pas ces paquets, consultezce guide sur le Scraping web en Pythonpour en savoir plus.
Pour commencer, installez les paquets requis en exécutant la commande pip suivante :
pip install tqdm==4.66.5 requests==2.32.3 beautifulsoup4==4.12.3
Pour faciliter la compréhension de ce tutoriel, le Scraper web suivant a été créé afin d’extraire les métadonnées des articles d’actualité publiés un jour donné sur lesite web ChannelsTV:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from tqdm.auto import tqdm
def extract_article_data(article_source, headers):
response = requests.get(article_source, headers=headers)
if response.status_code != 200:
return None
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(class_="post-title display-3").text.strip()
date = soup.find(class_="post-meta_time").text.strip()
date_object = datetime.strptime(date, 'Updated %B %d, %Y').date()
categories = [category.text.strip() for category in soup.find('nav', {"aria-label": "breadcrumb"}).find_all('li')]
tags = [tag.text.strip() for tag in soup.find("div", class_="tags").find_all("a")]
article_data = {
'date': date_object,
'title': title,
'link': article_source,
'tags': tags,
'categories': categories
}
return article_data
def process_page(articles, headers):
page_data = []
for article in tqdm(articles):
url = article.find('a', href=True).get('href')
if "https://" not in url:
continue
article_data = extract_article_data(url, headers)
if article_data:
page_data.append(article_data)
return page_data
def scrape_articles_per_day(base_url, headers):
day_data = []
page = 1
while True:
page_url = f"{base_url}/page/{page}"
response = requests.get(page_url, headers=headers)
if not response or response.status_code != 200:
break
soup = BeautifulSoup(response.content, 'html.parser')
articles = soup.find_all('article')
if not articles:
break
page_data = process_page(articles, headers)
day_data.extend(page_data)
page += 1
return day_data
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
}
URL = "https://www.channelstv.com/2024/08/01/"
scraped_articles = scrape_articles_per_day(URL, headers)
print(f"{len(scraped_articles)} articles ont été récupérés.")
print("Exemples :")
print(scraped_articles[:2])
Dans ce code, trois fonctions sont définies pour faciliter le processus de scraping. La première, appelée extract_article_data, charge les données d’un article individuel et extrait les métadonnées, telles que sa date de publication, son titre, ses balises et ses catégories, dans un dictionnaire Python, qui est ensuite renvoyé. Les étapes de chargement et d’extraction sont mises en œuvre à l’aide des bibliothèques Python Requests et Beautiful Soup.
La deuxième fonction, process_page, obtient le lien vers tous les articles d’une page particulière et appelle la fonction extract_article_data pour extraire les données qu’ils contiennent et stocke chaque dictionnaire de métadonnées dans une liste, qui est ensuite renvoyée. La dernière fonction, nommée scrape_articles_per_day, utilise une boucle while pour incrémenter le numéro de page et extrait les données des articles de chaque page jusqu’à ce que vous arriviez à une page qui n’existe pas.
Ensuite, vous définissez l’URL à extraire et spécifiez la date à filtrer comme étant le 1er août 2024, ainsi qu’une variable headers contenant un exemple d’agent utilisateur. Vous appelez la fonction scrape_articles_per_day et transmettez les variables URL et headers. Ensuite, vous affichez le nombre d’articles extraits et les deux premiers résultats.
Idéalement, ce Scraper devrait fonctionner, mais ce n’est pas le cas, car le site web ChannelsTV utilise Cloudflare pour vous empêcher d’accéder au contenu de ses pages web via les requêtes directes mises en œuvre dans les fonctionsextract_article_dataetscrape_articles_per_day.
Lorsque vous essayez d’exécuter ce script, le résultat ressemble à ceci :
0 article a été récupéré.
Exemples :
[]
Intégrer cloudscraper
Auparavant, lorsque vous vouliez extraire des métadonnées spécifiques d’un article, rien n’était renvoyé, grâce à la protection de Cloudflare. Dans cette section, vous allez installer et utiliser cloudscraper pour contourner ce problème.
Pour commencer, installez la bibliothèque cloudscraper en exécutant la commande pip suivante :
pip install cloudscraper==1.2.71
Ensuite, importez le paquet et définissez une fonction fetch_html_content comme suit :
import cloudscraper
def fetch_html_content(url, headers):
try:
scraper = cloudscraper.create_scraper()
response = scraper.get(url, headers=headers)
if response.status_code == 200:
return response
else:
print(f"Échec de la récupération de l'URL : {url}. Code d'état : {response.status_code}")
return None
except Exception as e:
print(f"Une erreur s'est produite lors de la récupération de l'URL : {url}. Erreur : {str(e)}")
return None
Cette fonction prend en paramètres d’entrée l’URL à scraper et les en-têtes de requête, et renvoie soit un objet de réponse, soit None. Dans la fonction, vous définissez un bloc try-except. Dans le bloc try, vous créez un Scraper à l’aide de la méthode cloudscraper.create_scraper. Ensuite, vous appelez la méthode scraper.get et transmettez les variables url et headers. Si le code d’état de votre réponse est 200, vous renvoyez la réponse. Sinon, vous affichez un message d’erreur et renvoyez None. De même, si une erreur se produit dans le bloc try, le bloc except est déclenché, dans lequel un message approprié est affiché et None est renvoyé.
Ensuite, vous remplacez chaque appel requests.get dans votre script par cette fonction fetch_html_content. Commencez par effectuer ce remplacement dans votre fonction extract_article_data comme suit :
def extract_article_data(article_source, headers):
response = fetch_html_content(article_source, headers)
Ensuite, remplacez l’appel requests.get dans votre fonction scrape_articles_per_day comme suit :
def scrape_articles_per_day(base_url, headers):
day_data = []
page = 1
while True:
page_url = f"{base_url}/page/{page}"
response = fetch_html_content(page_url, headers)
En définissant cette fonction, la bibliothèque cloudscraper peut vous aider à contourner les restrictions de Cloudflare.
Lorsque vous exécutez le code, le résultat ressemble à ceci :
Échec de la récupération de l'URL : https://www.channelstv.com/2024/08/01//page/5. Code d'état : 404
55 articles ont été récupérés.
Exemples :
[{'date': datetime.date(2024, 8, 1),
'title': 'Résilience, gaz lacrymogène, pillages, couvre-feu alors que les manifestations #EndBadGovernance se poursuivent',
'link': 'https://www.channelstv.com/2024/08/01/tear-gas-resilience-looting-curfew-as-endbadgovernance-protests-hold/',
'tags': ['Eagle Square', 'Hunger', 'Looting', 'MKO Abiola Park', 'violence'],
'categories': ['Headlines']},
{'date': datetime.date(2024, 8, 1),
'title': 'La mère d'un artiste russe libéré dans le cadre d'un échange de prisonniers attend de pouvoir le « serrer dans ses bras »,
'link': 'https://www.channelstv.com/2024/08/01/mother-of-russian-artist-freed-in-prisoner-swap-waiting-to-hug-her/',
'tags': ['Prisoner Swap', 'Russia'],
'categories': ['World News']}]
Fonctionnalités supplémentaires de Cloudscraper
Comme vous pouvez le constater, Cloudscraper peut vous aider à contourner la protection IUAM de Cloudflare, mais il offre également d’autres fonctionnalités qui méritent d’être soulignées.
Utilisation de proxies
Les Proxys servent de serveurs intermédiaires entre votre ordinateur et les sites cibles, vous permettant ainsi de naviguer sur Internet de manière plus anonyme. Vos requêtes sont acheminées via ces Proxys afin que les sites web cibles, tels que les sites protégés par Cloudflare, voient le serveur Proxy comme la source du Trafic et non votre appareil.
Avec Cloudscraper, vous pouvez définir des Proxys et les transmettre à votre objet Cloudscraper déjà créé comme suit :
Scraper = cloudscraper.create_scraper()
Proxy = {
'http': 'http://your-proxy-ip:port',
'https': 'https://your-proxy-ip:port'
}
response = scraper.get(URL, proxies=Proxy)
Ici, vous définissez un objet Scraper avec des valeurs par défaut. Ensuite, vous définissez un dictionnaire Proxy avec des proxys http et https. Enfin, vous transmettez l’objet dictionnaire Proxy à la méthode scraper.get comme vous le feriez avec une méthode request.get classique.
Modification de l’agent utilisateur et de l’interpréteur JavaScript
Alors que vous avez spécifié directement un agent utilisateur dans le script précédent, la bibliothèque cloudscraper peut également générer automatiquement des agents utilisateurs. Cela réduit les configurations manuelles nécessaires lors de la création de scripts et vous permet d’imiter de vrais utilisateurs avec différentes identités de navigateur. Cette opération est effectuée de manière aléatoire, mais vous pouvez également sélectionner le type d’agents utilisateurs à partir desquels elle effectue l’échantillonnage en transmettant un paramètre de navigateur à la méthode cloudscraper.create_scraper. Ce paramètre de navigateur contient un dictionnaire qui stocke des valeurs de chaîne pour le navigateur et la plate-forme, ainsi que des valeurs booléennes pour les ordinateurs de bureau et les appareils mobiles.
cloudscraper vous permet également de spécifier l’interpréteur JavaScript et le moteur que vous utilisez avec votre Scraper. La valeur par défaut est un solveur natif créé par l’équipe cloudscraper. Les autres options disponibles sont Node.js, Js2Py, ChakraCore et v8eval.
Voici un exemple de snippet montrant les spécifications d’un interpréteur et d’un navigateur :
Scraper = cloudscraper.create_scraper(
interpreter="nodejs",
browser={
"browser": "chrome",
"platform": "ios",
"desktop": False,
}
)
Ici, vous définissez l’interpréteur comme « nodejs » et transmettez un dictionnaire au paramètre du navigateur. Dans ce dictionnaire, le navigateur est défini sur Chrome et la plateforme sur « ios ». Le paramètre desktop est défini sur False, ce qui signifie que le navigateur fonctionne sur mobile, car les valeurs mobile et desktop sont définies sur True par défaut. Dans ce cas, Cloudflare sélectionne les agents utilisateurs iOS mobiles fonctionnant sur le navigateur Chrome.
Gestion des CAPTCHA
Les CAPTCHAsont conçus pour distinguer les humains des robots, et ils peuvent souvent empêcher le chargement de la page Web cible lorsque vous effectuez du Scraping web. L’un des avantages de Cloudscraper est qu’il prend en charge certains solveurs de CAPTCHA tiers, dédiés à reCAPTCHA, hCaptcha, etc. Si vous connaissez d’autres solveurs CAPTCHA tiers qui vous intéressent, vous pouvez faire part de vos suggestions à l’équipe Cloudscraper via les tickets d’assistance GitHub.
L’extrait de code suivant vous montre comment modifier votre Scraper pour gérer les CAPTCHA :
Scraper = cloudscraper.create_scraper(
captcha={
'provider': 'capsolver',
'api_key': 'your_capsolver_api_key'
}
)
Dans ce code, vous spécifiez votre fournisseur CAPTCHA comme Capsolver et votre clé API Capsolver. Les deux valeurs sont stockées dans un dictionnaire et transmises au paramètre CAPTCHA dans la méthode cloudscraper.create_scraper.
Erreurs courantes de cloudscraper
Bien que cloudscraper soit un moyen facile de contourner les restrictions de Cloudflare, vous pouvez rencontrer quelques erreurs lorsque vous commencez à l’utiliser. Voici quelques-unes des erreurs les plus courantes (et leurs solutions) que vous pouvez rencontrer.
Module introuvable
L’erreur « module introuvable » est une erreur courante en Python qui se produit lorsque vous essayez d’importer ou d’utiliser une bibliothèque qui n’existe pas dans votre environnement Python.
Lorsque vous travaillez en Python, vous opérez dans un environnement, et seules les bibliothèques installées dans cet environnement actif sont accessibles par votre script ou votre notebook. L’erreur « module introuvable » signifie que vous n’avez pas activé l’environnement (virtuel) concerné ou que vous n’avez pas installé le paquet dans votre environnement.
Pour activer votre environnement virtuel sous Windows, exécutez la commande suivante :
.<venv-name>Scriptsactivate.bat
Si vous travaillez sous Linux ou macOS, vous pouvez utiliser la commande suivante :
source <venv-name>/bin/activate
Si le paquet n’est pas installé, installez-le en exécutant la commande suivante :
pip install cloudscraper
cloudscraper ne peut pas contourner la dernière version de Cloudflare
L’erreur « cloudscraper ne peut pas contourner la dernière version de Cloudflare » se produit lorsque vous essayez d’utiliser une version de cloudscraper conçue pour contourner une ancienne version de Cloudflare. Cela pose problème, car les versions plus récentes de Cloudflare peuvent comporter des modifications qui limitent les anciennes versions de cloudscraper jusqu’à ce que la bibliothèque Python soit mise à jour.
Si vous utilisez une ancienne version de cloudscraper, il est préférable de mettre à jour votre package à l’aide de la commande suivante :
pip install -U cloudscraper
Si vous utilisez déjà la version la plus récente de cloudscraper, vous devrez peut-être attendre une mise à jour ou trouver une autre solution qui fonctionne.
Une alternative à cloudscraper
Si, après avoir mis en œuvre ce que vous avez appris ici, vous rencontrez toujours des difficultés pour contourner la protection de Cloudflare, vous devriez envisager d’utiliser Bright Data.
Bright Data dispose de l’un des plus grands réseaux de proxys, comprenant des proxysde centres de données, de FAI, mobiles et résidentiels. Grâce à ces proxys qui servent d’intermédiaires, vous pouvez éviter le blocage des adresses IP, améliorer les performances, contourner les restrictions géographiques et protéger votre vie privée.
Pour contourner la protection Cloudflare à l’aide de Bright Data, il vous suffit de créer un compte, de le configurer et d’obtenir vos identifiants API. Vous pouvez ensuite utiliser ces identifiants pour accéder aux données de l’URL cible comme suit :
import requests
host = 'brd.superproxy.io'
port = 22225
username = 'brd-customer-<CUSTOMER_ID>-zone-<ZONE_NAME>'
password = '<ZONE_PASSWORD>'
proxy_url = f'http://{username}:{password}@{host}:{port}'
proxies = {
'http': proxy_url,
'https': proxy_url
}
response = requests.get(URL, proxies=proxies)
Ici, vous effectuez une requête GET avec la bibliothèque Python Requests et transmettez les Proxy via le paramètre proxies. Les Proxy créés utilisent votre nom d’utilisateur, votre mot de passe, votre hôte et votre numéro de port Bright Data. Votre nom d’utilisateur, en particulier, est défini en fonction de votre identifiant client Bright Data et du nom de votre Zone, qui peuvent tous être récupérés à partir de votre compte.
Conclusion
Dans ce tutoriel, vous avez appris à utiliser la bibliothèque cloudscraper en Python pour scraper des sites web protégés par Cloudflare. Vous avez également découvert certaines erreurs courantes que vous pourriez rencontrer et comment les contourner. Bien que cloudscraper puisse être une excellente solution pour contourner l’IUAM de Cloudflare, comme toute technologie gratuite, elle a ses limites. C’est pourquoi vous avez également appris à utiliser l’impressionnant réseau de ProxysBright DataetWeb Unlockerpour accéder aux sites protégés par Cloudflare.
Bright Data vous fournit des outils automatisés qui vous permettent d’accéder aux données sur Internet sans aucune restriction. Vous pouvez également utiliser son vaste réseau de Proxys pour réduire le nombre de requêtes échouées si l’automatisation n’est pas votre objectif.
Prêt à passer au niveau supérieur en matière de Scraping web ? Découvrez comment nos Proxys premium et nos services experts de collecte de données web peuvent facilement contourner même les protections anti-bots les plus strictes. Commencez dès aujourd’hui avec un essai gratuit !