Webseiten auslesen mit Java - funktionierender Browser

Wolly300

Lt. Junior Grade
Registriert
Mai 2014
Beiträge
507
Hallo zusammen,

ich will für ein Projekt von mir Webseiten auslesen und stoße gerade so gegen mein Wissenslimit.
Ich versuche aktuell mit der HtmlUnit Bibliothek mein Vorhaben umzusetzen, scheitere aber daran, das trotz aktivierung die Webseite sagt das Cookies blockiert sind und mein Browser veraltet ist.

Kennt ihr noch andere Bibliotheken für solch ein Vorhaben oder habt ihr schon einmal etwas funktionierendes mit dieser Bibliothek gemacht?

Hier mal kurz mein Test Code für HtmlUnit:

Java:
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getCookieManager().setCookiesEnabled(true);
    System.out.println(webClient.isJavaScriptEnabled() + " - " + webClient.isJavaScriptEngineEnabled());
    System.out.println("Cookies: " + webClient.getCookieManager().isCookiesEnabled());
    final HtmlPage page = webClient.getPage("https://www.bauhaus.info/fi-schutzschalter/abb-system-pro-m-compact-fi-schutzschalter-f-204/p/12244967");
    print_file(page);
    print_cookies(webClient);
} catch (Exception e){

}
Bei den ersten 3 isEnabled abfragen kommt überall true raus, das ist auf jeden schon mal an.

Aber der Browser sagt etwas anderes:

HTML:
In Ihrem Browser sind Cookies blockiert. Um unseren Online-Shop nutzen zu können, aktivieren Sie Cookies innerhalb Ihrer Browsereinstellungen. Sollten Sie Hilfe bei der Änderung Ihrer Browsereinstellungen benötigen, konsultieren Sie bitte die Website des Browserherstellers.

Sie verwenden einen veralteten Browser, mit dem nicht alle Inhalte korrekt dargestellt werden können. Um unseren Online-Shop nutzen zu können, empfehlen wir Ihnen, die aktuellste Version Ihres Browsers zu installieren. Sollten Sie Hilfe benötigen, konsultieren Sie bitte die Website des Browserherstellers.


Ich bekomme dutzende Fehlermeldungen über veraltete content types:

Java:
März 07, 2022 8:38:32 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
März 07, 2022 8:38:33 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
März 07, 2022 8:38:33 PM com.gargoylesoftware.htmlunit.javascript.DefaultJavaScriptErrorListener scriptException
SEVERE: Error during JavaScript execution
März 07, 2022 8:38:33 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.

Danke für euere Hilfe.
 
Zuletzt bearbeitet:
Playwright
https://github.com/microsoft/playwright-java
Das lädt selber den Browser mit runter.

Einfach gesagt, es gibt sehr wenige vollständige Browser engines, der Aufwand die zu warten ist viel zu hoch. Daher wurden praktisch alle Implementierungen für eine solche Automatisierung eingestellt und alle nutzen Chrome headless.

Alternativen sind ua Chrome embedded Framework und unter Windows webview2 (das ist der Edge chromium)
 
  • Gefällt mir
Reaktionen: Wolly300
Es ist auch wichtig zu sagen, WAS du genau machen willst und welche Bedingungen es dafür gibt. Bibliotheken gibt es genug, du musst im Prinzip nur das richtige "Schlagwort" kennen.

Die Fragen, die bei mir aufkommen:
  • Muss es Java sein (z.B. für ein Schulprojekt) oder geht auch was anderes?
  • Möchtest du die gesamte Webseite auslesen, oder nur bestimmte Daten?
  • Geht es um EINE Webseite oder um mehrere?

Wenn du eine Webseite komplett auslesen willst, brauchst du nicht mal ein Java-Programm, das kann man z.B. mit wget recht einfach machen. Alternativ gibt es crawler4j: https://github.com/yasserg/crawler4j

Für einzelne Seiten ist jsoup ganz gut (https://jsoup.org/).
 
  • Gefällt mir
Reaktionen: Wolly300 und LencoX2
sandreas schrieb:
Es ist auch wichtig zu sagen, WAS du genau machen willst und welche Bedingungen es dafür gibt. Bibliotheken gibt es genug, du musst im Prinzip nur das richtige "Schlagwort" kennen.

Die Fragen, die bei mir aufkommen:
  • Muss es Java sein (z.B. für ein Schulprojekt) oder geht auch was anderes?
  • Möchtest du die gesamte Webseite auslesen, oder nur bestimmte Daten?
  • Geht es um EINE Webseite oder um mehrere?

Wenn du eine Webseite komplett auslesen willst, brauchst du nicht mal ein Java-Programm, das kann man z.B. mit wget recht einfach machen. Alternativ gibt es crawler4j: https://github.com/yasserg/crawler4j

Für einzelne Seiten ist jsoup ganz gut (https://jsoup.org/).
Ok Kurz zu den Punkten.

1. Es muss auf Java laufen, weil es in einen bestehenden Workflow integriert wird der komplett auf Java basiert.

2. Ich will auf einer Webseite viele Seiten auslesen.

3. JSOUP und WGET reichen nicht aus, weil bei Bauhaus das JavaScript ausgeführt sein muss. Die Scripts laden dynamische Daten nach die ich auslesen will. Dabei geht es um Bestände von Artikeln die für mich wichtig sind.

Nachtrag: Zusätzlich brauche ich umbedingt Cookies, für das JavaScript.
 
Meiner Ansicht/Wissensstand nach kommst du dann ohne Browser Engine (egal in welcher Form) nicht aus, ich beobachte das hier aber gespannt weiter.
 
Wolly300 schrieb:
1. Es muss auf Java laufen, weil es in einen bestehenden Workflow integriert wird der komplett auf Java basiert.
Hier irrst du... du könntest z.B. mit Java eine API schreiben um Daten abzuspeichern aber den Crawler mit puppeteer (https://github.com/puppeteer/puppeteer) lösen. Das würde ICH machen.

Mit Puppeteer löst du all deine "Es muss wie ein Browser mit Cookies und JavaScript funktionieren"-Probleme und es ist erschreckend einfach:
Wolly300 schrieb:
Die Scripts laden dynamische Daten nach die ich auslesen will. Dabei geht es um Bestände von Artikeln die für mich wichtig sind.

und du kannst das ganze dann via fetch oder xhr an deine Java-API posten.
 
  • Gefällt mir
Reaktionen: fgordon
Zurück
Oben