Come raschiare le immagini da Yahoo Images utilizzando Python

Commenti: 0

Lo scraping di immagini da Yahoo Image Search è importante quando si generano insiemi di dati di immagini. Questa guida spiega come effettuare lo scraping di immagini da Yahoo Image Search utilizzando Python e la libreria Requests in combinazione con lxml per le tecniche di parsing HTML. Tratta anche l'uso di proxy per evitare di essere scoperti dai sistemi di rilevamento dei bot di Yahoo.

Strumenti e librerie necessari

Per effettuare lo scraping di immagini da Yahoo Images, sono necessarie le seguenti librerie Python:

  • Requests: Per effettuare richieste HTTP.
  • lxml: Per analizzare l'HTML.
  • Proxy: Per evitare i divieti IP durante lo scraping estensivo.

Installazione di librerie di terze parti

Assicurarsi di avere installato tutte le librerie necessarie. Installarle usando pip:

pip install requests
pip install lxml

Oppure utilizzare un singolo comando:

pip install requests lxml

Guida passo-passo allo scraping con Python

Per prima cosa, dobbiamo importare le librerie necessarie per il nostro scraper.

import requests
from lxml import html

Eseguire una ricerca su Yahoo Images

Eseguiamo quindi una ricerca su Yahoo Images.

Qui definiremo una query di ricerca come cuccioli e invieremo una richiesta GET alla ricerca Yahoo Images con le intestazioni necessarie. Le intestazioni della richiesta sono importanti per imitare una richiesta del browser, il che aiuta a bypassare alcuni meccanismi di base di rilevamento dei bot.

# Definire le intestazioni per simulare una richiesta del 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",
}

# Definire la query di ricerca
search_query = "puppies"

# Effettuare una richiesta GET alla pagina di ricerca di Yahoo Images
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Analizzare gli URL delle immagini con lxml

Dopo aver ricevuto la risposta da Yahoo, dobbiamo analizzare l'HTML per estrarre gli URL delle immagini. A tale scopo utilizziamo lxml.

# Analizzare la risposta HTML
parser = fromstring(response.text)

# Estrarre gli URL delle immagini con XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

La funzione fromstring viene utilizzata per analizzare il testo di risposta HTML. Xpath è usato per estrarre gli URL delle immagini. La schermata seguente mostra come è stato ottenuto l'xpath.

yaho.png

Scarica le immagini

Con l'elenco degli URL delle immagini, ora dobbiamo scaricare ogni immagine.

In questo caso, si scorre l'elenco images_urls per estrarre sia il conteggio (indice) sia l'url (indirizzo). Ogni immagine sarà quindi scaricata inviando una richiesta GET al rispettivo url.

# Scaricare ogni immagine e salvarla in un file
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Salvataggio delle immagini

Infine, salviamo le immagini scaricate nel filesystem locale. Definiamo una funzione download_file che gestisce il processo di salvataggio dei file.

Questa funzione prende il conteggio (per creare nomi di file unici) e la risposta (contenente i dati dell'immagine). Determina l'estensione del file dall'intestazione Content-Type e salva il file nella cartella ./images/.

def download_file(count, response):
    # Ottenere l'estensione del file dall'intestazione Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Creare la directory se non esiste
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Scrivere il contenuto della risposta nel file
    with open(filename, "wb") as f:
        f.write(response.content)

Richiamando questa funzione all'interno del ciclo, salviamo ogni immagine scaricata:

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

I meccanismi di rilevamento dei bot di Yahoo

Durante lo scraping di dati da Yahoo, è importante conoscere i meccanismi di rilevamento dei bot di Yahoo. Yahoo utilizza principalmente queste tecniche per identificare e bloccare i bot automatici:

  • Limitazione della velocità IP: Yahoo monitora la frequenza delle richieste provenienti da un singolo indirizzo IP. Richieste eccessive da un IP possono portare a divieti temporanei o permanenti.
  • CAPTCHA: Yahoo può implementare CAPTCHA agli utenti per verificare che siano umani.

Utilizzo di proxy per evitare il rilevamento

Per evitare di essere bloccati dal meccanismo di rilevamento dei bot di Yahoo, soprattutto quando si effettuano più richieste dallo stesso IP, utilizziamo dei proxy per mascherare il nostro indirizzo IP.

Inoltrando le nostre richieste attraverso diversi proxy, possiamo distribuire la nostra attività di scraping su più indirizzi IP, riducendo così la probabilità di essere individuati.

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

Codice completo

Ecco lo script completo per lo scraping delle immagini dai risultati di ricerca di Yahoo Images utilizzando i proxy:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Salva il contenuto di una risposta in un file nella directory ./images/.

    Args:
        count (int): Un identificatore unico per il file.
        response (requests.Response): La risposta HTTP contenente il contenuto del file.

    """
    # Ottenere l'estensione del file dall'intestazione Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Creare la directory se non esiste
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Scrivere il contenuto della risposta nel file
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Funzione principale per cercare immagini e scaricarle.

    Questa funzione esegue le seguenti operazioni:
    1. Imposta le intestazioni della richiesta.
    2. Cerca immagini di cuccioli su Yahoo.
    3. Analizza la risposta HTML per estrarre gli URL delle immagini.
    4. Scarica ogni immagine e la salva nella directory ./images/.

    """
    # Definire le intestazioni per simulare una richiesta del 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",
    }

    # Definire i proxy per bypassare la limitazione di velocità
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Definire la query di ricerca
    search_query = "puppies"

    # Effettuare una richiesta GET alla pagina di ricerca di Yahoo Images
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Analizzare la risposta HTML
    parser = fromstring(response.text)

    # Estrarre gli URL delle immagini con XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Scaricare ogni immagine e salvarla in un file
    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()

Lo scraping di immagini da Yahoo Image Search con Python è una tecnica potente per automatizzare le attività di raccolta e analisi dei dati. Utilizzando la libreria Requests per le richieste HTTP e la libreria lxml per l'analisi dell'HTML, è possibile estrarre in modo efficiente gli URL delle immagini e scaricare le immagini. L'integrazione di proxy consente di evitare il rilevamento e di prevenire i divieti IP durante le attività di scraping più estese.

Commenti:

0 Commenti