Dans cet article de blog, nous vous guiderons à travers le processus de récupération d'images à partir de sites Web à l'aide de Python. Vous apprendrez à démarrer avec les bibliothèques les plus courantes, à gérer les pièges potentiels et même à explorer des techniques avancées pour faire passer vos compétences en matière de web scraping au niveau supérieur.
Pour commencer à faire du scraping d'images avec Python, vous devez vous familiariser avec quelques bibliothèques clés qui facilitent cette tâche. Les choix les plus populaires sont BeautifulSoup, Scrapy et Requests.
BeautifulSoup est une bibliothèque Python utilisée pour analyser les documents HTML et XML. Elle crée un arbre d'analyse à partir des codes sources des pages qui peut être utilisé pour extraire facilement des données.
Voici un exemple simple d'extraction d'URL d'images à l'aide de BeautifulSoup :
pip install bs4 requests
import requests
from bs4 import BeautifulSoup
url = 'https://books.toscrape.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
images = soup.find_all('img')
This code fetches the HTML content of the specified URL, parses it with BeautifulSoup, and then finds all the `<img>` tags, printing out their `src` attributes.
Une fois que vous avez extrait les URL des images, l'étape suivante consiste à les télécharger. La bibliothèque Requests est parfaite pour cette tâche en raison de sa simplicité et de sa facilité d'utilisation.
Voici comment télécharger des images à l'aide de Requests :
for ind, img in enumerate(images):
img_data = requests.get(url+img['src']).content
with open(f'image_{ind+1}.jpg', 'wb') as handler:
handler.write(img_data)
Ce script envoie une requête GET à l'URL de l'image et écrit le contenu binaire de l'image dans un fichier.
Il est important de gérer les erreurs et les exceptions afin de garantir le bon fonctionnement de votre script, même lorsque des problèmes surviennent. Voici une version améliorée du script précédent :
for ind, img in enumerate(images):
try:
img_data = requests.get(url+img['src']).content
with open(f'image_{ind+1}.jpg', 'wb') as handler:
handler.write(img_data)
except Exception as e:
print(f"An error occurred during the extraction of image \n Image Url: {img['src']} \n Error: {e}")
Cet extrait de code comprend un bloc "try-except" qui permet de détecter toute erreur pouvant survenir au cours du processus de téléchargement.
Pour les tâches de scraping plus complexes, telles que le scraping de plusieurs pages ou de sites web entiers, Scrapy est une bibliothèque puissante qui peut gérer ces scénarios de manière efficace.
Scrapy est un framework open-source et collaboratif de web crawling pour Python. Il est conçu pour être rapide et efficace, ce qui le rend idéal pour les projets de scraping à grande échelle.
pip install scrapy
scrapy startproject image_scraper
cd image_scraper
Créez un fichier spider (`spiders/image_spider.py`) avec le contenu suivant :
import scrapy
class ImageSpider(scrapy.Spider):
name = 'imagespider'
start_urls = ['https://books.toscrape.com/']
def parse(self, response):
# Extract image URLs and convert them to absolute if necessary
for img in response.css('img::attr(src)').getall():
abs_img_url = response.urljoin(img)
yield {'image_url': abs_img_url}
# Find the link to the next page and create a request for it
next_page = response.css('a.next::attr(href)').get()
if next_page is not None:
next_page_url = response.urljoin(next_page)
yield response.follow(next_page_url, self.parse)
Ce simple spider Scrapy démarre à l'URL donnée, extrait toutes les URL d'images et suit les liens de la page suivante pour continuer le scraping.
Pour améliorer encore vos projets de scraping, envisagez d'utiliser des API pour accéder à des images de haute qualité et d'automatiser vos tâches pour plus d'efficacité.
Les API constituent un moyen fiable et légal d'accéder aux images. De nombreux sites web proposent des API qui vous permettent de rechercher et de télécharger des images de manière programmatique. L'un de ces sites est Unsplash API.
import requests
# Replace 'YOUR_ACCESS_KEY' with your actual Unsplash Access Key
api_url = "https://api.unsplash.com/photos/random"
headers = {"Authorization": "Client-ID YOUR_ACCESS_KEY"}
params = {"query": "nature"}
try:
response = requests.get(api_url, headers=headers, params=params)
response.raise_for_status() # This will raise an exception for HTTP errors
data = response.json()
image_url = data['urls']['full']
print(image_url)
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"An error occurred: {err}")
Ce script utilise l'API Unsplash pour récupérer une image aléatoire de la nature.
L'automatisation permet de gagner du temps et de s'assurer que les tâches de scraping se déroulent sans intervention manuelle. Des outils tels que les tâches cron sur les systèmes Unix ou le planificateur de tâches sur Windows peuvent programmer l'exécution de vos scripts à intervalles réguliers.
Crontab est un utilitaire puissant des systèmes d'exploitation de type Unix qui permet de planifier des tâches, appelées"travaux cron", afin qu'elles s'exécutent automatiquement à des moments précis. Voyons comment programmer une tâche à l'aide de Crontab.
Un fichier crontab se compose de lignes de commande, chaque ligne représentant une tâche distincte. La syntaxe est la suivante :
MIN HEURE DOM MON DOW CMD
Voici un exemple d'exécution d'un script python tous les jours à 20h00
0 20 * * * * /usr/bin/python3/path/to/Image_Scraper.py
Dans cet article de blog, nous avons exploré comment récupérer des images sur des sites web en utilisant Python. Nous avons couvert les bases avec BeautifulSoup et Requests, les techniques avancées avec Scrapy, et les pratiques éthiques de scraping. En outre, nous avons discuté de la manière d'améliorer vos projets de scraping en utilisant des API et des outils d'automatisation tels que le planificateur de tâches Windows.
Le scraping d'images est une compétence puissante qui peut améliorer vos capacités d'acquisition de données et ouvrir de nouvelles possibilités pour vos projets.
Bon grattage !