Wie man mit Python Bilder von Yahoo Images scrapen kann

Bemerkungen: 0

Das Scraping von Bildern aus der Yahoo-Bildersuche ist wichtig für die Erstellung von Bilddatensätzen. Dieser Leitfaden erklärt, wie man Bilder aus der Yahoo-Bildersuche mit Python und der Requests-Bibliothek in Kombination mit lxml für HTML-Parsing-Techniken scrapen kann. Er geht auch auf die Verwendung von Proxys ein, um zu vermeiden, dass sie von den Yahoo-Bot-Erkennungssystemen erfasst werden.

Erforderliche Tools und Bibliotheken

Um Bilder von Yahoo Images zu scrapen, benötigen Sie die folgenden Python-Bibliotheken:

  • Requests: Für die Erstellung von HTTP-Anfragen.
  • lxml: Für das Parsen von HTML.
  • Proxies: Zur Vermeidung von IP-Sperren bei umfangreichem Scraping.

Installation von Bibliotheken von Drittanbietern

Stellen Sie sicher, dass Sie alle notwendigen Bibliotheken installiert haben. Installieren Sie sie mit pip:

pip install requests
pip install lxml

Oder verwenden Sie einen einzigen Befehl:

pip install requests lxml

Schritt-für-Schritt-Anleitung für Scraping mit Python

Zunächst müssen wir die notwendigen Bibliotheken für unseren Scraper importieren.

import requests
from lxml import html

Ausführen einer Yahoo-Bilder-Suche

Als nächstes führen wir eine Suche bei Yahoo Images durch.

Hier werden wir eine Suchanfrage als Welpen definieren und eine GET-Anfrage an die Yahoo-Bilder-Suche mit den notwendigen Headern senden. Die Header der Anfrage sind wichtig, um eine Browser-Anfrage zu imitieren, wodurch einige grundlegende Bot-Erkennungsmechanismen umgangen werden können.

# Definieren Sie Header, um eine Browser-Anfrage zu imitieren
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",
}

# Definieren Sie die Suchanfrage
search_query = "puppies"

# Stellen Sie eine GET-Anfrage an die Suchseite von Yahoo Images
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Bild-URLs mit lxml analysieren

Nachdem wir die Antwort von Yahoo erhalten haben, müssen wir das HTML analysieren, um die URLs der Bilder zu extrahieren. Zu diesem Zweck verwenden wir lxml.

# Analysieren Sie die HTML-Antwort
parser = fromstring(response.text)

# Extrahieren von Bild-URLs mit XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

Die Funktion fromstring wird zum Parsen des HTML-Antworttextes verwendet. Xpath wird verwendet, um URLs von Bildern zu extrahieren. Der folgende Screenshot zeigt, wie der Xpath ermittelt wurde.

yaho.png

Die Bilder herunterladen

Mit der Liste der Bild-URLs müssen wir nun jedes Bild herunterladen.

Dazu wird die Liste images_urls in einer Schleife durchlaufen, um sowohl die Anzahl (index) als auch die URL (Adresse) zu extrahieren. Jedes Bild wird dann heruntergeladen, indem eine GET-Anfrage an die entsprechende URL gesendet wird.

# Laden Sie jedes Bild herunter und speichern Sie es in einer Datei
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Speichern der Bilder

Schließlich speichern wir die heruntergeladenen Bilder im lokalen Dateisystem. Wir definieren eine Funktion download_file, die den Speichervorgang übernimmt.

Diese Funktion nimmt die Anzahl (um eindeutige Dateinamen zu erzeugen) und die Antwort (die die Bilddaten enthält). Sie bestimmt die Dateierweiterung aus dem Content-Type-Header und speichert die Datei im Verzeichnis ./images/.

def download_file(count, response):
    # Ermitteln der Dateierweiterung aus dem Content-Type-Header
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Erstellen Sie das Verzeichnis, wenn es nicht existiert
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Schreiben des Antwortinhalts in die Datei
    with open(filename, "wb") as f:
        f.write(response.content)

Durch den Aufruf dieser Funktion innerhalb der Schleife wird jedes heruntergeladene Bild gespeichert:

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

Yahoo's Bot-Erkennungsmechanismen

Beim Scrapen von Daten von Yahoo ist es wichtig, sich der Bot-Erkennungsmechanismen von Yahoo bewusst zu sein. Yahoo verwendet diese Techniken hauptsächlich, um automatisierte Bots zu identifizieren und zu blockieren:

  • IP-Ratenbegrenzung: Yahoo überwacht die Rate der Anfragen, die von einer einzelnen IP-Adresse kommen. Übermäßige Anfragen von einer IP-Adresse können zu vorübergehenden oder dauerhaften Sperren führen.
  • CAPTCHAs: Yahoo kann CAPTCHAs einsetzen, um zu überprüfen, ob es sich bei den Nutzern um Menschen handelt.

Verwendung von Proxys zur Vermeidung einer Entdeckung

Um zu vermeiden, dass wir vom Yahoo-Bot-Erkennungsmechanismus blockiert werden, insbesondere wenn wir mehrere Anfragen von derselben IP-Adresse stellen, verwenden wir Proxys, um unsere IP-Adresse zu maskieren.

Indem wir unsere Anfragen über verschiedene Proxys leiten, können wir unsere Scraping-Aktivitäten auf mehrere IP-Adressen verteilen und so die Wahrscheinlichkeit verringern, entdeckt zu werden.

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

Kompletter Code

Hier ist das komplette Skript zum Scrapen von Bildern aus Yahoo Images Suchergebnissen unter Verwendung von Proxys:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Speichert den Inhalt einer Antwort in einer Datei im Verzeichnis ./images/.

    Args:
        count (int): Ein eindeutiger Bezeichner für die Datei.
        response (requests.Response): Die HTTP-Antwort, die den Inhalt der Datei enthält.

    """
    # Ermitteln der Dateierweiterung aus dem Content-Type-Header
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Erstellen Sie das Verzeichnis, wenn es nicht existiert
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Schreiben des Antwortinhalts in die Datei
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Hauptfunktion, um nach Bildern zu suchen und sie herunterzuladen.

    Diese Funktion führt die folgenden Schritte aus:
    1. Richtet die Kopfzeilen der Anfrage ein.
    2. Sucht nach Bildern von Welpen auf Yahoo.
    3. Analysiert die HTML-Antwort, um die Bild-URLs zu extrahieren.
    4. Lädt jedes Bild herunter und speichert es in dem Verzeichnis ./images/.

    """
    # Definieren Sie Header, um eine Browser-Anfrage zu imitieren
    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",
    }

    # Definieren Sie Proxys zur Umgehung der Ratenbegrenzung
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Definieren Sie die Suchanfrage
    search_query = "puppies"

    # Stellen Sie eine GET-Anfrage an die Suchseite von Yahoo Images
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Analysieren Sie die HTML-Antwort
    parser = fromstring(response.text)

    # Extrahieren von Bild-URLs mit XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Laden Sie jedes Bild herunter und speichern Sie es in einer Datei
    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()

Das Scraping von Bildern aus der Yahoo-Bildersuche mit Python ist eine leistungsstarke Technik zur Automatisierung von Datenerfassungs- und Analyseaufgaben. Durch die Verwendung der Requests-Bibliothek für HTTP-Anfragen und der lxml-Bibliothek für das HTML-Parsing können Sie effizient Bild-URLs extrahieren und die Bilder herunterladen. Durch die Einbindung von Proxys können Sie bei umfangreichen Scraping-Aktivitäten die Erkennung und das Verbot von IP-Sperren vermeiden.

Bemerkungen:

0 Bemerkungen