Tutoriel sur le Scraping web avec AutoScraper

AutoScraper est un outil Python convivial pour les débutants qui simplifie le Scraping web, en traitant les sites web structurés et dynamiques avec un minimum de codage.
18 min de lecture
Web Scraping with AutoScraper

AutoScraper est une bibliothèque Python qui simplifie le Scraping web en identifiant et en extrayant automatiquement les données des sites web sans inspection manuelle du code HTML. Contrairement aux outils de Scraping web traditionnels, AutoScraper apprend la structure des éléments de données à partir d’exemples de requêtes, ce qui en fait un excellent choix pour les développeurs débutants comme pour les plus expérimentés. Idéal pour des tâches telles que la collecte d’informations sur les produits, l’agrégation de contenu ou la réalisation d’Etudes de marché, AutoScraper gère efficacement les sites web dynamiques, sans aucune configuration complexe.

Dans cet article, vous apprendrez à utiliser AutoScraper avec Python pour le Scraping web.

Prérequis

La configuration d’AutoScraper est facile. Vous devez bien sûr avoir installé Python 3 ou une version ultérieure localement. Comme pour tout autre projet de Scraping web Python, il vous suffit d’exécuter quelques commandes pour créer un répertoire de projet, puis de créer et d’activer un environnement virtuel dans celui-ci :

# Configurer le répertoire du projet
mkdir auto-scrape
cd auto-scrape

# Créer un environnement virtuel
python -m venv env
# Pour les utilisateurs Mac et Linux
source env/bin/activate
# Pour les utilisateurs Windows
venvScriptsactivate

L’utilisation d’un environnement virtuel simplifie la gestion des dépendances dans le projet.

Ensuite, installez la bibliothèque autoscraper en exécutant la commande suivante :

pip install autoscraper

Vous devez également installer pandas pour enregistrer les résultats du scraping dans un fichier CSV à la fin. pandas est une bibliothèque Python qui offre un outil d’analyse et de manipulation de données facile à utiliser. Elle vous permet de traiter et d’enregistrer facilement les résultats du scraping dans différents formats, tels que CSV, XLSX et JSON. Exécutez la commande suivante pour l’installer :

pip install pandas

Sélectionnez un site web cible

Lorsque vous scrapez des sites web publics, veillez à vérifier les conditions d’utilisation (ToS) du site ou le fichier robots.txt pour vous assurer que le site autorise le scraping. Cela vous permettra d’éviter tout problème juridique ou éthique. De plus, il est préférable de sélectionner des sites web qui fournissent des données dans un format structuré, tel que des tableaux ou des listes, qui sont plus faciles à extraire.

Les outils de scraping traditionnels nécessitent souvent d’analyser la structure HTML d’une page web pour localiser les éléments de données cibles. Cela peut prendre beaucoup de temps et nécessite de bien connaître des outils tels que les consoles de développement des navigateurs. Cependant, AutoScraper simplifie cette étape en apprenant automatiquement la structure des données à partir d’exemples (également appelés wanted_list), ce qui élimine le besoin d’une inspection manuelle.

Dans ce tutoriel, vous commencerez par extraire des données de la page « Countries of the World: A Simple Example » (Pays du monde: un exemple simple) du site Scrape This Site, un bac à sable convivial pour les débutants, conçu pour tester les outils de scraping. Cette page a une structure simple, idéale pour démontrer les techniques de scraping de base. Une fois que vous aurez maîtrisé la structure de base, vous passerez à la page « Hockey Teams: Forms, Searching and Pagination » (Équipes de hockey : formulaires, recherche et pagination), qui présente une mise en page plus complexe.

Récupérer des données simples avec AutoScraper

Maintenant que vous avez identifié deux pages que vous souhaitez extraire, il est temps de commencer l’extraction !

Comme la page « Countries of the World: A Simple Example » (Pays du monde : un exemple simple) est simple, le script suivant peut être utilisé pour extraire une liste de pays, ainsi que leur capitale, leur population et leur superficie :

