Como extrair imagens do Yahoo Images usando Python

Comentários: 0

A extração de imagens do Yahoo Image Search é importante ao gerar conjuntos de dados de imagens. Este guia explica como extrair imagens do Yahoo Image Search usando Python, bem como a biblioteca Requests em combinação com lxml para técnicas de análise de HTML. Ele também aborda o uso de proxy para evitar ser pego pelos sistemas de deteção de bots do Yahoo.

Ferramentas e bibliotecas necessárias

Para extrair imagens do Yahoo Images, você precisará das seguintes bibliotecas Python:

  • Requests: Para fazer requisições HTTP.
  • lxml: Para analisar HTML.
  • Proxies: Para evitar proibições de IP durante a raspagem extensiva.

Instalação de bibliotecas de terceiros

Certifique-se de que tem todas as bibliotecas necessárias instaladas. Instale-as usando o pip:

pip install requests
pip install lxml

Ou utilizar um único comando:

pip install requests lxml

Guia passo-a-passo para fazer scraping com Python

Primeiro, precisamos de importar as bibliotecas necessárias para o nosso scraper.

import requests
from lxml import html

Fazer uma pesquisa no Yahoo Images

Em seguida, faremos uma pesquisa no Yahoo Images.

Aqui vamos definir uma consulta de pesquisa como cachorros e enviar uma solicitação GET para a pesquisa do Yahoo Images com os cabeçalhos necessários. Os cabeçalhos da solicitação são importantes para imitar uma solicitação do navegador, o que ajuda a contornar alguns mecanismos básicos de deteção de bots.

# Definir cabeçalhos para imitar um pedido do browser
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 a consulta de pesquisa
search_query = "puppies"

# Fazer um pedido GET para a página de pesquisa do Yahoo Images
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Parse URLs de imagens com lxml

Depois de receber a resposta do Yahoo, precisamos analisar o HTML para extrair os URLs das imagens. Usamos o lxml para esse fim.

# Analisar a resposta HTML
parser = fromstring(response.text)

# Extrair URLs de imagens utilizando XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

A função fromstring é utilizada para analisar o texto de resposta HTML. Xpath é usada para extrair URLs de imagens. A captura de tela abaixo mostra como o xpath foi obtido.

yaho.png

Baixar as imagens

Com a lista de URLs de imagens, precisamos agora de fazer o download de cada imagem.

Aqui, vamos percorrer a lista images_urls para extrair tanto a contagem (índice) quanto a url (endereço). Cada imagem será então baixada enviando uma requisição GET para a respectiva url.

# Descarregar cada imagem e guardá-la num ficheiro
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Guardar as imagens

Finalmente, guardamos as imagens descarregadas no sistema de ficheiros local. Definimos uma função download_file que lida com o processo de salvar o arquivo.

Esta função recebe a contagem (para criar nomes de ficheiros únicos) e a resposta (que contém os dados da imagem). Determina a extensão do ficheiro a partir do cabeçalho Content-Type e guarda o ficheiro no diretório ./images/.

def download_file(count, response):
    # Obter a extensão do ficheiro a partir do cabeçalho Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Criar o diretório se este não existir
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Escrever o conteúdo da resposta no ficheiro
    with open(filename, "wb") as f:
        f.write(response.content)

Ao chamar esta função dentro do ciclo, guardamos cada imagem descarregada:

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

Mecanismos de deteção de bots do Yahoo

Ao extrair dados do Yahoo, é importante estar ciente dos mecanismos de deteção de bots do Yahoo. O Yahoo usa principalmente essas técnicas para identificar e bloquear bots automatizados:

  • Limitação da taxa de IP: O Yahoo monitora a taxa de solicitações provenientes de um único endereço IP. Solicitações excessivas de um IP podem levar a proibições temporárias ou permanentes.
  • CAPTCHAs: O Yahoo pode implementar CAPTCHAs aos usuários para verificar se eles são humanos.

Utilizar proxies para evitar a deteção

Para evitar sermos bloqueados pelo mecanismo de deteção de bots do Yahoo, especialmente quando fazemos vários pedidos a partir do mesmo IP, utilizamos proxies para mascarar o nosso endereço IP.

Ao encaminhar os nossos pedidos através de diferentes proxies, podemos distribuir a nossa atividade de scraping por vários endereços IP, reduzindo assim a probabilidade de sermos 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

Aqui está o script completo para extrair imagens dos resultados de pesquisa do Yahoo Images usando proxies:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Salva o conteúdo de uma resposta em um arquivo no diretório ./images/.

    Args:
        count (int): Um identificador único para o ficheiro.
        response (requests.Response): A resposta HTTP que contém o conteúdo do ficheiro.

    """
    # Obter a extensão do ficheiro a partir do cabeçalho Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Criar o diretório se este não existir
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Escrever o conteúdo da resposta no ficheiro
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Função principal para procurar imagens e descarregá-las.

    Esta função executa os seguintes passos:
    1. Configura os cabeçalhos do pedido.
    2. Procura por imagens de cachorros no Yahoo.
    3. Analisa a resposta HTML para extrair os URLs das imagens.
    4. Descarrega cada imagem e guarda-a no diretório ./images/.

    """
    # Definir cabeçalhos para imitar um pedido do browser
    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 contornar a limitação de taxa
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Definir a consulta de pesquisa
    search_query = "puppies"

    # Fazer um pedido GET para a página de pesquisa do Yahoo Images
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Analisar a resposta HTML
    parser = fromstring(response.text)

    # Extrair URLs de imagens utilizando XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Descarregar cada imagem e guardá-la num ficheiro
    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()

Extrair imagens do Yahoo Image Search utilizando Python é uma técnica poderosa para automatizar tarefas de recolha e análise de dados. Utilizando a biblioteca Requests para pedidos HTTP e a biblioteca lxml para análise de HTML, pode extrair eficazmente URLs de imagens e descarregar as imagens. A incorporação de proxies ajuda-o a evitar a deteção e a prevenir proibições de IP durante actividades de extração extensivas.

Comentários:

0 Comentários