Comment récupérer des images de Yahoo Images en utilisant Python

Commentaires: 0

La récupération d'images à partir de Yahoo Image Search est importante lors de la génération d'ensembles de données d'images. Ce guide explique comment récupérer des images de Yahoo Image Search en utilisant Python ainsi que la bibliothèque Requests en combinaison avec lxml pour les techniques d'analyse HTML. Il aborde également l'utilisation d'un proxy afin d'éviter d'être pris par les systèmes de détection des robots de Yahoo.

Outils et bibliothèques nécessaires

Pour récupérer des images de Yahoo Images, vous aurez besoin des bibliothèques Python suivantes :

  • Requests: Pour effectuer des requêtes HTTP.
  • lxml: Pour l'analyse du langage HTML.
  • Proxies: Pour éviter les interdictions d'IP lors d'un scraping intensif.

Installation de bibliothèques tierces

Assurez-vous que toutes les bibliothèques nécessaires sont installées. Installez-les à l'aide de pip :

pip install requests
pip install lxml

Ou utiliser une seule commande :

pip install requests lxml

Guide pas à pas du scraping avec Python

Tout d'abord, nous devons importer les bibliothèques nécessaires à notre scraper.

import requests
from lxml import html

Effectuer une recherche dans Yahoo Images

Ensuite, nous effectuerons une recherche sur Yahoo Images.

Ici, nous allons définir une requête de recherche sous la forme de chiots et envoyer une demande GET à Yahoo Images Search avec les en-têtes nécessaires. Les en-têtes sont importants pour imiter une requête de navigateur, ce qui permet de contourner certains mécanismes de détection des robots.

# Définir des en-têtes pour imiter une requête de navigateur
headers = {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "accept-language": "en-IN,en;q=0.9",
    "cache-control": "max-age=0",
    "dnt": "1",
    "priority": "u=0, i",
    "sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Linux"',
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "none",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
}

# Définir la requête de recherche
search_query = "puppies"

# Effectuez une requête GET vers la page de recherche Yahoo Images
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Analyse des URL d'images avec lxml

Après avoir reçu la réponse de Yahoo, nous devons analyser le code HTML pour extraire les URL des images. Nous utilisons lxml à cette fin.

# Analyse de la réponse HTML
parser = fromstring(response.text)

# Extraire des URL d'images à l'aide de XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

La fonction fromstring est utilisée pour analyser le texte de la réponse HTML. Xpath est utilisée pour extraire les URL des images. La capture d'écran ci-dessous montre comment le xpath a été obtenu.

yaho.png

Télécharger les images

Avec la liste des URL des images, nous devons maintenant télécharger chaque image.

Ici, nous allons parcourir en boucle la liste images_urls pour en extraire à la fois le nombre (index) et l'adresse (url). Chaque image sera ensuite téléchargée en envoyant une requête GET à l'url correspondante.

# Télécharger chaque image et l'enregistrer dans un fichier
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Sauvegarde des images

Enfin, nous enregistrons les images téléchargées sur le système de fichiers local. Nous définissons une fonction download_file qui gère le processus d'enregistrement des fichiers.

Cette fonction prend le compte (pour créer des noms de fichiers uniques) et la réponse (contenant les données de l'image). Elle détermine l'extension du fichier à partir de l'en-tête Content-Type et enregistre le fichier dans le répertoire ./images/.

def download_file(count, response):
    # Obtenir l'extension du fichier à partir de l'en-tête Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Créer le répertoire s'il n'existe pas
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Écrire le contenu de la réponse dans le fichier
    with open(filename, "wb") as f:
        f.write(response.content)

En appelant cette fonction dans la boucle, nous enregistrons chaque image téléchargée :

for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)
    download_file(count, response)

Mécanismes de détection des robots par Yahoo

Lors de l'extraction de données de Yahoo, il est important de connaître les mécanismes de détection des robots de Yahoo. Yahoo utilise principalement ces techniques pour identifier et bloquer les robots automatisés :

  • Limitation du taux d'IP : Yahoo surveille le nombre de requêtes provenant d'une seule adresse IP. Les demandes excessives provenant d'une seule adresse IP peuvent entraîner des interdictions temporaires ou permanentes.
  • CAPTCHAs : Yahoo peut mettre en œuvre des CAPTCHAs pour les utilisateurs afin de vérifier qu'ils sont humains.

Utiliser des proxys pour éviter la détection

Pour éviter d'être bloqués par le mécanisme de détection des robots de Yahoo, en particulier lorsque nous effectuons plusieurs demandes à partir de la même adresse IP, nous utilisons des proxys pour masquer notre adresse IP.

En acheminant nos demandes via différents proxys, nous pouvons répartir notre activité de scraping sur plusieurs adresses IP, ce qui réduit la probabilité d'être détecté.

proxies = {
    'http': 'http://USER:PASS@HOST:PORT',
    'https': 'http://USER:PASS@HOST:PORT'
}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)

Code complet

Voici le script complet pour récupérer les images des résultats de recherche de Yahoo Images en utilisant des proxies :

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Enregistre le contenu d'une réponse dans un fichier du répertoire ./images/.

    Args:
        count (int): Un identifiant unique pour le fichier.
        response (requests.Response): La réponse HTTP contenant le contenu du fichier.

    """
    # Obtenir l'extension du fichier à partir de l'en-tête Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Créer le répertoire s'il n'existe pas
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Écrire le contenu de la réponse dans le fichier
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Fonction principale permettant de rechercher des images et de les télécharger.

    Cette fonction exécute les étapes suivantes :
    1. Configure les en-têtes de la requête.
    2. Recherche d'images de chiots sur Yahoo.
    3. Analyse la réponse HTML pour extraire les URL des images.
    4. Télécharge chaque image et l'enregistre dans le répertoire ./images/.

    """
    # Définir des en-têtes pour imiter une requête de navigateur
    headers = {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "accept-language": "en-IN,en;q=0.9",
        "cache-control": "max-age=0",
        "dnt": "1",
        "priority": "u=0, i",
        "sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"Linux"',
        "sec-fetch-dest": "document",
        "sec-fetch-mode": "navigate",
        "sec-fetch-site": "none",
        "sec-fetch-user": "?1",
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    }

    # Définir des proxys pour contourner la limitation de débit
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Définir la requête de recherche
    search_query = "puppies"

    # Effectuez une requête GET vers la page de recherche Yahoo Images
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Analyse de la réponse HTML
    parser = fromstring(response.text)

    # Extraire des URL d'images à l'aide de XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Télécharger chaque image et l'enregistrer dans un fichier
    for count, url in enumerate(images_urls):
        response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
        download_file(count, response)


if __name__ == "__main__":
    main()

L'extraction d'images de Yahoo Image Search à l'aide de Python est une technique puissante pour automatiser les tâches de collecte et d'analyse de données. En utilisant la bibliothèque Requests pour les requêtes HTTP et la bibliothèque lxml pour l'analyse HTML, vous pouvez extraire efficacement les URL des images et les télécharger. L'utilisation de proxies vous permet d'éviter la détection et le bannissement d'IP lors d'activités de scraping intensives.

Commentaires:

0 Commentaires