Skip to content

bright-data-de/images-scraping-python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 

Repository files navigation

Images von einer Website in Python scrapen

Bright Data Promo

Dieser Leitfaden erklärt, wie Sie Images von Websites mit Python und Selenium scrapen und damit die Datenerfassung für Machine Learning, Marktanalysen und Content-Kuration verbessern:

Benefits of Image Extraction

Web scraping ist nicht auf Textinformationen beschränkt. Sie können verschiedene Datentypen anvisieren, einschließlich Multimediadateien wie Images. Das Extrahieren von Images aus Websites dient mehreren wertvollen Zwecken:

  • Trainingsdaten für KI- und Machine-Learning-Modelle sammeln: Laden Sie Images herunter, um die Genauigkeit und Leistung Ihres Modells zu verbessern.
  • Visuelle Marketingstrategien von Wettbewerbern analysieren: Helfen Sie Ihrem Marketingteam, Trends zu verstehen, indem Sie Images untersuchen, die Ihre Wettbewerber verwenden, um zentrale Botschaften zu vermitteln.
  • Sammlung hochwertiger Visuals automatisieren: Sammeln Sie ansprechende Images, um Ihre Website- und Social-Media-Präsenz zu stärken und so das Interesse der Zielgruppe zu gewinnen und zu halten.

Python Image Extraction Tutorial

Um Images aus einer Webseite zu extrahieren, müssen Sie diese Schlüsselschritte befolgen:

  1. Eine Verbindung zur Ziel-Website herstellen
  2. Relevante Image-HTML-Elemente identifizieren und auswählen
  3. Image-URLs aus diesen Elementen extrahieren
  4. Die tatsächlichen Image-Dateien über diese URLs herunterladen

Für dieses Tutorial arbeiten wir mit Unsplash, einem der beliebtesten Image-Repositories im Web. So sieht die Suchergebnisseite für kostenlose „wallpaper“-Images aus:

searching for free wallpaper images

Beachten Sie, wie die Seite beim Scrollen kontinuierlich neue Images nachlädt. Dieses dynamische Laden erfordert Browser-Automation-Tools für effektives Scraping.

Wir arbeiten mit dieser spezifischen URL:

https://unsplash.com/s/photos/wallpaper?license=free 

Getting Started

Bevor Sie beginnen, stellen Sie sicher, dass Python 3 auf Ihrem Computer installiert ist. Falls nicht, laden Sie den Installer herunter, führen Sie ihn aus und folgen Sie den Setup-Anweisungen.

Richten Sie Ihr Python-Projekt zur Image-Extraktion mit diesen Befehlen ein:

mkdir image-scraper cd image-scraper python -m venv env

Dies erstellt ein image-scraper-Verzeichnis mit einer Python-virtual environment darin.

Öffnen Sie den Projektordner in Ihrer bevorzugten Python-IDE. PyCharm Community Edition oder Visual Studio Code mit der Python extension sind ausgezeichnete Optionen.

Erstellen Sie eine Datei scraper.py in Ihrem Projektordner und fügen Sie diesen initialen Code hinzu:

print('Hello, World!')

Derzeit zeigt diese Datei lediglich „Hello, World!“ an, aber wir werden sie bald in ein Tool zur Image-Extraktion verwandeln.

Testen Sie, dass Ihr Script funktioniert, indem Sie in Ihrer IDE auf den Run-Button klicken oder Folgendes ausführen:

python scraper.py

Sie sollten die folgende Ausgabe in Ihrem Terminal sehen:

Hello, World! 

Perfekt! Ihr Python-Projekt ist bereit. Nun implementieren wir die Logik, die benötigt wird, um Images von Websites zu extrahieren.

Installing Selenium

Selenium ist eine ausgezeichnete Library für die Image-Extraktion, weil sie sowohl statische als auch dynamische Website-Inhalte verarbeitet. Als Browser-Automation-Tool kann es Seiten rendern, die eine Ausführung von JavaScript erfordern. Erfahren Sie mehr im Selenium-Web-Scraping-Guide.

Im Vergleich zu HTML-Parsern wie BeautifulSoup zielt Selenium auf mehr Websites ab und unterstützt mehr Use Cases. Es ist besonders effektiv bei Image-Anbietern, die Interaktionen nutzen, um zusätzliche Images zu laden—genau das macht Unsplash.

Bevor Sie Selenium installieren, aktivieren Sie Ihre Python virtual environment. Unter Windows verwenden Sie:

env\Scripts\activate

Unter macOS und Linux verwenden Sie:

source env/bin/activate

Installieren Sie in der aktivierten Umgebung das Selenium WebDriver package mit:

pip install selenium

Bitte haben Sie während der Installation Geduld, da sie einige Zeit dauern kann.

Connecting to the Target Website

Importieren Sie Selenium und die notwendigen Klassen zur Steuerung von Chrome, indem Sie diese Zeilen zu scraper.py hinzufügen:

from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options

Initialisieren Sie nun eine headless Chrome WebDriver-Instanz:

# to run Chrome in headless mode options = Options() options.add_argument("--headless") # comment while developing # initialize a Chrome WerbDriver instance # with the specified options driver = webdriver.Chrome( service=ChromeService(), options=options )

Kommentieren Sie die Option --headless während der Entwicklung aus, wenn Sie möchten, dass Selenium ein sichtbares Chrome-Fenster öffnet, sodass Sie die Aktionen des Scripts in Echtzeit überwachen können. Für die Produktion lassen Sie die Option --headless aktiviert, um Ressourcen zu sparen.

Schließen Sie das Browserfenster, indem Sie diese Zeile am Ende Ihres Scripts hinzufügen:

# close the browser and free up its resources driver.quit() 

Um Probleme mit responsiven Inhalten zu vermeiden, maximieren Sie das Chrome-Fenster:

driver.maximize_window()

Weisen Sie Chrome nun an, über die Selenium-Methode get() zur Zielseite zu navigieren:

url = "https://unsplash.com/s/photos/wallpaper?license=free" driver.get(url)

Alles zusammengefügt:

from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options # to run Chrome in headless mode options = Options() options.add_argument("--headless") # initialize a Chrome WerbDriver instance # with the specified options driver = webdriver.Chrome( service=ChromeService(), options=options ) # to avoid issues with responsive content driver.maximize_window() # the URL of the target page url = "https://unsplash.com/s/photos/wallpaper?license=free" # visit the target page in the controlled browser driver.get(url) # close the browser and free up its resources driver.quit()

Führen Sie das Image-Extraction-Script im headed mode aus, und Sie sehen kurz diese Seite, bevor Chrome geschlossen wird:

Page shown for a fraction

Die Meldung „Chrome is being controlled by automated test software“ bestätigt, dass Selenium das Chrome-Fenster erfolgreich steuert.

Sehr gut! Nun sehen wir uns den HTML-Code an, um zu bestimmen, wie die Images extrahiert werden.

Analyzing the Target Website

Bevor wir unsere Logik zur Image-Extraktion entwickeln, müssen wir die HTML-Struktur unserer Zielseite inspizieren. Das hilft uns, eine effektive Elementauswahl zu definieren und zu bestimmen, wie die gewünschten Daten extrahiert werden.

Besuchen Sie die Zielseite in Ihrem Browser, klicken Sie mit der rechten Maustaste auf ein Image und wählen Sie „Inspect“, um die DevTools zu öffnen:

Inspecting an image in devtools

Aus dieser Inspektion können wir zwei wichtige Details erkennen:

Erstens ist das Image in einem <img>-HTML-Element enthalten. Der CSS-Selector, um diese Image-Elemente anzusteuern, lautet:

[data-test="photo-grid-masonry-img"]

Zweitens haben die Image-Elemente sowohl das Standardattribut src als auch das Attribut srcset. Falls Sie srcset nicht kennen: Es spezifiziert mehrere Source-Images mit Hinweisen, damit Browser basierend auf Bildschirmgröße und Auflösung das passende auswählen können.

Der Wert des [srcset](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images)-Attributs folgt diesem Format:

<image_source_1_url> <image_source_1_size>, <image_source_1_url> <image_source_2_size>, ...

Wobei:

  • <image_source_1_url>, <image_source_2_url> usw. URLs zu unterschiedlich großen Images sind
  • <image_source_1_size>, <image_source_2_size> usw. die Größe jedes Images angeben, ausgedrückt als Pixelbreiten (z. B. 200w) oder Pixelverhältnisse (z. B. 1.5x)

Dieser Dual-Attribute-Ansatz ist auf modernen responsiven Websites üblich. Direkt das Attribut src anzusteuern ist nicht ideal, da srcset oft Image-URLs in höherer Qualität enthält.

Die HTML-Inspektion zeigt außerdem, dass alle Image-URLs absolut sind, sodass wir sie nicht mit der Base-URL der Website kombinieren müssen.

Gathering Image URLs

Verwenden Sie die Methode findElements(), um alle gewünschten Image-Elemente auf der Seite auszuwählen:

image_html_nodes = driver.find_elements(By.CSS_SELECTOR, "[data-test=\"photo-grid-masonry-img\"]") 

Dies erfordert den Import von:

from selenium.webdriver.common.by import By

Erstellen Sie als Nächstes eine Liste, um die aus den Image-Elementen extrahierten URLs zu speichern:

image_urls = []

Iterieren Sie durch die Nodes in image_html_nodes, holen Sie die URL entweder aus src oder (falls verfügbar) das größte Image aus srcset und fügen Sie es zu image_urls hinzu:

for image_html_node in image_html_nodes: try: # use the URL in the "src" as the default behavior image_url = image_html_node.get_attribute("src") # extract the URL of the largest image from "srcset", # if this attribute exists srcset = image_html_node.get_attribute("srcset") if srcset is not None: # get the last element from the "srcset" value srcset_last_element = srcset.split(", ")[-1] # get the first element of the value, # which is the image URL image_url = srcset_last_element.split(" ")[0] # add the image URL to the list image_urls.append(image_url) except StaleElementReferenceException as e: continue

Da Unsplash stark dynamisch ist, können einige Images während der Verarbeitung von der Seite verschwinden. Um dies zu behandeln, fangen wir die StaleElementReferenceException ab.

Denken Sie daran, diesen Import hinzuzufügen:

from selenium.common.exceptions import StaleElementReferenceException

Geben Sie nun die extrahierten Image-URLs aus:

print(image_urls)

Ihre aktuelle Datei scraper.py sollte wie folgt aussehen:

from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.common.exceptions import StaleElementReferenceException # to run Chrome in headless mode options = Options() options.add_argument("--headless") # initialize a Chrome WerbDriver instance # with the specified options driver = webdriver.Chrome( service=ChromeService(), options=options ) # to avoid issues with responsive content driver.maximize_window() # the URL of the target page url = "https://unsplash.com/s/photos/wallpaper?license=free" # visit the target page in the controlled browser driver.get(url) # select the node images on the page image_html_nodes = driver.find_elements(By.CSS_SELECTOR, "[data-test=\"photo-grid-masonry-img\"]") # where to store the scraped image url image_urls = [] # extract the URLs from each image for image_html_node in image_html_nodes: try: # use the URL in the "src" as the default behavior image_url = image_html_node.get_attribute("src") # extract the URL of the largest image from "srcset", # if this attribute exists srcset = image_html_node.get_attribute("srcset") if srcset is not None: # get the last element from the "srcset" value srcset_last_element = srcset.split(", ")[-1] # get the first element of the value, # which is the image URL image_url = srcset_last_element.split(" ")[0] # add the image URL to the list image_urls.append(image_url) except StaleElementReferenceException as e: continue # log in the terminal the scraped data print(image_urls) # close the browser and free up its resources driver.quit()

Führen Sie das Script aus, und Sie sehen eine Ausgabe ähnlich dieser:

