Seiteninhalte bei httpsurlconnection abfragen

Status
Nicht offen für weitere Antworten.

Fry

Aktives Mitglied
Hallo!

Ich möchte folgendes machen:

- eine Verbindung zu einer Seite aufbauen, vorzugsweise mit HttpsUrlConnection
- Wie man schon vermutet, ist die Seite per SSL gesichert
- Jetzt möchte ich einfach die Seite, die im Browser angezeigt werden würde parsen und darauf etwas suchen um weitere AKtionen vorzunehmen
- Das Zertifikat ist mir mal ganz egal.

Ich habe schon mal in dem Beitrag geschaut aber nicht so richtig verstanden. Um es kurz zu machen, etwas wie:

Code:
try {
			URL u = new URL("https://www.123.de");
			HttpsURLConnection hp = (HttpsURLConnection)u.openConnection();
			Object object = hp.getContent();
			// hier dann zum bsp. die Seite parsen
		}
		catch(MalformedURLException me) {
			me.printStackTrace();
		}
		catch(IOException ioe) {
			ioe.printStackTrace();
		}
wäre schön, aber bei obigen Code bleibt beim Debuggen mit Eclipse ewig auf der Object... Zeile hängen

Gibt es da was ganz einfaches bzw. was ist an obigem Code falsch?

Thx
Fry :D
 

Fry

Aktives Mitglied
hehe, ich glaube die Seite ist zurzeit nicht erreichbar, ich teste noch mal eine andere....
 

Fry

Aktives Mitglied
Ok, ich mach Alleinunterhalter :D

Nur zu Dokuzwecken, falls es wer braucht, also mit
Code:
try {
			URL u = new URL("https://www.123.de");
			HttpsURLConnection hp = (HttpsURLConnection)u.openConnection();
			Object object = hp.getContent();
			 BufferedReader br = new BufferedReader(new InputStreamReader( 
	                    (InputStream) object)); 
			 String line;
			 
			 while((line = br.readLine()) != null) {
				 System.out.println(line);
			 }
		}
		catch(MalformedURLException me) {
			me.printStackTrace();
		}
		catch(IOException ioe) {
			ioe.printStackTrace();
		}
	}

kann man die HTML Seite auf COnsole ausgeben (man prüfe vorher ob der Server verfügbar ist :lol: )

Fry
 
C

Christian342

Gast
Ich suche etwas ähnliches: und zwar möchte ich das einloggen mit User / pwd auf eine Internetseite (https://) automatisieren und dann verschiedene Seiten aus dem geschützen Bereich anzeigen. Wäre sehr nett, wenn mir jemand ein einfaches Beispiel zeigen könnte.

Problem wurde auch hier beschrieben: http://forum.java.sun.com/thread.jspa?threadID=428563&messageID=1913568 aber nicht gelöst


Als Beispiel könnte man xing.com nehmen, dort muss man sich einloggen und danach merkt sich der Browser wohl normalerweise nutzer / pwd oder irgendein cookie um sich für die folgenden seiten zu authentifizieren.
 
C

Christian342

Gast
Danke, das ist genau was ich gesucht habe. Ich habe auch das Beispielprogramm unter http://jakarta.apache.org/commons/httpclient/tutorial.html (gnaz unten) zum laufen gebracht.

Allerdings wundere ich mich ein bißchen, warum das Beispiel mit apache.org problemlos läuft aber bei google.de und vielen anderen folgende Warnung kommt:

04.03.2007 18:56:40 org.apache.commons.httpclient.HttpMethodBase getResponseBody
WARNUNG: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

Wäre ja an sich kein Problem und man könnte es über getResponseBodyAsStream einlesen, aber warum der Unterschied bei apache.org und google.de. Als String wäre mir die Seite nämlich angenehmer.
 

Wildcard

Top Contributor
Going to buffer response body of large or unknown size.
Sagt das nicht alles?
Der body ist entweder groß oder von unbekannter Größe. :wink:
 
C

Christian342

Gast
So habe ich das auch gedeutet, aber ich kenne die ganzen Details des HTTP protokolls nicht und wunder mich einfach warum die kurze google.de Seite unbekannt sein soll während apache.org bekannt sein soll.
Vllt hält google nicht alle Konventionen des HTTP-Protocols ein und sendet die Größe nicht mit?

Werde es jetzt immer als Stream einlesen und umwandeln mit:
Code:
	     BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));

			String nextline, response;
			response = "";
		      
			while((nextline = br.readLine()) != null) {
				response += nextline;
				response += "\n";
			}
			seite=response;
			
			br.close();

Allerdings habe ich das Gefühl, dass es dadurch langsamer wird (habe ein paar Testdurchläufe mit Zeitmessung über System.nanoTime() gemacht).

Mal sehen wie sich das auf die Performance auswirkt. Ich möchte eben alle 5 Minuten möglichst zeitnah rund 100 Seiten aufrufen um Börsenkurse zu speichern....
 

Wildcard

Top Contributor
Deim Problem ist das String + String. Der Java-Performance Killer #1.
Nimm stattdessen einen StringBuilder den du noch vor der Schleife initialisierst.
 
C

Christian342

Gast
Vielen Dank! Zur Dokumentation hier die neue Version:

BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));

StringBuilder sb = new StringBuilder();
String nextline=null;

while((nextline = br.readLine()) != null) {
sb.append(nextline + "\n");
}

seite=sb.toString();

br.close();
 

Wildcard

Top Contributor
Gleiches Problem :wink:
Mach's so:
Code:
String nl = "\n";
 while((nextline = br.readLine()) != null) {
sb.append(nextline);
sb.append(nl);
}
 
C

Christian342

Gast
Gut, jetzt komme ich der Sache schon näher und kann bereits normale Daten von de.finance.yahoo.com und onvista.de abfragen. Allerdings würde ich auch gerne auf mein Depot bei cli*ckopt*ions.de (OHNE *) zugreifen und müsste mich dazu einloggen.

Mit folgendem Programm (in Anlehnung an das Beispiel von apache.org) bekomme ich die Antwortseite, dass mein Browser kein java-Script unterstützt. Das war zu erwarten und deshalb habe ich versucht meinen Opera zu emulieren, in dem ich ein paar Werte setzte. Auf http://www.aarweb.org/other/browserinfo.asp sieht es jetzt im Prinzip gleich aus...trotzdem der Fehler...

Code:
// package gethttp.httpClient;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;

import java.io.*;

public class Simple {

	 private static String url ="http://www.cli*ckopt*ions.de"; // OHNE * !!!!!!
	 
	 public static void main(String[] args) {

// wir emulieren meinen Opera 
		System.getProperties().setProperty("httpclient.useragent", "Opera/9.02 (Windows NT 5.1; U; en)");

		HttpClient client = new HttpClient();

	    GetMethod method = new GetMethod(url);
	    
// wir emulieren meinen Opera aufgrund der Werte von  [url]http://www.aarweb.org/other/browserinfo.asp[/url]
	    method.setRequestHeader( new Header( "connection", "Keep-Alive" ) );
	    method.setRequestHeader( new Header( "Accept-Language", "de-DE,en;q=0.9,de;q=0.8" ) );
	    method.setRequestHeader( new Header( "Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1" ) );
	    method.setRequestHeader( new Header( "accept-encoding", "deflate, gzip, x-gzip, identity, *;q=0" ) );
	    method.setRequestHeader( new Header( "Content-Type", "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1" ) );
	    method.setRequestHeader( new Header( "Referer", "http://www.google.com/search?hl=en&newwindow=1&client=opera&rls=en&hs=bov&q=browser+information&btnG=Search" ) );


	    try {
 	      int statusCode = client.executeMethod(method);

	      if (statusCode != HttpStatus.SC_OK) {
	        System.err.println("Method failed: " + method.getStatusLine());
	      }
	     
	      
	      String seite;
	    
	      BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));

	      StringBuilder sb = new StringBuilder();
	      String nextline=null;
	      String nl = "\n";
	      while((nextline = br.readLine()) != null) {
				sb.append(nextline);
				sb.append(nl);
	      }
			
	      seite=sb.toString();
			
	      br.close();


	    
	    
		

	   System.out.println(new String(seite));


	   
	    } catch (HttpException e) {
	      System.err.println("Fatal protocol violation: " + e.getMessage());
	      e.printStackTrace();
	    } catch (IOException e) {
	      System.err.println("Fatal transport error: " + e.getMessage());
	      e.printStackTrace();
	    } finally {
	      method.releaseConnection();
	    }  
	  }
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben