Comment utiliser un proxy scraper avec Beautiful Soup en python

L’extraction de données sur le web est devenue une pratique courante pour les développeurs et data scientists. Avec des outils comme Beautiful Soup en Python, il est facile de scraper des sites web. Cependant, une des étapes essentielles dans ce processus est l’utilisation de proxy scrapers. Les proxies aident à contourner les limitations d’accès aux sites web. Découvrez comment utiliser un proxy scraper en combinaison avec Beautiful Soup en Python.

Pourquoi utiliser un proxy scraper ?

Lorsqu’on scrape des pages web, on peut rapidement se retrouver bloqué par les serveurs cibles. Cela peut être dû aux limitations IP, captchas ou autres mécanismes de sécurité. L’application d’un proxy scraper permet de :

  • Contourner les restrictions IP
  • Améliorer la vitesse de scraping
  • Éviter les blocages temporaires ou permanents

Les risques du scraping sans proxy

Ne pas utiliser de proxy lors du scraping présente plusieurs risques :

  1. Blocage de l’adresse IP par les serveurs visés
  2. Faux résultats causés par des mesures anti-scraping
  3. Diminution de la vitesse de scraping due aux limitations serveur

Configurer un environnement Python pour le scraping

Installer les packages nécessaires

Démarrons en installant les packages nécessaires. Utilisez pip pour installer Beautiful Soup, Requests et un package de gestion de proxies tel que gimmeproxy ou scrapy-proxy-pool. Voici quelques commandes utiles :

pip install beautifulsoup4
pip install requests
pip install scrapy-proxy-pool

Importer les modules

Une fois les packages installés, importez-les dans votre script Python :

import requests
from bs4 import BeautifulSoup
from scrapy_proxy_pool import ProxyPool

Obtenir des proxies

Utiliser un service gratuit

Il existe des services gratuits qui fournissent des listes de proxies. Par exemple, vous pouvez utiliser free-proxy-list.net pour obtenir des IP et ports de proxies gratuits. Voici un exemple d’extraction :

response = requests.get('https://www.sslproxies.org/')
soup = BeautifulSoup(response.text, 'html.parser')
proxy_table = soup.find(id='proxylisttable')

proxies = []
for row in proxy_table.tbody.find_all('tr') :
    proxies.append({
        'ip' : row.find_all('td')[0].string,
        'port' : row.find_all('td')[1].string
    })

Intégrer un pool de proxies

Pour gérer automatiquement une rotation de proxies, utilisez un pool de proxies. Scrapy-Proxy-Pool facilite cette tâche :

# Initialisation du pool
proxy_pool = ProxyPool()

# Récupérer un proxy aléatoire
proxy = proxy_pool.get_random_proxy()
print(proxy)

Scraper un site web avec Beautiful Soup et proxies

Mettre en place une requête avec un proxy

Lorsque vous avez une liste de proxies ou un pool configuré, envoyez vos requêtes HTTP en utilisant ces proxies. Voici un exemple :

proxies = {
  'http' : f"http://{proxy['ip']} :{proxy['port']}",
  'https' : f"https://{proxy['ip']} :{proxy['port']}"
}

url = 'http://example.com'
response = requests.get(url, proxies=proxies)
if response.status_code == 200 :
    soup = BeautifulSoup(response.content, 'html.parser')
    print(soup.prettify())

Gérer les erreurs et les échecs

Assurez-vous de gérer les potentielles erreurs lorsque vous travaillez avec des proxies :

try :
    response = requests.get(url, proxies=proxies, timeout=5)
    response.raise_for_status()  # Provoque une exception pour les codes statut > 400
except requests.exceptions.RequestException as e :
    print(f'Erreur : {e}')
    # Reprendre avec un autre proxy ici

Stratégies avancées pour éviter le blocage

Changer fréquemment de proxy

En changeant constamment de proxy après chaque requête ou série de requêtes, on réduit les chances de détection :

for url in urls_to_scrape :
    proxy = proxy_pool.get_random_proxy()
    proxies = {
      'http' : f"http://{proxy['ip']} :{proxy['port']}",
      'https' : f"https://{proxy['ip']} :{proxy['port']}"
    }
    try :
        response = requests.get(url, proxies=proxies, timeout=5)
        if response.status_code == 200 :
            soup = BeautifulSoup(response.content, 'html.parser')
            process_data(soup)
    except Exception as e :
        continue  # Passer au prochain proxy si erreur

Personnaliser les en-têtes HTTP

L’adaptation des en-têtes HTTP pour simuler un navigateur réel peut également aider à éviter le blocage :

headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language' : 'en-US,en;q=0.9'
}

response = requests.get(url, proxies=proxies, headers=headers)

Nettoyer et sauvegarder les données extraites

Après extraction des données, nettoyer et stocker ces informations dans des formats tels que CSV ou base de données aide à l’analyse :

Nettoyage des données

Utilisez Pandas pour manipuler et nettoyer facilement l’ensemble de données :

import pandas as pd

data = []  # Remplissez cette liste avec les données extraites
df = pd.DataFrame(data)

# Exemple de nettoyage
df.drop_duplicates(inplace=True)
df.to_csv('extracted_data.csv', index=False)

Sauvegarde dans une base de données

SQLAlchemy permet de sauvegarder directement dans une base de données :

from sqlalchemy import create_engine

engine = create_engine('sqlite:///extracted_data.db')
df.to_sql('web_data', engine, if_exists='replace', index=False)

Outils alternatifs de scraping et comparaison

Scrapy

Pour ceux qui cherchent plus de fonctionnalités, Scrapy est une alternative puissante à Beautiful Soup avec des options intégrées pour la gestion de proxies :

# Installation
pip install scrapy

# Initialisation d'un projet Scrapy
scrapy startproject myproject

Comparaison rapide

Beautiful Soup est excellent pour les projets simples et ciblés, tandis que Scrapy est mieux adapté aux projets complexes nécessitant un contrôle granulé et des fonctionnalités avancées. Choisir entre les deux dépend de la spécificité et de la complexité du projet.