Utiliser un Proxy avec BeautifulSoup en Python pour le Scraping

Python offre des bibliothèques puissantes telles que BeautifulSoup pour le parsing et Requests pour le scraping, mais vous risquez d’être bloqué en raison de restrictions telles que le bannissement IP et les limitations de fréquence. Dans ce tutoriel, vous apprendrez à implémenter un proxy BeautifulSoup pour éviter d’être bloqué.

Prêt ? Plongeons dans le sujet !

Premiers Pas avec BeautifulSoup et Python Requests

Pour cet exemple de scraping avec BeautifulSoup et Python Requests, nous allons extraire des produits de ScrapingCourse.com, un site de démonstration avec des fonctionnalités de commerce électronique.

ScrapingCourse.com Page d’Accueil E-commerce Cliquez pour ouvrir l’image en plein écran

En guise de prérequis, installez BeautifulSoup et Requests à l’aide de la commande suivante :

pip install beautifulsoup4 requests

Ensuite, importez les modules requis.

import requests
from bs4 import BeautifulSoup

Maintenant, envoyez une requête GET à l’URL cible, récupérez la réponse du serveur web, et enregistrez-la dans une variable.

url = "https://www.scrapingcourse.com/ecommerce/"
response = requests.get(url)
content = response.content

Imprimons la réponse pour voir le HTML complet à partir duquel nous extrairons des données. Voici le code complet :

import requests
from bs4 import BeautifulSoup

url = "https://www.scrapingcourse.com/ecommerce/"
response = requests.get(url)
content = response.content

print(content)

Et voici le résultat :

<!DOCTYPE html>
<html lang="en-US">
<head>
<!--- ... --->

<title>Ecommerce Test Site to Learn Web Scraping – ScrapingCourse.com</title>

<!--- ... --->
</head>
<body class="home archive ...">
<p class="woocommerce-result-count">Showing 1–16 of 188 results</p>
<ul class="products columns-4">

<!--- ... --->

</ul>
</body>
</html>

À partir du résultat ci-dessus, nous pouvons observer un HTML complexe qui peut ne pas être utile tel quel. Par conséquent, pour extraire les produits, nous allons parser le HTML stocké dans la variable content en utilisant BeautifulSoup. Cela nous permet de naviguer dans la structure HTML et de récupérer les noms des produits.

Pour continuer et extraire uniquement les noms des créatures, créez un objet BeautifulSoup pour analyser la variable content.

soup = BeautifulSoup(content, "html.parser")

Ensuite, inspectez l’URL cible sur un navigateur en utilisant les DevTools pour localiser l’élément HTML qui contient la liste des produits. Vous devriez voir ceci :

ScrapingCourse E-commerce Page d’Accueil Inspection du Premier Produit li Cliquez pour ouvrir l’image en plein écran

D’après l’image ci-dessus, chaque produit apparaît dans une balise li. Faites un clic droit sur l’élément li et copiez par sélecteur : (.product).

Après cela, ajoutez la méthode .select() de BeautifulSoup, qui nous permet d’identifier les éléments par sélecteurs CSS pour localiser l’élément spécifique qui représente la liste des produits dans le contenu analysé. Cela implique d’entrer votre sélecteur CSS en tant qu’argument dans la méthode select().

# sélectionner le conteneur de produits
products = soup.select(".product")

Pour terminer, itérez sur la variable products li et extrayez le contenu de chaque h2 en utilisant une list comprehension. Cela récupérera les noms de produits individuels répertoriés dans les éléments li.

product_names = []

# itérer sur chaque élément <li> dans la liste des produits
for product in products:

# utiliser une list comprehension pour extraire le contenu textuel de chaque élément <h2>
product_names.extend([product.find("h2").get_text() for product in products])

Enfin, voici le code complet :

import requests
from bs4 import BeautifulSoup

# définir l'URL du site que nous voulons scraper
url = "https://www.scrapingcourse.com/ecommerce/"

# envoyer une requête GET à l'URL et récupérer la réponse
response = requests.get(url)

# extraire le contenu de la réponse
content = response.content

# créer un objet BeautifulSoup pour analyser le contenu HTML
soup = BeautifulSoup(response, "html.parser")

# sélectionner le conteneur de produits
products = soup.select(".product")

product_names = []

# itérer sur chaque élément <li> dans la liste des produits
for product in products:

# utiliser une list comprehension pour extraire le contenu textuel de chaque élément <h2>
product_names.extend([product.find("h2").get_text() for product in products])

for name in product_names:
print(name)

Utiliser un Proxy avec BeautifulSoup et Python Requests

Les proxies vous permettent de faire des requêtes depuis différentes adresses IP. Pour illustrer cela, envoyez une requête à ident.me en utilisant le code suivant :

import requests

url = "http://ident.me/"

response = requests.get(url)
ip_address = response.text

print("Votre adresse IP est :", ip_address)

Le résultat sera votre adresse IP.

Votre adresse IP est : 190.158.1.38

Maintenant, faisons la même requête en utilisant un proxy. Pour cet exemple, nous utiliserons une adresse IP de FreeProxyList. Pour l’implémenter, spécifiez les détails du proxy dans le script. Ainsi, vous ferez votre requête via le serveur proxy spécifié.

Importez Requests et définissez votre proxy.

import requests

proxy = {
"https": "https://91.25.93.174:3128"
}

