Via Java gezielt Inhalte einer Webseite auslesen

Cemur

Cadet 2nd Year
Registriert
Jan. 2018
Beiträge
24
Hi,

vorweg: ich bin ein Anfänger in der Programmierung, deswegen kann es gut vorkommen, dass mir gängige Lösungsmethoden für beschriebene Probleme nicht bewusst sind. Deswegen gerne einfach zwischengrätschen. :)


Nun,
ich möchte mit Java ein Programm schreiben, mit dem ich aus einer bestimmten Seite (und nur für diese Seite) Daten auslese und mir diese (später) in einer GUI aufbereitet vorliegen habe. Für mein erstes Ziel reicht es, die Daten erstmal in einem Textdokument vorliegen zu haben.
Ich denke, da ich keinen SQL Zugang auf die Datenbanken habe, die die Seite präsentierten, muss ich das quasi "optisch" bzw manuell lösen. (Gibt es hier vielleicht doch eine Möglichkeit? )

Titel - Preis - Datum der Erfassung - Link/Verweis

zB jetzt vorgefertigte Seite (Um mir Code zu sparen): https://www.notebooksbilliger.de/produkte/*#!/q/*/limit/50/order/asc/orderBy/g:price

Dort möchte ich von der 1., 2. und 3. Seite alle Produkttitel aufgelistet haben und genannte, weitere Informationen.

Mein bisheriges herangehen war folgendes:
------
Ich lese den HTML Code der gesamten Seite aus (Speichere vielleicht in einem Dokument zwischen) und suche nach dem Tag " data-wt-pli="{"product":"A 676182","productPosition": x}" "

jedes Produkt trägt zum einen dieses productPosition Tag im DIV mit sich. In diesem Div gibt es ein weiteres Div mit der Class: product_name. Hieraus würde ich dann den Titel herausbekommen. Weiterhin ist in dem äußeren Div auch ein Div vorhanden mit: listing_price product-price__container. Hieraus entnehme ich den Preis. Und in der jeweiligen class left den Link.

Wie suche ich innerhalb eines Textdokuments nach diesen Werten?
------
Ich habe ja nun meine Anhaltspunkte / Anker. Aber wie komme ich von diesen auf die jeweiligen Werte die danach stehen?

ich dachte mir nun soetwas wie:
String searchString2 = "product_name";
if (str.contains(searchString2)) {
abhier = str.indexOf(searchString) +1;
}


und danach den erst Wert mit € quasi abzufangen.

Ist mein Vorgehen bis hier her total daneben oder bin ich auf dem richtigen Weg?
Durch Aufklärung dieses Beispiels müsste ich die anderen Informationen soweit auch hinbekommen, deswegen bitte ich hier einmal um einen "Kickstart" :D


Des Weiteren: Wie gelange ich nun auf die zweite Seite um den künftigen Algorithmus auf dieser Seite erneut auszuführen?


Vielen Dank alleine fürs Lesen

Beste Grüße
 
Was ist eigentlich das Ziel des Ganzen?
Webseiten Crawling ist, sagen wir es mal so, nicht die feine Art. Manche Seitenbetreiber unterbieten es auch.
Wenn du dennoch weitermachen willst, hier die Infos.
Das hättest du auch mit ein wenig Googlen herausfinden können. "Java Webseite crawlen"

Cemur schrieb:
Ich denke, da ich keinen SQL Zugang auf die Datenbanken habe, die die Seite präsentierten, muss ich das quasi "optisch" bzw manuell lösen. (Gibt es hier vielleicht doch eine Möglichkeit? )
Webseiten werden für gewöhnlich nicht direkt auf Datenbanken gespeichert. Ihre Inhalte (Produktnummern, Texte usw. hingegen schon). Je nach verwendeten Tools / Frameworks usw. werden diese dann dynamisch ausgelesen und präsentiert.


Webseiten ohne Hilfsmittel, wie externe Bibliotheken, auszulesen, ist mitunter sehr aufwendig. Insbesondere JavaScript Events oder gar "Klick auf Links" wirst du nicht so einfach realisieren können.
Die folgenden Links sollten dir weiterhelfen.
https://www.selenium.dev/
https://jsoup.org/
Recherchiere ein wenig, was diese Werkzeuge tun.

das was du vorhast ist für einen Anfänger im Programmieren keine so einfache Aufgabe.
 
  • Gefällt mir