# 1. Importer les dépendances
from autoscraper import AutoScraper
import pandas as pd

# 2. Définir l'URL du site à extraire
url = "https://www.scrapethissite.com/pages/simple/"

# 3. Instancier AutoScraper
scraper = AutoScraper()

# 4. Définir la liste souhaitée à l'aide d'un exemple tiré de la page web
# Cette liste doit contenir du texte ou des valeurs que vous souhaitez extraire
wanted_list = ["Andorre", "Andorre-la-Vieille", "84000", "468,0"]

# 5. Construisez le Scraper en fonction de la liste souhaitée et de l'URL
scraper.build(url, wanted_list)

# 6. Obtenez les résultats pour tous les éléments correspondants
results = scraper.get_result_similar(url, grouped=True)

# 7. Affichez les clés et les exemples de données pour comprendre la structure
print("Keys found by the Scraper:", results.keys())

# 8. Attribuez des colonnes en fonction des clés du Scraper et de l'ordre attendu des données.
columns = ["Nom du pays", "Capitale", "Superficie (km²)", "Population"]

# 9. Créez un DataFrame avec les données extraites.
data = {columns[i]: results[list(results.keys())[i]] for i in range(len(columns))}
df = pd.DataFrame(data)

# 10. Enregistrer le DataFrame dans un fichier CSV
csv_filename = 'countries_data.csv'
df.to_csv(csv_filename, index=False)

print(f"Les données ont été enregistrées avec succès dans {csv_filename}")

Ce code comporte des commentaires intégrés qui expliquent ce qui se passe, mais voici un bref résumé : le script commence par importer AutoScraper et pandas. Ensuite, vous définissez l’URL du site web cible. Puis, vous créez une instance du Scraper.

Voici maintenant la partie intéressante : au lieu de fournir des instructions détaillées au Scraper sur l’emplacement des données cibles sur le site web (comme vous le feriez pour d’autres Scrapers, probablement via XPath ou d’autres sélecteurs), vous fournissez simplement un exemple des données que vous recherchez. Sous le quatrième commentaire, les points de données pour l’un des pays sont fournis au Scraper sous forme de tableau (également appelé wanted_list).

Une fois la wanted_list prête, vous créez le Scraper à l’aide de l’URL et de la wanted_list. Le Scraper télécharge le site web cible et génère des règles qu’il stocke dans sa liste de pile. Il utilise ces règles pour extraire les données de n’importe quelle URL cible à l’avenir.

Dans le code sous le commentaire six, vous utilisez la méthode get_result_similar sur le modèle AutoScraper pour extraire les données de l’URL cible qui sont similaires aux données de la wanted_list. La ligne suivante est une simple instruction d'impression qui vous montre les ID des règles sous lesquelles les données ont été trouvées sur l’URL cible. Votre résultat devrait ressembler à ceci :

Clés trouvées par le Scraper : dict_keys(['rule_4y6n', 'rule_gghn', 'rule_a6r9', 'rule_os29'])

Le code sous les commentaires huit et neuf crée le schéma d’en-tête pour votre fichier CSV et formate les données extraites dans un DataFrame pandas. Enfin, le code sous le commentaire dix enregistre les données dans le fichier CSV.

Une fois que vous avez exécuté ce script (en enregistrant le script précédent dans un fichier appelé script.py et en exécutant python script.py sur la ligne de commande), vous remarquerez qu’un nouveau fichier nommé countries_data.csv a été créé dans le répertoire du projet avec un contenu qui ressemble à ceci :

Nom du pays,Capitale,Superficie (km²),Population
Andorre,Andorre-la-Vieille,84000,468,0
Émirats arabes unis,Abou Dhabi,4975593,82880,0
...246 lignes réduites
Zambie,Lusaka,13460305,752614,0
Zimbabwe, Harare, 11651858, 390580,0

Et voilà ! C’est aussi simple que cela de scraper des sites web simples avec AutoScraper.

Traiter et extraire des données à partir de sites web à la conception complexe