Ensuite, entrez la variable proxy comme paramètre dans la méthode request.get() et imprimez la réponse.

url = "http://ident.me/"

response = requests.get(url, proxies=proxy)
ip_address = response.text

print("Votre nouvelle adresse IP est :", ip_address)

Voici le code complet :

import requests

proxy = {
"https": "https://91.25.93.174:3128"
}

url = "http://ident.me/"

response = requests.get(url, proxies=proxy)
ip_address = response.text

print("Votre nouvelle adresse IP est :", ip_address)

Le résultat :

Votre nouvelle adresse IP est : 91.25.93.170

Félicitations, vous avez configuré votre premier proxy avec BeautifulSoup et Python Requests. Le résultat ci-dessus est l’adresse IP du serveur proxy, ce qui signifie que la requête a été acheminée avec succès via le proxy spécifié.

Note : Tous les proxies ne prennent pas en charge les protocoles HTTP et HTTPS. Si vous utilisez un proxy HTTPS, il prendra également en charge HTTP.

Cependant, les sites web mettent souvent en œuvre des mesures telles que la limitation de fréquence et le bannissement IP. Par conséquent, vous devez faire tourner les proxies pour éviter d’être signalé.

Pour faire tourner les proxies avec BeautifulSoup et Python Requests, commencez par définir une liste de proxies. Encore une fois, nous avons obtenu une liste de FreeProxyList pour cet exemple.

import requests

# liste de proxies
proxies = [
"http://46.16.201.51:3129",
"http://207.2.120.19:80",
"http://50.227.121.35:80",
# ajoutez d'autres proxies si nécessaire
]

Ensuite, itérez sur chaque proxy dans la liste des proxies, faites une requête GET en utilisant le proxy actuel, et imprimez la réponse.

for proxy in proxies:
try:
# faire une requête GET à l'URL spécifiée en utilisant le proxy actuel
response = requests.get(url, proxies={"http": proxy, "https": proxy})

# extraire l'adresse IP du contenu de la réponse
ip_address = response.text

# imprimer l'adresse IP obtenue
print("Votre adresse IP est :", ip_address)

except requests.exceptions.RequestException as e:
print(f"Requête échouée avec le proxy {proxy} : {str(e)}")
continue # passer au proxy suivant si la requête échoue

Note : Le bloc except est utilisé uniquement pour capturer les erreurs, et votre requête fonctionnerait sans celui-ci. Mais comme nous utilisons des proxies gratuits qui échouent souvent, il est recommandé de les capturer.

Voici le code complet :

import requests

# liste de proxies
proxies = [
"http://46.16.201.51:3129",
"http://207.2.120.19:80",
"http://50.227.121.35:80",
# ajoutez d'autres proxies si nécessaire
]

url = "http://ident.me/"

for proxy in proxies:
try:
# faire une requête GET à l'URL spécifiée en utilisant le proxy actuel
response = requests.get(url, proxies={"http": proxy, "https": proxy})

# extraire l'adresse IP du contenu de la réponse
ip_address = response.text

# imprimer l'adresse IP obtenue
print("Votre adresse IP est :", ip_address)

except requests.exceptions.RequestException as e:
print(f"Requête échouée avec le proxy {proxy} : {str(e)}")
continue # passer au proxy suivant si la requête échoue

Proxy Premium pour Éviter d’Être Bloqué avec BeautifulSoup

Les proxies premium pour le scraping étaient autrefois coûteux, en particulier pour des cas d’utilisation à grande échelle. Cependant, l’introduction de solutions comme ZenRows les a rendus plus accessibles. Et en plus de cela, ils sont dotés de nombreuses fonctionnalités pour éviter d’être bloqué, comme le rendering JavaScript, la rotation des en-têtes et des mesures avancées de contournement des anti-bots.

Pour essayer ZenRows, inscrivez-vous pour obtenir votre clé API gratuite. Vous accéderez au Request Builder, où vous devrez entrer votre URL cible (https://www.opensea.io/), cocher les cases pour Proxies Premium et JS Rendering, puis sélectionner les onglets Python et Proxy.

ZenRows Request Builder Cliquez pour ouvrir l’image en plein écran

Cela générera le code sur la droite. Copiez-le dans votre IDE pour envoyer votre requête en utilisant Python Requests.

Votre nouveau script devrait ressembler à ceci :

import requests

url = "https://opensea.io/"
apikey = "<YOUR_ZENROWS_API_KEY>"
params = {
"url": url,
"apikey": apikey,
"js_render": "true",
"premium_proxy": "true",
}
response = requests.get("https://api.zenrows.com/v1/", params=params)
print(response.text)

Voici le résultat :

<!DOCTYPE html>
//..
<title>OpenSea, the largest NFT marketplace</title>

Bingo ! Vous êtes prêt. ZenRows rend le web scraping super facile.

Conclusion

Les proxies agissent comme des intermédiaires entre votre web scraper et le serveur web cible. Vous pouvez accéder aux sites web depuis différentes adresses IP et contourner les restrictions en routant vos requêtes via des proxies. Cependant, les proxies gratuits ne fonctionnent pas pour les cas réels.

Une excellente option est d’utiliser un proxy BeautifulSoup et Python Requests avec ZenRows pour un web scraping efficace et évolutif. Inscrivez-vous maintenant et profitez de 1 000 crédits API gratuits.

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *