Vos scrapers sont-ils bloqués lorsque vous essayez de charger des données à partir de pages Web dynamiques ? Êtes-vous frustré par les défilements infinis ou ces satanés boutons « Charger plus » ?
Vous n'êtes pas seul. Aujourd'hui, de nombreux sites Web mettent en œuvre ces conceptions pour améliorer l'expérience utilisateur, mais elles peuvent s'avérer difficiles pour les web scrapers.
Ce didacticiel vous guidera à travers une procédure pas à pas adaptée aux débutants pour gratter une page de démonstration avec un bouton Charger plus. Voici à quoi ressemble la page Web cible :
À la fin, vous apprendrez à :
Plongeons-nous !
Avant de vous lancer, assurez-vous des prérequis suivants :
Bibliothèques requises :
Vous pouvez installer ces bibliothèques en utilisant la commande suivante dans votre terminal :
pip install requests beautifulsoup4 selenium
Avant d'utiliser Selenium, vous devez installer un pilote Web correspondant à votre navigateur. Pour ce didacticiel, nous utiliserons Google Chrome et ChromeDriver. Cependant, vous pouvez suivre des étapes similaires pour d'autres navigateurs comme Firefox ou Edge.
Installer le pilote Web
Ouvrez Google Chrome et accédez à Aide > À propos de Google Chrome dans le menu à trois points pour trouver la version de Chrome.
Télécharger le pilote Chrome :
Visitez la page de téléchargement de ChromeDriver.
Téléchargez la version du pilote qui correspond à votre version de Chrome.
Ajoutez ChromeDriver à votre système PATH :
Extrayez le fichier téléchargé et placez-le dans un répertoire tel que /usr/local/bin (Mac/Linux) ou C:WindowsSystem32 (Windows).
Vérifier l'installation
Initialisez un fichier Python scraper.py dans le répertoire de votre projet et testez que tout est correctement configuré en exécutant l'extrait de code suivant :
from selenium import webdriver driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH driver.get("https://www.scrapingcourse.com/button-click") print(driver.title) driver.quit()
Vous pouvez exécuter le code du fichier ci-dessus en exécutant la commande suivante sur votre terminal :
pip install requests beautifulsoup4 selenium
Si le code ci-dessus s'exécute sans erreur, il lancera une interface de navigateur et ouvrira l'URL de la page de démonstration comme indiqué ci-dessous :
Selenium extraira ensuite le HTML et imprimera le titre de la page. Vous verrez une sortie comme celle-ci -
from selenium import webdriver driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH driver.get("https://www.scrapingcourse.com/button-click") print(driver.title) driver.quit()
Cela vérifie que Selenium est prêt à être utilisé. Une fois toutes les exigences installées et prêtes à être utilisées, vous pouvez commencer à accéder au contenu de la page de démonstration.
La première étape consiste à récupérer le contenu initial de la page, ce qui vous donne un instantané de base du code HTML de la page. Cela vous aidera à vérifier la connectivité et à garantir un point de départ valide pour le processus de scraping.
Vous récupérerez le contenu HTML de l'URL de la page en envoyant une requête GET à l'aide de la bibliothèque Requests en Python. Voici le code :
python scraper.py
Le code ci-dessus affichera le HTML brut contenant les données des 12 premiers produits.
Cet aperçu rapide du code HTML garantit que la demande a abouti et que vous travaillez avec des données valides.
Pour accéder aux produits restants, vous devrez cliquer par programme sur le bouton « Charger plus » sur la page jusqu'à ce qu'il n'y ait plus de produits disponibles. Étant donné que cette interaction implique JavaScript, vous utiliserez Selenium pour simuler le clic sur le bouton.
Avant d'écrire du code, inspectons la page pour localiser :
Vous obtiendrez tous les produits en chargeant plus de produits, ce qui vous donnera un ensemble de données plus grand en exécutant le code suivant :
Load More Button Challenge to Learn Web Scraping - ScrapingCourse.com
Ce code ouvre le navigateur, accède à la page et interagit avec le bouton « Charger plus ». Le HTML mis à jour, contenant désormais plus de données produit, est ensuite extrait.
Si vous ne souhaitez pas que Selenium ouvre le navigateur à chaque fois que vous exécutez ce code, il fournit également des fonctionnalités de navigateur sans tête. Un navigateur sans tête possède toutes les fonctionnalités d'un véritable navigateur Web mais pas d'interface utilisateur graphique (GUI).
Vous pouvez activer le mode sans tête pour Chrome dans Selenium en définissant un objet ChromeOptions et en le transmettant au constructeur WebDriver Chrome comme ceci :
import requests # URL of the demo page with products url = "https://www.scrapingcourse.com/button-click" # Send a GET request to the URL response = requests.get(url) # Check if the request was successful if response.status_code == 200: html_content = response.text print(html_content) # Optional: Preview the HTML else: print(f"Failed to retrieve content: {response.status_code}")
Lorsque vous exécutez le code ci-dessus, Selenium lancera une instance Chrome sans tête, vous ne verrez donc plus de fenêtre Chrome. C'est idéal pour les environnements de production où vous ne souhaitez pas gaspiller de ressources sur l'interface graphique lors de l'exécution du script de scraping sur un serveur.
Maintenant que le contenu HTML complet est récupéré, il est temps d'extraire des détails spécifiques sur chaque produit.
Dans cette étape, vous utiliserez BeautifulSoup pour analyser le HTML et identifier les éléments du produit. Ensuite, vous extrairez les détails clés de chaque produit, tels que le nom, le prix et les liens.
pip install requests beautifulsoup4 selenium
Dans le résultat, vous devriez voir une liste structurée de détails sur le produit, y compris le nom, l'URL de l'image, le prix et le lien vers la page du produit, comme ceci -
from selenium import webdriver driver = webdriver.Chrome() # Ensure ChromeDriver is installed and in PATH driver.get("https://www.scrapingcourse.com/button-click") print(driver.title) driver.quit()
Le code ci-dessus organisera les données HTML brutes dans un format structuré, ce qui facilitera l'utilisation et la préparation des données de sortie pour un traitement ultérieur.
Vous pouvez désormais organiser les données extraites dans un fichier CSV, ce qui facilite leur analyse ou leur partage. Le module CSV de Python y contribue.
python scraper.py
Le code ci-dessus créera un nouveau fichier CSV avec tous les détails requis sur le produit.
Voici le code complet pour un aperçu :
Load More Button Challenge to Learn Web Scraping - ScrapingCourse.com
Le code ci-dessus créera un products.csv qui ressemblerait à ceci :
import requests # URL of the demo page with products url = "https://www.scrapingcourse.com/button-click" # Send a GET request to the URL response = requests.get(url) # Check if the request was successful if response.status_code == 200: html_content = response.text print(html_content) # Optional: Preview the HTML else: print(f"Failed to retrieve content: {response.status_code}")
Maintenant, disons que vous souhaitez identifier les 5 produits les plus chers et extraire des données supplémentaires (telles que la description du produit et le code SKU) de leurs pages individuelles. Vous pouvez le faire en utilisant le code comme suit :
from selenium import webdriver from selenium.webdriver.common.by import By import time # Set up the WebDriver (make sure you have the appropriate driver installed, e.g., ChromeDriver) driver = webdriver.Chrome() # Open the page driver.get("https://www.scrapingcourse.com/button-click") # Loop to click the "Load More" button until there are no more products while True: try: # Find the "Load more" button by its ID and click it load_more_button = driver.find_element(By.ID, "load-more-btn") load_more_button.click() # Wait for the content to load (adjust time as necessary) time.sleep(2) except Exception as e: # If no "Load More" button is found (end of products), break out of the loop print("No more products to load.") break # Get the updated page content after all products are loaded html_content = driver.page_source # Close the browser window driver.quit()
Voici le code complet pour un aperçu :
from selenium import webdriver from selenium.webdriver.common.by import By import time # instantiate a Chrome options object options = webdriver.ChromeOptions() # set the options to use Chrome in headless mode options.add_argument("--headless=new") # initialize an instance of the Chrome driver (browser) in headless mode driver = webdriver.Chrome(options=options) ...
Ce code trie les produits par prix par ordre décroissant. Ensuite, pour les 5 produits les plus chers, le script ouvre leurs pages de produits et extrait la description du produit et le SKU à l'aide de BeautifulSoup.
La sortie du code ci-dessus ressemblera à ceci :
from bs4 import BeautifulSoup # Parse the page content with BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') # Extract product details products = [] # Find all product items in the grid product_items = soup.find_all('div', class_='product-item') for product in product_items: # Extract the product name name = product.find('span', class_='product-name').get_text(strip=True) # Extract the product price price = product.find('span', class_='product-price').get_text(strip=True) # Extract the product link link = product.find('a')['href'] # Extract the image URL image_url = product.find('img')['src'] # Create a dictionary with the product details products.append({ 'name': name, 'price': price, 'link': link, 'image_url': image_url }) # Print the extracted product details for product in products[:2]: print(f"Name: {product['name']}") print(f"Price: {product['price']}") print(f"Link: {product['link']}") print(f"Image URL: {product['image_url']}") print('-' * 30)
Le code ci-dessus mettra à jour le products.csv et il contiendra désormais des informations comme celle-ci :
Name: Chaz Kangeroo Hoodie Price: Link: https://scrapingcourse.com/ecommerce/product/chaz-kangeroo-hoodie Image URL: https://scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh01-gray_main.jpg ------------------------------ Name: Teton Pullover Hoodie Price: Link: https://scrapingcourse.com/ecommerce/product/teton-pullover-hoodie Image URL: https://scrapingcourse.com/ecommerce/wp-content/uploads/2024/03/mh02-black_main.jpg ------------------------------ …
Gratter des pages avec un défilement infini ou des boutons « Charger plus » peut sembler difficile, mais l'utilisation d'outils tels que Requests, Selenium et BeautifulSoup simplifie le processus.
Ce tutoriel a montré comment récupérer et traiter les données produit à partir d'une page de démonstration, en les enregistrant dans un format structuré pour un accès rapide et facile.
Voir tous les extraits de code ici.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!