Cómo extraer imágenes de Yahoo Imágenes con Python

Comentarios: 0

El scrapeo de imágenes desde Yahoo Image Search es importante a la hora de generar conjuntos de datos de imágenes. Esta guía explica cómo raspar imágenes de Yahoo Image Search utilizando Python, así como la biblioteca Requests en combinación con lxml para las técnicas de análisis HTML. También aborda el uso de proxy para evitar ser detectado por los sistemas de detección de bots de Yahoo.

Herramientas y bibliotecas necesarias

Para extraer imágenes de Yahoo Imágenes, necesitará las siguientes bibliotecas de Python:

  • Requests: Para realizar peticiones HTTP.
  • lxml: Para analizar HTML.
  • Proxies: Para evitar bloqueos de IP durante el scraping extensivo.

Instalación de bibliotecas de terceros

Asegúrese de tener instaladas todas las bibliotecas necesarias. Instálalas usando pip:

pip install requests
pip install lxml

O utiliza un único comando:

pip install requests lxml

Guía paso a paso del scraping con Python

En primer lugar, necesitamos importar las librerías necesarias para nuestro scraper.

import requests
from lxml import html

Realizar una búsqueda en Yahoo Imágenes

A continuación, realizaremos una búsqueda en Yahoo Imágenes.

Aquí definiremos una consulta de búsqueda como cachorros y enviaremos una solicitud GET a la búsqueda de Yahoo Imágenes con las cabeceras necesarias. Las cabeceras de solicitud son importantes para imitar una solicitud de navegador, lo que ayuda a eludir algunos mecanismos básicos de detección de bots.

# Definir cabeceras para imitar la petición de un navegador
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",
}

# Definir la consulta de búsqueda
search_query = "puppies"

# Haz una petición GET a la página de búsqueda de Yahoo Imágenes
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Analizar URL de imágenes con lxml

Tras recibir la respuesta de Yahoo, tenemos que analizar el HTML para extraer las URL de las imágenes. Para ello utilizamos lxml.

# Analizar la respuesta HTML
parser = fromstring(response.text)

# Extraer URL de imágenes mediante XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

La función fromstring se utiliza para analizar el texto de respuesta HTML. Xpath se utiliza para extraer las URL de las imágenes. La siguiente captura de pantalla muestra cómo se obtuvo el xpath.

yaho.png

Descargar las imágenes

Con la lista de URL de las imágenes, ahora tenemos que descargar cada una de ellas.

Aquí, haremos un bucle a través de la lista images_urls para extraer tanto el recuento(índice) como la url(dirección). A continuación, cada imagen se descargará enviando una solicitud GET a la url correspondiente.

# Descargue cada imagen y guárdela en un archivo
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Guardar las imágenes

Por último, guardamos las imágenes descargadas en el sistema de archivos local. Definimos una función download_file que se encarga del proceso de guardado de archivos.

Esta función toma el recuento (para crear nombres de archivo únicos) y la respuesta (que contiene los datos de la imagen). Determina la extensión del archivo a partir de la cabecera Content-Type y guarda el archivo en el directorio ./images/.

def download_file(count, response):
    # Obtener la extensión del archivo de la cabecera Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Crear el directorio si no existe
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Escribir el contenido de la respuesta en el archivo
    with open(filename, "wb") as f:
        f.write(response.content)

Llamando a esta función dentro del bucle, guardamos cada imagen descargada:

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

Mecanismos de detección de bots de Yahoo

Al extraer datos de Yahoo, es importante conocer los mecanismos de detección de bots de Yahoo. Yahoo utiliza principalmente estas técnicas para identificar y bloquear bots automatizados:

  • Limitación de la tasa de IP: Yahoo supervisa la tasa de solicitudes procedentes de una única dirección IP. Un exceso de peticiones desde una IP puede provocar baneos temporales o permanentes.
  • CAPTCHAs: Yahoo puede implementar CAPTCHAs a los usuarios para verificar que son humanos.

Uso de proxies para evitar la detección

Para evitar ser bloqueados por el mecanismo de detección de bots de Yahoo, especialmente cuando realizamos varias peticiones desde la misma IP, utilizamos proxies para enmascarar nuestra dirección IP.

Enrutando nuestras peticiones a través de diferentes proxies, podemos distribuir nuestra actividad de scraping a través de múltiples direcciones IP, reduciendo así la probabilidad de ser detectados.

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

Código completo

Aquí está el script completo para scrapear imágenes de los resultados de búsqueda de Yahoo Imágenes usando proxies:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Guarda el contenido de una respuesta en un archivo del directorio ./images/.

    Args:
        count (int): Un identificador único para el archivo.
        response (requests.Response): La respuesta HTTP que contiene el contenido del archivo.

    """
    # Obtener la extensión del archivo de la cabecera Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Crear el directorio si no existe
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Escribir el contenido de la respuesta en el archivo
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Función principal para buscar imágenes y descargarlas.

    Esta función realiza los siguientes pasos:
    1. Configura las cabeceras de la petición.
    2. Busca imágenes de cachorros en Yahoo.
    3. 3. Analiza la respuesta HTML para extraer las URL de las imágenes.
    4. 4. Descarga cada imagen y la guarda en el directorio ./images/.

    """
    # Definir cabeceras para imitar la petición de un navegador
    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",
    }

    # Definir proxies para eludir la limitación de velocidad
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Definir la consulta de búsqueda
    search_query = "puppies"

    # Haz una petición GET a la página de búsqueda de Yahoo Imágenes
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Analizar la respuesta HTML
    parser = fromstring(response.text)

    # Extraer URL de imágenes mediante XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Descargue cada imagen y guárdela en un archivo
    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()

El scraping de imágenes de Yahoo Image Search con Python es una potente técnica para automatizar las tareas de recopilación y análisis de datos. Utilizando la biblioteca Requests para las peticiones HTTP y la biblioteca lxml para el análisis sintáctico de HTML, puede extraer eficazmente las URL de las imágenes y descargarlas. La incorporación de proxies le ayuda a evitar la detección y prevenir las prohibiciones de IP durante las actividades de scraping extensivo.

Comentarios:

0 Comentarios