# Anfrage an Suchmaschine senden



## Guest (13. Aug 2007)

Hallo Leute,
ich möchte einen SEOAnalyser mit Java basteln. 
Das heißt ich sende mit einem bestimmten Keyword eine Suchanfrage an eine Suchmaschine und verarbeite dann die Ergebnisse.

Das Problem ist das Senden der Suchanfrage:


```
URL url = new URL("http://de.search.yahoo.com/search?p=wunsch&fr=yfp-t-501&ei=UTF-8&meta=vl%3D"); 	
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
```

Wenn ich das so ^^ mache, dann bekomme ich als Antwort stets ein Dokument mit einer ISO-8859-1 kodierung. Das kann ich nicht weiterverarbeiten. (Hab schon alles mögliche probiert, doch irgendwie damit zu arbeiten - seit 2 Tagen schon: das Resultat, es geht nicht...)

Wenn ich die Suchanfrage über einen HTTP Request löse, also so:

```
URL url = new URL("http://de.search.yahoo.com:80/");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
        wr.write("GET /search?p=wunsch&ei=UTF-8&fr=yfp-t-501&x=wrt&meta=vl%3D HTTP/1.0\r\n");
        wr.write("Host: de.search.yahoo.com\r\n");
        wr.write("Accept: text/html, text/plain, text/css, text/sgml, */*;q=0.01\r\n");
        wr.write("Accept-Encoding: gzip\r\n");
        wr.write("Accept-Language: en\r\n");
        wr.write("User-Agent: Lynx/2.8.6rel.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.6.2\r\n");
        wr.write("\r\n");
        wr.flush();
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
```
Dann bekomme ich ein Dokument, das immer die Startseite der Suchmaschine ist und nicht die Ergebnisseite.

Wie kann ich sonst so eine Suchanfrage mit Java realisieren? Bzw. warum antwortet die Suchmaschine mit einem ISO-8859-1 Dokument? Kann man da irgendwas drehen, dass das Dokument mit UTF-8 empfangen wird?

Bin für jegliche Hilfe sehr dankbar - sitz da schon seit 2 Tagen dran und langsam bin ich am verzweifeln.

Gruß Beni


----------



## NTB (13. Aug 2007)

Ich kann Dir jetzt hier nicht konkret helfen. Aber es gibt für alle größeren Suchmaschinen Webservice APIs. Hört sich so an, als wenn das eh die bessere Wahl wäre.


----------



## Guest (13. Aug 2007)

Mit den APIs habe ich mich ausgiebig beschäftigt. Ich würde die auch liebend gern verwenden, wenn sie nur ansatzweise dieselben Suchergebnissen zurückgeben würden, wie die "Original-Suche" (Web Eingabeformular)...

Sonst jemand ne Idee, wie man das machen könnte? Ich find im Internet nicht wirklich was hilfreiches...


----------



## jPat (14. Aug 2007)

Arbeiten die Suchmaschienen nicht mit sessionIDs, um so etwas zu verhindern ??


----------



## tuxedo (14. Aug 2007)

Also das hier


```
// Create a URL for the desired page
	        URL url = new URL("http://de.search.yahoo.com/search?p=wunsch&fr=yfp-t-501&ei=UTF-8&meta=vl%3D");
	    
	        // Read all the text returned by the server
	        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
	        String str = in.readLine();
	        while (str!=null) {
	        	System.out.println(str);
	        	str=in.readLine();
	        }
	        in.close();
```

Liefert mir das Suchergebnis ... Nur bei google scheint das nicht zu gehen. Wenn ich als url sowas angebe: http://www.google.de/search?hl=de&q=wunsch&btnG=Suche&meta=

Dann krieg ich gar nix zurück.

- Alex


----------



## Guest (14. Aug 2007)

> Arbeiten die Suchmaschienen nicht mit sessionIDs, um so etwas zu verhindern ??



Hmm, dann müsste aber beim ersten mal bereits eine sessionID mitübergeben werden in der URL... und das ist nicht der Fall. Yahoo verwendet erst beim weiteren Suchen eine sessionID...

@Alex: Jupp, das Problem bei Google ist mir auch schon aufgefallen: ERROR: Forbidden kommt zurück

Deinen Quellcode hab ich mir angeguckt. Ich krieg da auch die Seite zurück.
Aber jetzt mach mal folgendes: Öffne einen Editor (z.B. notepad) und füge das Ergebnis mit Copy&Paste ein. Du wirst sehen, dass die Hälfte fehlt, weil nach "<div class=yschabstr>Wunschenken " im Quelltext ein Bindestrich kommt. Dieser ist in ISO-8859-1 nicht kodiert. <- DAS ist das Problem!

Erst wenn ich den gesamten Text über Copy&Paste kopieren kann, dann wird auch mein Parser funktionieren...


----------



## tuxedo (14. Aug 2007)

Das DOkument ist doch mit ISO-8859-1 kodiert, steht zumindest so am Anfang der Seite im Meta-Tag.... 

Also sollte doch auch das Bindestrichgedöns in ISO-8859-1 verfügbar sein. Weil wie sonst sollte ein Browser die Seite anzeigen wenn er sieht: aha, ist mit ISO-8859-1 kodiert, also lese ich mit ISO-8859-1, aber das Bindestrich-Dingens kenn ich mit ISO-8859-1 jetzt irgendwie nicht ?!

Verstehst du was ich meine?

- Alex


----------



## tuxedo (14. Aug 2007)

Ach ja, ich hab mal zwischendrin das hier gemacht:


```
InputStreamReader isr = new InputStreamReader(url.openStream());
	        BufferedReader in = new BufferedReader(isr);
	        System.out.println(isr.getEncoding());
```

Dabei rausgekommen ist cp1252 ... 

Und noch was: Der Bindestrich bei dem das ganze vorher abbricht: Der kommt vorher auch schon vor, und da kommt zu keinen problemem?! Oder was ist an dem Bindestrich jetzt anders?
Kann mir nicht vorstellen dass "-" in ISO... nicht drin ist

Und zur Not, wenn alle Stricke reißen, kannst du eine Socket-Verbindung aufbauen und das bisschen GET-Anfrage auf unterster Ebene zum Server schicken. Das Ergebnis ist dann ein Stream von dem du byte(paket)weise lesen kannst. Unabhängig von irgendwelchen Kodierungen. 

- Alex


----------



## Guest (14. Aug 2007)

Danke für deine Antworten.


> Das DOkument ist doch mit ISO-8859-1 kodiert, steht zumindest so am Anfang der Seite im Meta-Tag....


jupp



> Also sollte doch auch das Bindestrichgedöns in ISO-8859-1 verfügbar sein.


Nein, ein Bindestrich oder auch das Euro Zeichen ist in ISO-8859-1 nicht enthalten
(Nicht das Minuszeichen mit dem Bindestrich verwechseln!) http://de.wikipedia.org/wiki/ISO_8859-1



> Weil wie sonst sollte ein Browser die Seite anzeigen wenn er sieht: aha, ist mit ISO-8859-1 kodiert, also lese ich mit ISO-8859-1, aber das Bindestrich-Dingens kenn ich mit ISO-8859-1 jetzt irgendwie nicht ?!


Das interessante ist ja, dass wenn ich die URL im Browser eingebe, Yahoo mit einem UTF-8 Dokument antwortet (steht im Header) Wobei die Browser meist selbst nachgucken, welche Kodierung die Beste ist und sich nicht immer auf das HTML Tag verlassen - am Rande.




> Und zur Not, wenn alle Stricke reißen, kannst du eine Socket-Verbindung aufbauen und das bisschen GET-Anfrage auf unterster Ebene zum Server schicken. Das Ergebnis ist dann ein Stream von dem du byte(paket)weise lesen kannst. Unabhängig von irgendwelchen Kodierungen.



Das hab ich ja schon versucht. Aber wenn ich das so mache, dann bekomme ich jedesmal die Startseite zurück und nicht die Ergebnissseite - wie ich das ja schon im Ausgangsposting geschrieben habe.


----------



## Guest (14. Aug 2007)

Jetzt gehts:
Mithilfe des HTTPClient von Apache kann man einen vernünftigen HTTP Get an die Suchmaschine schicken und die Ergebnisse werden korrekt kodiert zurückgesendet.


----------



## masta // thomas (15. Aug 2007)

HTTPClient ist sowieso Gold wert, erspart enorm viel Arbeit.


----------



## Dante (17. Aug 2007)

hi, das problem bei deinem obigen code (ganz oben) ist folgendes:

wenn du die Klasse url isnatnzierst und verbindest, generiert die intern ein request, du nimmst dann den outputstream und schickst ein selbstgebautes zweites request. Das kann funktionieren (stichwort connection: keepalive) muss es aber nicht. 

Auf jedenfall steht im Inputstream als erstes die ANtwort auf die Anfrage der UrlConnection, welche ja auf http://de.search.yahoo.com:80/ ginbg und daher die Startseite zurückliefert

Wenn du Anfragen selber bauen willst, nimm also besser nen echten Socket, der wurschtelt nirgendwo drin rum


----------