Lorsqu’il s’agit de sites web légèrement plus complexes, comme la page Hockey Teams: Forms, Searching and Pagination qui contient un tableau avec de nombreuses valeurs similaires, la technique présentée précédemment peut échouer. Vous pouvez essayer d’extraire le nom de l’équipe, l’année, les victoires, les défaites et d’autres champs de ce site web en utilisant la même méthode que celle présentée précédemment pour constater le problème par vous-même.

Heureusement, AutoScraper permet un apprentissage plus précis du modèle en élaguant les règles collectées lors de l’étape de construction avant d’utiliser le modèle pour extraire les données. Voici le code qui vous aidera à le faire :

from autoscraper import AutoScraper
import pandas as pd

# Définir l'URL du site à scraper
url = "https://www.scrapethissite.com/pages/forms/"

def setup_model():

    # Instancier AutoScraper
    scraper = AutoScraper()

    # Définir la liste souhaitée à l'aide d'un exemple tiré de la page web
    # Cette liste doit contenir du texte ou des valeurs que vous souhaitez extraire
    wanted_list = ["Boston Bruins", "1990", "44", "24", "0.55", "299", "264", "35"]

    # Construire le Scraper à partir de la liste souhaitée et de l'URL
    scraper.build(url, wanted_list)

    # Obtenir les résultats pour tous les éléments correspondants
    results = scraper.get_result_similar(url, grouped=True)

    # Afficher les données pour comprendre la structure
    print(results)

    # Enregistrer le modèle
    scraper.save("teams_model.json")

def prune_rules():
    # Créer une instance d'Autoscraper
    scraper = AutoScraper()
    
    # Charger le modèle enregistré précédemment
    scraper.load("teams_model.json")

    # Mettre à jour le modèle pour ne conserver que les règles nécessaires
    Scraper.keep_rules(['rule_hjk5', 'rule_9sty', 'rule_2hml', 'rule_3qvv', 'rule_e8x1', 'rule_mhl4', 'rule_h090', 'rule_xg34'])

    # Enregistrer à nouveau le modèle mis à jour
    scraper.save("teams_model.json")
    
def load_and_run_model():
    # Créer une instance de Scraper
    scraper = Scraper()
    
    # Charger le modèle enregistré précédemment
    scraper.load("teams_model.json")

    # Obtenir les résultats pour tous les éléments correspondants
    results = Scraper.get_result_similar(url, grouped=True)

    # Attribuer des colonnes en fonction des clés du Scraper et de l'ordre attendu des données
    columns = ["Nom de l'équipe", "Année", "Victoires", "Défaites", "Pourcentage de victoires", "Buts marqués (GF)", "Buts encaissés (GA)", "+/-"]

    # Créer un DataFrame avec les données extraites
    data = {columns[i]: results[list(results.keys())[i]] for i in range(len(columns))}
    df = pd.DataFrame(data)

    # Enregistrer le DataFrame dans un fichier CSV
    csv_filename = 'teams_data.csv'
    df.to_csv(csv_filename, index=False)

    print(f"Les données ont été enregistrées avec succès dans {csv_filename}")

# setup_model()
# prune_rules()
# load_and_run_model()

Ce script contient trois méthodes : setup_model, prune_rules et load_and_run_model. La méthode setup_model est similaire à celle que vous avez vue précédemment. Elle crée une instance d’un Scraper, crée une wanted_list, construit le Scraper à l’aide de la wanted_list, extrait les données de l’URL cible à l’aide de ce Scraper, imprime les clés (c’est-à-dire les ID de règles collectés lors de cette extraction) et enregistre le modèle tel quel dans un fichier nommé teams_model.json dans le répertoire du projet.

Pour l’exécuter, décommentez la ligne # setup_model() dans le script précédent, enregistrez le script complet dans un fichier (par exemple script.py) et exécutez pythonscript.py`. Votre sortie devrait ressembler à ceci :

