Website HTML Code von HTTPS URL laden

Hallo liebes Byte-Welt-Forum,
ich habe folgendes Problem:
Ich möchte gerne den HTML Code einer Website (bei gegebener URL)
herunterladen. Jetzt, wo ich zum ersten Mal eine URL mit https verwende
funktioniert meine bisher bewährte Funktion nicht mehr.

public static final String getHTML_Code(String url) throws Exception
{
    String pageText = "";
 
    String line = "";
 
    BufferedReader br = new BufferedReader(new InputStreamReader(new URL(url).openStream()));

    while ((line = br.readLine()) != null)
    {
        pageText += line+"\n";
    }
     
    br.close();
 
    return pageText;
}

Nun habe ich im Internet bei verschiedenen Tutorials geschaut,
und folgenden Code von diesem Tutorial verwendet:
https://www.mkyong.com/java/java-https-client-httpsurlconnection-example/

Ich bekomme dennoch immer folgende Fehlermeldung:

java.io.IOException: Server returned HTTP response code: 400 for URL: https://phys.org
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1838)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

Mit meinem Browser kann ich die Website problemfrei ansteuern.
Was kann ich tun?

Vielen Dank für eure Hilfe,
m.f.G.: Developer_X

Hast du mal eine Beispiel-URL für uns?

HTTP(S)-Statuscode 400 kann pauschal vom Server kommen, ich hab zwar einen Verdacht, aber muss sich noch bestätigen.

public static void main(String[] args) {
    try {
        String code = "";
        
        String line = "";
        
        BufferedReader br = new BufferedReader(new InputStreamReader(new URL("https://google.de").openStream()));
        
        while ((line = br.readLine()) != null) {
            code += line + "\n";
        }
        
        br.close();
        
        System.out.println(code);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

Das funktioniert bei mir ohne Probleme? Bei deiner Beispiel-URL kommt bei mir allerdings der gleiche Fehler. Denke daher liegt an der Webseite nicht an Java

Hast du es mal mit https://www.google.de probiert? Manchmal ist die Angabe des Protokolls erforderlich.

Das funktioniert bei mir zB ohne Probleme:

    public static void main(String[] args) throws IOException {
        String s = getBodyAsText();
        System.out.println("s = " + s);
    }

    private static String getBodyAsText() throws IOException {
        URL url = new URL("https://www.abendblatt.de/");
        // do sth. with url...
        StringWriter buffer = new StringWriter();
        try (PrintWriter writer = new PrintWriter(buffer); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()))) {
            String li;
            while ((li = reader.readLine()) != null) {
                // do sth. with li...
                writer.println(li);
            }
        }
        return buffer.toString();
    }

Also, es geht um diese phys.org Webseite?

Es handelt sich um https://phys.org
Habt ihr sonst eine Idee wie man automatisiert an den HTML Code
dieser Website bzw. einzelner Artikel dieser Website kommen kann?

Es ist wichtig für mich Zugriff auf genau diese Website zu haben.

Vielen Dank,
m.f.G.: Developer_X

Webseite angeschaut, ok, in der HTML steht zB:

	<meta name="ROBOTS" content="INDEX,FOLLOW" />
	<meta name="ROBOTS" content="noodp" />

das ist ein Hinweis darauf, dass Roboter auf dieser Seite nicht erlaubt sind ( https://de.ryte.com/wiki/NOODP ).

Was heißt das? Dass man sie nicht autom. verarbeiten sollte. Das 400 zurückkommt ist die Antwort darauf.

Java kann das theoretisch verarbeiten, aber man sollte es eben nicht.

Workaround:
Rufe die Webseite mit deinem Browser auf, speichere das HTML der Seite und verarbeite es dann.

Das wird schwierig bei 70.000 Seiten es händisch zu machen,
aber man könnte ein Programm schreiben welches die Maus
bewegt und klickt. Ich glaube darauf wird es dann hinauslaufen.

Danke Euch allen trotzdem,
falls jemand noch ne andere Idee hat, wäre ich dankbar,
m.f.G.: Developer_X

Hab nicht gesagt, dass es autom. _nicht_ geht, aber man _sollte_ es wohl nicht. Ich dachte, nur die "Übersichts"seite wäre wichtig?

Trotzdem :slight_smile:

Prinzipiell war die Idee folgende:
Diese Websiten:
https://phys.org/technology-news/energy-green-tech/sort/date/all/page_X_.html
(wobei X von 1 bis 707 geht) herunterzuladen, dort die jeweils 10 URLs zu den
Artikeln herauszufiltern, und am Ende 7070 Artikel anhand der URLs herunterzuladen,
um diese dann weiterzuverarbeiten.

Würde dir noch etwas anderes einfallen als einen Robot zu schreiben welcher die
Maus steuert und einen Browser bedient?

m.f.G.: Developer_X

ROBOTS sind vereinfacht gesagt Webcraweler = nicht erlaubt / Grauzone,
Robot sind vereinfacht gesagt Roboter, die zB die Maus steuern = Grauzone.

Es stehen sich anzunehmen zwei konträre Interessen gegenüber, die der Webseite und deine. Die Webseite möchte die Anzahl der Zugriffe nicht zu viele und du möchtest ca. 7000 Artikel aufrufen.

Nein, eigentlich fällt mir dazu nüschts ein, was nicht in der Grauzone läge.

:sweat_smile:
ich glaube die Website hat nichts dagegen,
es geht um eine umfangreiche Untersuchung
die eigentlich nur sehr entfernt etwas mit der
Website zu tun hat…mehr kann/darf ich dazu auch nicht sagen.

ich werde dann halt mal schauen wie ich das
ganze auf diesem sehr umständlichen wege
realisiere…danke trotzdem.

m.f.G.: Developer_X

Ich würde empfehlen, den Webseitenbetreiber um Erlaubnis zu bitten. Ggf. lässt er die Inhalte ja auch in einer maschinenverarbeitbaren Form zukommen.

1 „Gefällt mir“

Doch genau das ist der Fall. Diese Seite möchte nicht automatisch analysiert werden und macht es bei solchen „naiven“ Versuchen, wie du es hier machst den Leuten etwas schwer.

Ungeachtet, was du mit dem Content machen möchtest, gibt es bestimmt 10000 mehr von solchen Leuten, die automatisch Content klauen wollen. Schon gar, wenn es sich um Webseiten mit Redaktionellen Infos handelt.

Würde dir noch etwas anderes einfallen als einen Robot zu schreiben welcher die
Maus steuert und einen Browser bedient?

HTTP 400 bedeutet, dass der Server dein „GET Request“ erhalten hat und diesen als falsch (bad) für sich deklariert hat.
Das kann nun viele Gründe haben.

Anfangen kannst du mit einfachen AGENT Informationen. Das sind Informationen, die Browser beim Aufruf der Seite mitschickt. Fehlen diese resultiert die Antwort in 400. Diese müssen bei deinem GET-Request mitkommen.

Siehe hie: Setting user agent of a java URLConnection - Stack Overflow

Wobei dir dieser Beitrag nur als Startpunkt gesehen werden sollte.

Es gibt auch genug Implementierungen für Java, die einen Browser Agent simulieren. Hier musst du ansetzen.

Gut dass du das mit User-Agent geschrieben hast, dann hab ich nämlich nicht bei etwas Verbotenes geholfen. :slight_smile:

Das ist falsch, die Fehlen nicht, lediglich die Verarbeitung mit Java ist nicht erlaubt.