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.
Para extraer imágenes de Yahoo Imágenes, necesitará las siguientes bibliotecas de Python:
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
En primer lugar, necesitamos importar las librerías necesarias para nuestro scraper.
import requests
from lxml import html
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
)
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.
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)
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)
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:
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0