{'rule_hjk5': ['Boston Bruins', 'Buffalo Sabres', 'Calgary Flames', 'Chicago Blackhawks', 'Detroit Red Wings', 'Edmonton Oilers', 'Hartford Whalers', 'Los Angeles Kings', 'Minnesota North Stars', 'Montreal Canadiens', 'New Jersey Devils', 'New York Islanders', 'New York Rangers', 'Philadelphia Flyers', 'Pittsburgh Penguins', 'Quebec Nordiques', 'St. Louis Blues', 'Toronto Maple Leafs', 'Vancouver Canucks', 'Washington Capitals', 'Winnipeg Jets', 'Boston Bruins', 'Buffalo Sabres', 'Calgary Flames', 'Chicago Blackhawks'], 'rule_uuj6': ['Boston Bruins', Buffalo Sabres, Calgary Flames, Chicago Blackhawks, Detroit Red Wings, Edmonton Oilers, Hartford Whalers, Los Angeles Kings, Minnesota North Stars, Montreal Canadiens, New Jersey Devils, New York Islanders, New York Rangers, Philadelphia Flyers, Pittsburgh Penguins,Quebec Nordiques', 'St. Louis Blues', 'Toronto Maple Leafs', 'Vancouver Canucks', 'Washington Capitals', 'Winnipeg Jets', 'Boston Bruins', 'Buffalo Sabres', 'Calgary Flames', 'Chicago Blackhawks'], 'rule_9sty': ['1990', '1990', '1990', « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_9nie » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_41rr » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_ufil » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_ere2 » : ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_w0vo » : ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_rba5 » : ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_rmae » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_ccvi » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_3c34 » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_4j80 » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_oc36 » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_93k1 » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_d31n » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_ghh5 » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », «1991', '1991', '1991'], 'rule_5rne': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_4p78 » : ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_qr7s': ['1990', '1990', '1990', '1990', « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_60nk » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_wcj7 » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_0x7y » : [« 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1990 », « 1991 », « 1991 », « 1991 », « 1991 »], « rule_2hml » : [« 44 », « 31 », « 46 », « 49 », « 34 », « 37 », « 31 », « 46 », « 27 », « 39 », « 32 », « 25 », « 36 », « 33 », « 41 », « 16 », « 47 », « 23 », « 28 », « 37 », « 26 », « 36 », « 31 », « 31 », « 36 »], « rule_swtb » : [« 24 »], « rule_e8x1 » : [« 0,55 », « 14 », « 0,575 », « 0,613 », « -25 », « 0 », « -38 », « 0,575 », « -10 », « 24 », « 8 », « -67 », « 32 », « -15 », « 0,512 », « -118 », « 0,588 », « -77 », « -72 », « 0 », « -28 », « -5 », « -10 », « -9 », « 21 »], « rule_3qvv » : [« 24 », « 30 », « 26 », « 23 », « 38 », « 37 », « 38 », « 24 », « 39 », « 30 », « 33 », « 45 », « 31 », « 37 », « 33 », « 50 », « 22 », '46', '43', '36', '43', '32', '37', '37', '29'], 'rule_n07w': ['24', '30', '26', '23', '38', '37', '38', '24', '39', '30', '33', « 45 », « 31 », « 37 », « 33 », « 50 », « 22 », « 46 », « 43 », « 36 », « 43 », « 32 », « 37 », « 37 », « 29 »], « rule_qmem » : [« 0,55 », « 0,388 », « 0,575 », '0,613', '0,425', '0,463', '0,388', '0,575', '0,338', '0,487', '0,4', '0,312', '0,45', '0,412', '0,512', '0,2', « 0,588 », « 0,287 », « 0,35 », « 0,463 », '0,325', '0,45', '0,388', '0,388', '0,45'], 'rule_b9gx' : ['264', '278', '263', '211', '298', '272', '276', '254', '266', '249', « 264 », « 290 », « 265 », « 267 », « 305 », « 354 », « 250 », « 318 », « 315 », « 258 », « 288 », « 275 », « 299 », « 305 », « 236 »], « rule_mhl4 » : [« 299 », « 292 », « 344 », « 284 », « 273 », « 272 », « 238 », « 340 », « 256 », « 273 », « 272 », « 223 », « 297 », « 252 », '342', '236', '310', '241', '243', '258', '260', '270', '289', '296', '257'], 'rule_24nt': ['264', '278', « 263 », « 211 », « 298 », « 272 », « 276 », « 254 », « 266 », « 249 », « 264 », « 290 », « 265 », « 267 », « 305 », « 354 », « 250 », « 318 », « 315 », « 258 », « 288 », « 275 », « 299 », « 305 », « 236 »], « rule_h090 » : [« 264 », « 278 », « 263 », « 211 », « 298 », « 272 », « 276 », « 254 », « 266 », « 249 », « 264 », « 290 », « 265 », « 267 », « 305 », « 354 », « 250 », « 318 », « 315 », « 258 », « 288 », « 275 », « 299 », « 305 », « 236 »], « rule_xg34 » : [« 35 », « 14 », « 81 », « 73 », « -25 », « 0 », « -38 », « 86 », « -10 », « 24 », « 8 », « -67 », « 32 », « -15 », « 37 », « -118 », « 60 », « -77 », « -72 », « 0 », « -28 », « -5 », « -10 », « -9 », « 21 »]

Ceci montre l’ensemble des données collectées par AutoScraper dans son appel get_result_similar à partir du site web cible. Vous remarquerez que ces données contiennent de nombreux doublons. Cela s’explique par le fait qu’AutoScraper ne se contente pas de collecter les données du site web cible, mais tente également de leur donner un sens en devinant les relations entre elles et en créant des groupes de points de données appelés règles qu’il estime être liés les uns aux autres. S’il parvient à regrouper correctement les données, vous pourrez extraire très facilement des données de sites web similaires, comme vous l’avez fait dans l’exemple précédent.

Cependant, AutoScraper semble avoir des difficultés avec ce site web. Comme il contient beaucoup de chiffres, AutoScraper finit par supposer un grand nombre de corrélations entre les différents chiffres, ce qui vous donne un ensemble de données volumineux contenant des Points de données en double.

Vous devez maintenant analyser attentivement cet ensemble de données et sélectionner les règles qui contiennent les données correctes (c’est-à-dire qui contiennent uniquement les données correctes d’une colonne dans le bon ordre) pour votre tâche de scraping.

Pour cette sortie, les règles suivantes contenaient les données correctes (trouvées en examinant manuellement certains points de données et en s’assurant que chacune des règles sélectionnées recevait vingt-cinq éléments de données, soit le nombre de lignes du tableau de la page cible) :

['rule_hjk5', 'rule_9sty', 'rule_2hml', 'rule_3qvv', 'rule_e8x1', 'rule_mhl4', 'rule_h090', 'rule_xg34']

Vous devez mettre à jour cela dans la méthode prune_rules. Ensuite, vous devez commenter la ligne setup_model() et décommenter la ligne prune_rules() dans le script, puis l’exécuter. Cette fois, il charge le modèle précédemment créé à partir du fichier teams_model.json, supprime tout sauf les règles répertoriées, puis le sauvegarde à nouveau dans le même fichier. Vous pouvez même consulter le contenu du fichier teams_model.json pour voir quelles règles y sont actuellement stockées. Une fois que vous avez terminé, votre modèle est prêt.

Vous pouvez maintenant exécuter la méthode load_and_run_model en commentant les lignes prune_rules et prune_rules, en décommentant la ligne load_and_run_model dans le même script et en le réexécutant. Il extrait et enregistre les données appropriées pour vous dans un fichier nommé teams_data.csv dans le répertoire du projet, tout en affichant le résultat suivant :

Les données ont été enregistrées avec succès dans teams_data.csv

Voici à quoi ressemble le fichier teams_data.csv après une exécution réussie :

Nom de l'équipe, Année, Victoires, Défaites, Pourcentage de victoires, Buts marqués (GF), Buts encaissés (GA), +/-
Boston Bruins, 1990, 44, 0,55, 24, 299, 264, 35
Buffalo Sabres,1990,31,14,30,292,278,14
...21 lignes supplémentaires
Calgary Flames,1991,31,-9,37,296,305,-9
Chicago Blackhawks,1991,36,21,29,257,236,21

Vous pouvez consulter le code développé dans cet article dans ce dépôt GitHub.

Défis courants avec AutoScraper

Si AutoScraper est très efficace pour les cas d’utilisation simples où le site web cible contient un ensemble de données relativement petit avec des Points de données distincts, il peut être fastidieux à configurer pour des cas d’utilisation complexes, comme un site web avec un tableau comme celui que vous avez vu précédemment. De plus, AutoScraper ne prend pas en charge le rendu JavaScript, vous devez donc l’intégrer à un module comme Splash ou à une bibliothèque complète comme Selenium ou Puppeteer.

Si vous rencontrez des problèmes tels que des blocages d’IP ou si vous devez personnaliser les en-têtes lors du scraping, AutoScraper prend en charge la spécification d’un ensemble de paramètres de requête supplémentaires utilisés par son module de requêtes, comme ceci :

# construire le Scraper sur une URL initiale
scraper.build(
    url,
    wanted_list=wanted_list,
    request_args=dict(proxies=proxies) # c'est ici que vous pouvez passer une liste de Proxies ou d'en-têtes client
)

Par exemple, voici comment vous pouvez définir un agent utilisateur personnalisé et un Proxy pour le scraping avec AutoScraper :

request_args = { 
  "headers: {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 
            (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"  # Vous pouvez personnaliser cette valeur avec l'agent utilisateur de votre choix. Cette valeur est celle utilisée par défaut par Autoscraper.
  },
  "proxies": {
    "http": "http://user:[email protected]:3128/" # Exemple de Proxy pour vous montrer comment utiliser les valeurs du port Proxy, de l'hôte, du nom d'utilisateur et du mot de passe.
  }
}
# créer le Scraper sur une URL initiale
scraper.build(
    url,
    wanted_list=wanted_list,
    request_args=request_args
)

Cependant, si vous souhaitez éviter d’être bloqué à plusieurs reprises, vous avez besoin d’un bon Proxy optimisé pour le Scraping web. Pour cela, vous devriez envisager d’utiliser lesProxys résidentiels Bright Data, qui couvrent plus de 150 millions d’adresses IP résidentielles dans 195 pays.

La bibliothèque AutoScraper utilise en interne la bibliothèque Python request pour envoyer des requêtes au site web cible, et elle ne prend pas en charge de manière inhérente la limitation du débit. Pour gérer les restrictions de limitation du débit imposées par les sites web, vous devez configurer manuellement une fonction de limitation ou utiliser une solution préconstruite telle que la bibliothèque ratelimit.

Comme AutoScraper ne fonctionne qu’avec des sites web non dynamiques, il ne peut pas du tout gérer les sites protégés par CAPTCHA. Dans ce cas, il est judicieux d’utiliser une solution plus détaillée comme l’API Bright Data Scraping web, qui vous fournit des données structurées provenant de sites tels que LinkedIn, Amazon et Zillow.

Conclusion

Dans cet article, vous avez découvert ce qu’est AutoScraper et comment l’utiliser pour extraire des données de sites web simples et complexes. Comme vous l’avez vu, AutoScraper s’appuie sur un simple appel de requêtes pour accéder aux sites web cibles, ce qui signifie qu’il a souvent des difficultés avec les sites web dynamiques et ceux protégés par des défis tels que CAPTCHA. De plus, vous devez utiliser des Proxy lors du Scraping web, car la plupart des sites web peuvent identifier les clients dont le trafic est anormalement élevé. Dans ce cas, Bright Data peut vous aider.

Bright Data est l’un des principaux fournisseurs de réseaux de proxys, de scrapers web alimentés par l’IA et d’ensembles de données prêts à l’emploi. Inscrivez-vous dès maintenant et commencez à explorer les produits de Bright Data, y compris un essai gratuit !