Reaktionen: Cemur
Cemur schrieb:
Ich habe ja nun meine Anhaltspunkte / Anker. Aber wie komme ich von diesen auf die jeweiligen Werte die danach stehen?
Cemur schrieb:
Ist mein Vorgehen bis hier her total daneben oder bin ich auf dem richtigen Weg?
erhhrlich gesagt total daneben resp. nicht wirklich clever. Was willst du denn mit solchen String Operationen machen? Dir ist schon klar dass du nicht der Erste bist, der Webseiten crawlen, HTML parsen und dann konkrete Inhalte davon verarbeiten will?
Warum nutzt du also keine solche API wie JSOUP und liest deren Tutorials erstmal?

Cemur schrieb:
Durch Aufklärung dieses Beispiels müsste ich die anderen Informationen soweit auch hinbekommen, deswegen bitte ich hier einmal um einen "Kickstart" :D
glaube ich eher nicht dran. Ich bin mir auch sicher dass dir zur Zeit erstmal noch grundlegende Konzepte von Webseiten und deren Inhalten fehlen. Das fängt schon mit statisch vs. dynamisch an, "Deep Web", etc.


Cemur schrieb:
Des Weiteren: Wie gelange ich nun auf die zweite Seite um den künftigen Algorithmus auf dieser Seite erneut auszuführen?
bleib lieber erstmal bei der 1. Seite, damit wirst du - Stand jetzt - genug zu tun haben.

Ich hoffe du bedenkst auch, dass du stark davon abhängig bist, dass sich Seiten resp. der Strukturen auf denen du dich beziehen wirst, mal von heute auf morgen ändern können. Das bedeutet auf kurz oder lang musst du mal den Code anpassen, daher gleich der Hinweis den Code vernüftig zu abstrahieren und nicht alles hard-codiert im Quellcode zu machen. Aber ist nur ein Tip.
 
  • Gefällt mir
Reaktionen: Cemur
OK, hier ist mein "Kickstart":

Wie meine beiden Vorschreiber schon gesagt haben:
JSoup ist hier das Mittel der Wahl!

Folgendes kleine Beispiel holt die Seite

https://www.notebooksbilliger.de/tft+monitore/75+124+cm+295+49+monitore

und parst das Ganze nach dem Produktnamen und dem Preis:

Code:
import java.io.IOException;

import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.jsoup.nodes.TextNode;



public class JSoupNBB1
{
    public static void main(String args[]) throws IOException
    {
        Document doc = Jsoup.connect("https://www.notebooksbilliger.de/tft+monitore/75+124+cm+295+49+monitore").get();
        // Um aus einem File zu lesen nimmst Du stattdessen folgenden Code:
        // File input = new File(filename);
        // Document doc = Jsoup.parse(input, "UTF-8", "https://www.notebooksbilliger.de/tft+monitore/75+124+cm+295+49+monitore");
        
        Elements elements= doc.select("div[data-wt-pli]"); // http://jsoup.org/apidocs/org/jsoup/select/Selector.html
        System.out.printf("number of elements: %d\n\n", elements.size() );
        for(Element e: elements)
        {
            Elements div_product_name_a= e.select("div.product_name > a"); // http://jsoup.org/apidocs/org/jsoup/select/Selector.html
            List<TextNode> textNodesName= div_product_name_a.first().textNodes();
            String name= textNodesName.get(0).text();
            
            Elements span_product_price= e.select("span.product-price__regular"); // http://jsoup.org/apidocs/org/jsoup/select/Selector.html
            List<TextNode> textNodesPrice= span_product_price.first().textNodes();
            String price= textNodesPrice.get(0).text();
            
            System.out.printf("  %12s  %s \n", price, name);
        }
    }
}

Um das obige Programm zu compilieren benötigst Du die Java Bibliothek "jsoup-1.13.1.jar".
Wie Du diese in Deine Entwicklungsumgebung einbindest kannst Du per Suchmaschine herausfinden.
Für den Fall, daß Du das obige Programm in der Eingabeaufforderung compilierst und ausführst geht's so:
"jsoup-1.13.1.jar" herunterladen und beispielsweise unter

C:\download\JSoup\jsoup-1.13.1.jar

abspeichern.

Compilieren:
javac -cp "C:\download\JSoup\jsoup-1.13.1.jar" JSoupNBB1.java

Ausführen:
java -cp ".;C:\download\JSoup\jsoup-1.13.1.jar" JSoupNBB1


Wenn Du dann obiges Programm zu Laufen gebracht hast kannst Du Dich danach in JSoup einlesen:
Als Startpunkte würde ich Dir empfehlen:

https://jsoup.org/cookbook/introduction/parsing-a-document

und

https://jsoup.org/apidocs/org/jsoup/select/Selector.html
(Für die "select"-Syntax)


HTH

BigNum
 
  • Gefällt mir
Reaktionen: Cemur
Zurück
Oben