[ 'https://images.unsplash.com/photo-1707343843598-39755549ac9a?w=2000&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxzZWFyY2h8MXx8d2FsbHBhcGVyfGVufDB8fDB8fHwy', # omitted for brevity... 'https://images.unsplash.com/photo-1507090960745-b32f65d3113a?w=2000&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MjB8fHdhbGxwYXBlcnxlbnwwfHwwfHx8Mg%3D%3D' ] 

Dieses Array enthält die URLs der Images, die wir herunterladen müssen.

Downloading the Images

Der einfachste Weg, Images in Python herunterzuladen, ist die Verwendung der Methode urlretrieve() aus dem Package urllib.request der Standard Library. Diese Funktion kopiert ein durch eine URL angegebenes Network-Objekt in eine lokale Datei.

Importieren Sie urllib.request, indem Sie diese Zeile oben in Ihrer Datei scraper.py hinzufügen:

import urllib.request

Erstellen Sie ein Verzeichnis images in Ihrem Projektordner:

mkdir images

Hier speichert Ihr Script die heruntergeladenen Images.

Durchlaufen Sie nun die Liste der Image-URLs. Generieren Sie für jedes Image einen fortlaufenden Dateinamen und laden Sie es mit urlretrieve() herunter:

image_name_counter = 1 # download each image and add it # to the "/images" local folder for image_url in image_urls: print(f"downloading image no. {image_name_counter} ...") file_name = f"./images/{image_name_counter}.jpg" # download the image urllib.request.urlretrieve(image_url, file_name) print(f"images downloaded successfully to \"{file_name}\"\n") # increment the image counter image_name_counter += 1

Das ist alles, was Sie benötigen, um Images in Python herunterzuladen! Die print()-Statements sind nicht erforderlich, helfen jedoch dabei, den Fortschritt des Scripts zu überwachen.

Nun sehen wir uns den vollständigen Code an.

Complete Code Solution

Hier ist die finale Version von scraper.py:

from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.common.exceptions import StaleElementReferenceException import urllib.request # to run Chrome in headless mode options = Options() options.add_argument("--headless") # initialize a Chrome WerbDriver instance # with the specified options driver = webdriver.Chrome( service=ChromeService(), options=options ) # to avoid issues with responsive content driver.maximize_window() # the URL of the target page url = "https://unsplash.com/s/photos/wallpaper?license=free" # visit the target page in the controlled browser driver.get(url) # select the node images on the page image_html_nodes = driver.find_elements(By.CSS_SELECTOR, "[data-test=\"photo-grid-masonry-img\"]") # where to store the scraped image url image_urls = [] # extract the URLs from each image for image_html_node in image_html_nodes: try: # use the URL in the "src" as the default behavior image_url = image_html_node.get_attribute("src") # extract the URL of the largest image from "srcset", # if this attribute exists srcset = image_html_node.get_attribute("srcset") if srcset is not None: # get the last element from the "srcset" value srcset_last_element = srcset.split(", ")[-1] # get the first element of the value, # which is the image URL image_url = srcset_last_element.split(" ")[0] # add the image URL to the list image_urls.append(image_url) except StaleElementReferenceException as e: continue # to keep track of the images saved to disk image_name_counter = 1 # download each image and add it # to the "/images" local folder for image_url in image_urls: print(f"downloading image no. {image_name_counter} ...") file_name = f"./images/{image_name_counter}.jpg" # download the image urllib.request.urlretrieve(image_url, file_name) print(f"images downloaded successfully to \"{file_name}\"\n") # increment the image counter image_name_counter += 1 # close the browser and free up its resources driver.quit()

Führen Sie es mit diesem Befehl aus:

python scraper.py

Das Script zeigt Fortschrittsmeldungen wie diese an:

downloading image no. 1 ... images downloaded successfully to "./images/1.jpg" # omitted for brevity... downloading image no. 20 ... images downloaded successfully to "./images/20.jpg" 

Prüfen Sie Ihren Ordner /images, um die automatisch heruntergeladenen Images zu sehen:

Exploring the images folder

Beachten Sie, dass diese Images von denen in früheren Screenshots abweichen können, da Unsplash seine Inhalte kontinuierlich aktualisiert.

Future Enhancements

Obwohl wir unser Ziel erreicht haben, sind hier einige potenzielle Verbesserungen für Ihr Python-Script:

  • Image-URLs in CSV oder einer Datenbank speichern: So können Sie später darauf referenzieren oder sie später herunterladen.
  • Download-Skipping implementieren: Vermeiden Sie das erneute Herunterladen von Images, die bereits im Ordner /images vorhanden sind, um Bandbreite zu sparen.
  • Image-Metadaten extrahieren: Sammeln Sie Tags und Autoreninformationen für einen vollständigeren Datensatz. Erfahren Sie wie in diesem Python-Web-Scraping-Guide.
  • Ihre Image-Sammlung erweitern: Simulieren Sie unendliches Scrollen, um zusätzliche Images zu laden und herunterzuladen.

Summary

Das Extrahieren von Images aus Websites mit Python ist unkompliziert und erfordert nur minimalen Code. Unterschätzen Sie jedoch Anti-Bot-Systeme nicht. Obwohl Selenium leistungsstark ist, kann es fortgeschrittene Schutztechnologien nicht überwinden, die Ihr Script als automatisiert erkennen und den Zugriff blockieren könnten.

Um Erkennung zu vermeiden, benötigen Sie ein Tool, das JavaScript-Rendering verarbeiten kann und gleichzeitig Fingerprinting, CAPTCHAs und Anti-Scraping-Maßnahmen verwaltet. Genau das bietet Bright Data's Scraping Browser.

Registrieren Sie sich und starten Sie noch heute Ihre kostenlose Testversion!

About

Scrapen und laden Sie Bilder von dynamischen Websites mit Python und Selenium herunter. Enthält vollständige Codebeispiele, HTML-Analyse und Download-Automatisierung.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors