DataImpulse Logo and Java Logo

Da Java eine plattformunabhängige Sprache mit robusten Bibliotheken, Multithreading-Funktionen und wirksamen Mechanismen zur Fehlerbehandlung ist, eignet sie sich gut für Web Scraping. In diesem ausführlichen Tutorial erfahren Sie, welche Tools Sie benötigen und welche Schritte Sie unternehmen sollten, um Web Scraping in Java effizienter zu gestalten.

Web Scraping mit Java: die wichtigsten Punkte

Einfachere Sprachen wie Python sind zwar beliebter für Web Scraping, aber auch Java hat seine Stärken, zum Beispiel: 

  • Bibliotheken wie JSoup oder HtmlUnit vereinfachen das Parsen von HTML 
  • Leistung, Geschwindigkeit und effiziente Speicherverwaltung machen Java für umfangreiche Projekte geeignet 
  • Als stark typisierte Sprache ermöglicht Java die Fehlererkennung bereits zur Kompilierzeit 

Wenn Ihre Infrastruktur auf Java basiert oder Sie langfristige Projekte planen, ist Java ebenfalls eine gute Option. Gleichzeitig bringt Web Scraping häufig Herausforderungen wie IP-Sperren, geografische Einschränkungen und Sicherheitsbedenken mit sich. Wenn Sie Ihr Java-Projekt mit Proxys ergänzen, können Sie diese Hürden überwinden und die benötigten Daten erhalten. 

Bevor wir mit dem Programmieren beginnen, sehen wir uns an, welche Tools Sie benötigen:

  • Visual Studio Code (tatsächlich eignet sich auch Visual Studio 2022 oder jede andere IDE, die Java unterstützt)
  • The Coding Pack for Java
  • Extension Pack for Java
  • Apache Maven 

Wenn Sie noch neu bei Visual Studio Code oder Java sind, finden Sie hier Dokumentation mit ausführlichen Erläuterungen zur Installation des Coding Pack und Extension Pack. Auch dieses Tutorial zur Installation von Apache Maven kann hilfreich sein. 

Hinweis: Es wird nur das Format „hostname:port“ unterstützt. Daher müssen Sie Ihre IP-Adresse vor der Ausführung des Codes auf die Whitelist setzen. Dies können Sie in Ihrem DataImpulse-Konto erledigen. Öffnen Sie den entsprechenden Proxy-Tarif, wählen Sie im Menü oben rechts „Manage Whitelist IPs“ und setzen Sie Ihre Adresse auf die Whitelist. Wenn Sie Hilfe benötigen oder Probleme haben, lesen Sie bitte unseren ausführlichen Leitfaden zur Verwaltung Ihres DataImpulse-Kontos

Erste Schritte mit HttpClientApp 

Sie müssen einen HTTP-Client erstellen, um Datenverkehr über einen Proxyserver zu leiten. Diese App sendet Anfragen an die angegebene URL und empfängt Antworten. Sie können den folgenden Code verwenden:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;


public class HttpClientApp {


    public static final String proxyHost = "gw.dataimpulse.com";
    public static final int proxyPort = 823;


    public static void main(String[] args) {
        System.out.println("Performing request through proxy...");


        try {
            String response = request("https://api.ipify.org");
            System.out.println("Your IP address: " + response);
        } catch (IOException e) {
            System.err.println("Request error: " + e.getMessage());
        }
    }


    public static String request(String url) throws IOException {
        // Configure the proxy without authentication
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));


        // Create and configure the connection
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
        connection.setRequestMethod("GET");
        connection.setRequestProperty("User-Agent", "JavaHttpURLConnection");


        // Handle the response
        int responseCode = connection.getResponseCode();
        String responseMessage = connection.getResponseMessage();


        if (responseCode == 200) {
            // Successful response
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()))) {
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                return response.toString();
            }
        } else {
            // Error response with detailed output
            StringBuilder errorResponse = new StringBuilder();
            if (connection.getErrorStream() != null) {
                try (BufferedReader reader = new BufferedReader(
                        new InputStreamReader(connection.getErrorStream()))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        errorResponse.append(line);
                    }
                }
            }
            throw new IOException("HTTP error: " + responseCode + " " + responseMessage +
                    (errorResponse.length() > 0 ? "\nError details: " + errorResponse : ""));
        }
    }
}

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

Die Ausgabe sollte so aussehen:

An example of Java code

Einen Proxy-Rotator erstellen

Den Datenverkehr über einen Proxyserver zu leiten, reicht nicht aus. Um den Datenschutz zu verbessern, müssen Sie für jede Anfrage eine neue IP verwenden. Deshalb benötigen Sie einen Proxy-Rotator. Hier ist ein Beispielcode, den Sie verwenden können:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Arrays;
import java.util.List;


public class ProxyRotator {


    // List of proxies to rotate through
    private static final List proxies = Arrays.asList(
            new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10000)),
            new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10001)),
            new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10002))
    );


    public static void main(String[] args) {
        // URL to request
        String url = "https://api.ipify.org";


        for (Proxy proxy : proxies) {
            System.out.println("Using proxy: " + proxy.address());
            try {
                String response = sendRequestWithProxy(url, proxy);
                System.out.println("Request succeeded with proxy " + proxy.address());
                System.out.println("IP address from API website: " + response);
            } catch (IOException e) {
                System.err.println("Request failed with proxy " + proxy.address() + ": " + e.getMessage());
            }
            System.out.println("------------------------------------------------");
        }
    }


    // Function to send request using a specific proxy
    private static String sendRequestWithProxy(String url, Proxy proxy) throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
        connection.setRequestMethod("GET");
        connection.setRequestProperty("User-Agent", "JavaHttpURLConnection");


        int responseCode = connection.getResponseCode();
        if (responseCode == 200) {
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                return response.toString();
            }
        } else {
            throw new IOException("HTTP error code: " + responseCode + " " + connection.getResponseMessage());
        }
    }
}

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

Sie sollten dieses Ergebnis erhalten:

An example of Java code

Einen Proxy-Checker erstellen

Nun gilt es sicherzustellen, dass unsere Proxys mit einer bestimmten Website funktionieren. Dazu müssen Sie eine Proxy-Checker-App erstellen und eine zu prüfende URL angeben:

An example of Java code

Diesen Code können Sie ausprobieren:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Arrays;
import java.util.List;


public class ProxyChecker {


    // List of proxies to rotate through
    private static final List proxies = Arrays.asList(
            new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10000)),
            new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10001)),
            new Proxy(Proxy.Type.HTTP, new InetSocketAddress("gw.dataimpulse.com", 10002))
    );


    // Website to check through proxies
    private static final String websiteUrl = "https://api.ipify.org";


    public static void main(String[] args) {
        System.out.println("Starting Proxy Checker...");


        for (Proxy proxy : proxies) {
            System.out.println("\nChecking proxy: " + proxy.address());
            try {
                boolean isWorking = checkProxy(proxy, websiteUrl);
                if (isWorking) {
                    System.out.println("✅ Proxy " + proxy.address() + " works with " + websiteUrl);
                } else {
                    System.out.println("❌ Proxy " + proxy.address() + " does not work with " + websiteUrl);
                }
            } catch (IOException e) {
                System.out.println("❌ Proxy " + proxy.address() + " failed: " + e.getMessage());
            }
            System.out.println("------------------------------------------------");
        }
    }


    // Function to check if proxy works with the given website
    private static boolean checkProxy(Proxy proxy, String url) throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
        connection.setRequestMethod("GET");
        connection.setRequestProperty("User-Agent", "JavaHttpURLConnection");
        connection.setConnectTimeout(5000); // 5 seconds timeout
        connection.setReadTimeout(5000);    // 5 seconds timeout


        int responseCode = connection.getResponseCode();
        String responseMessage = connection.getResponseMessage();


        System.out.println("Response: " + responseCode + " " + responseMessage);


        if (responseCode == 200) {
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()))) {
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                System.out.println("IP Returned: " + response);
            }
            return true;
        } else {
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getErrorStream()))) {
                StringBuilder errorResponse = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    errorResponse.append(line);
                }
                System.out.println("Error details: " + errorResponse);
            }
            return false;
        }
    }
}

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

Die angezeigten Ergebnisse sollten so aussehen:

An example of Java code

Zum eigentlichen Web Scraping

Jetzt ist es an der Zeit, eine Web-Scraping-App zu erstellen. Sie extrahiert alle benötigten Daten. Geben Sie daher die Ziel-URL zum Scrapen an und legen Sie fest, welche Daten das Programm abrufen soll. In unserem Fall scrapen wir Links von unserer Startseite. Sie können diesen Code als Vorlage verwenden:


package com.dataimpulse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;


public class ProxyWebScraper {


    // Proxy configuration
    private static final String PROXY_HOST = "gw.dataimpulse.com";
    private static final int PROXY_PORT = 823;


    // Target website to scrape
    private static final String TARGET_URL = "https://dataimpulse.com/";


    public static void main(String[] args) {
        System.out.println("Starting Proxy Web Scraper...");


        try {
            // Perform the web scraping through the proxy
            String htmlContent = getHtmlContent(TARGET_URL);
            if (htmlContent != null) {
                // Parse and extract links from the HTML content
                parseHtml(htmlContent);
            } else {
                System.out.println("Failed to retrieve HTML content.");
            }
        } catch (IOException e) {
            System.err.println("Error during scraping: " + e.getMessage());
        }
    }


    // Method to get HTML content through the proxy
    private static String getHtmlContent(String url) throws IOException {
        // Configure proxy
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));


        // Create and configure the connection
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
        connection.setRequestMethod("GET");
        connection.setRequestProperty("User-Agent", "JavaWebScraper/1.0");
        connection.setConnectTimeout(10000);
        connection.setReadTimeout(10000);


        int responseCode = connection.getResponseCode();
        if (responseCode == 200) {
            // Read and return the HTML content
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
                StringBuilder content = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    content.append(line);
                }
                return content.toString();
            }
        } else {
            System.err.println("Failed to fetch HTML. HTTP error code: " + responseCode);
            return null;
        }
    }


    // Method to parse HTML and extract links using jsoup
    private static void parseHtml(String htmlContent) {
        Document doc = Jsoup.parse(htmlContent);
        Elements links = doc.select("a[href]");


        if (links.isEmpty()) {
            System.out.println("No links found on the page.");
        } else {
            System.out.println("Links found:");
            for (Element link : links) {
                String href = link.attr("abs:href");
                String title = link.text();
                System.out.println("Title: " + title + ", Link: " + href);
            }
        }
    }
}

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

Es gibt jedoch noch etwas zu tun. Um den Vorgang abzuschließen und sicherzustellen, dass Ihre Scraping-App korrekt funktioniert, müssen Sie die JSoup-Bibliothek mit Maven installieren. Hier erfahren Sie Schritt für Schritt, wie das geht:

  1. Erstellen Sie über die entsprechende Schaltfläche ein Java-Projekt. 
An example of Java code
  1. Wählen Sie Maven als Projekttyp aus. 
An example of Java code
  1. Wählen Sie in der angezeigten Liste „maven-archetype-quickstart“ aus:
An example of Java code
  1. Wählen Sie die Version “1.4” von maven-archetype-quickstart aus.
An example of Java code
  1. Geben Sie „com.dataimpulse“ als Gruppen-ID ein.
An example of Java code
  1. Geben Sie „proxy-scraper“ in das Feld „artifact Id“ ein.
An example of Java code
  1. Wählen Sie einen Ordner aus, in dem die Bibliothek und die ProxyWebScraper-App selbst gespeichert werden sollen. Anschließend sollte der Ordner proxy-scraper angezeigt werden. Verschieben Sie den Code jetzt nach proxy-scraper/src/main/java/com/dataimpulse:
An example of Java code
  1. Fügen Sie die JSoup-Bibliothek über Apache Maven hinzu, wie im Screenshot unten gezeigt. Wenn alles korrekt durchgeführt wurde, erscheint die Bibliothek in der Datei „pom.xml“. 
An example of Java code
  1. Ändern Sie in der Datei “pom.xml” die Parameter “maven.compiler.source” und “maven.compiler.target” auf 1.8. Speichern Sie die Datei unter Windows mit CTRL+S oder auf dem Mac mit CMD+S.
An example of Java code
  1. Nun sollte Ihr Code problemlos funktionieren. Zum Ausführen verwenden Sie die Schaltfläche oben rechts auf dem Bildschirm.
An example of Java code

Hier ist das Endergebnis unseres Scraping-Projekts:

An example of Java code

Wie Sie sehen, verfügen wir jetzt über alle gewünschten Daten. Durch Anpassungen am Code können Sie jedoch beliebige HTML-Daten abrufen, die Sie benötigen. Außerdem sollten Sie Proxys sorgfältig auswählen, denn solche Ergebnisse sind ohne rechtmäßig beschaffte IPs nicht möglich. Bei DataImpulse erhalten Sie 15 Millionen ethisch beschaffte Adressen, die nicht mit rechtswidrigen Aktivitäten wie der Verbreitung von Malware in Verbindung stehen. Falls Sie Schwierigkeiten haben, steht Ihnen unser Support-Team rund um die Uhr zur Verfügung. Sie können die Ausrichtung zudem an territoriale Zugriffsrichtlinien anpassen. Unsere Proxys belasten dabei nicht Ihr Budget, denn wir arbeiten mit einem nutzungsbasierten Preismodell und bieten einen günstigen Preis von 1 $ pro 1GB. Starten Sie mit uns über [email protected] oder verwenden Sie die Schaltfläche “Jetzt ausprobieren” oben rechts auf dem Bildschirm. 

Share article: