Google Bildersuche parsen - ist das eigentlich erlaubt?

  • 18 Antworten
  • Letztes Antwortdatum
A

andireas99

Neues Mitglied
2
Hallo zusammen,
ich habe das Problem, dass es den Code den ich abfrage einfach nicht in die 2. Klasse rüberbringt.
Ich starte einen neuen Thread mit der Klasse die den Code holt. Dann will ich den in die 2. Klasse bringen abr es geht nicht, egal was ich versuche. :(

Ich habe die Quellcode-Klasse in der Aufrufe Klasse drin.
Code:
Code:
public class MainActivity extends Activity {
        public String code = "";
    String x = "";
    public String response_str;
    public HttpClient client;
    public HttpGet request;
    public ResponseHandler<String> responseHandler;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Thread thread = new Thread(new qc());
        thread.start();
        System.out.println("code: "+x);
        setContentView(R.layout.activity_main);
        
                
    }
    
    
    
    public class qc implements Runnable{
        public void run(){
        client = new DefaultHttpClient();
        request = new HttpGet("https://www.google.ch/");
        
        responseHandler = new BasicResponseHandler();
        
        try {
            response_str = client.execute(request, responseHandler);
            
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
        public String x(){
            return response_str;
            
        }
}
}
Es gibt immer nur "code: " aus...

LG Andreas

EDIT: Ich Idiot habe vergessen die run methode aufzurufen :lol:

Aber jetzt hagelt es errors...

Code:
01-12 20:20:35.374: E/AndroidRuntime(940): FATAL EXCEPTION: main
01-12 20:20:35.374: E/AndroidRuntime(940): java.lang.RuntimeException: Unable to start activity ComponentInfo{ch.example.quellcode/ch.example.quellcode.MainActivity}: android.os.NetworkOnMainThreadException
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.os.Looper.loop(Looper.java:137)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.ActivityThread.main(ActivityThread.java:4745)
01-12 20:20:35.374: E/AndroidRuntime(940):     at java.lang.reflect.Method.invokeNative(Native Method)
01-12 20:20:35.374: E/AndroidRuntime(940):     at java.lang.reflect.Method.invoke(Method.java:511)
01-12 20:20:35.374: E/AndroidRuntime(940):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-12 20:20:35.374: E/AndroidRuntime(940):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-12 20:20:35.374: E/AndroidRuntime(940):     at dalvik.system.NativeStart.main(Native Method)
01-12 20:20:35.374: E/AndroidRuntime(940): Caused by: android.os.NetworkOnMainThreadException
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
01-12 20:20:35.374: E/AndroidRuntime(940):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-12 20:20:35.374: E/AndroidRuntime(940):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-12 20:20:35.374: E/AndroidRuntime(940):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:653)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
01-12 20:20:35.374: E/AndroidRuntime(940):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
01-12 20:20:35.374: E/AndroidRuntime(940):     at ch.example.quellcode.MainActivity$qc.run(MainActivity.java:46)
01-12 20:20:35.374: E/AndroidRuntime(940):     at java.lang.Thread.run(Thread.java:856)
01-12 20:20:35.374: E/AndroidRuntime(940):     at ch.example.quellcode.MainActivity.onCreate(MainActivity.java:29)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.Activity.performCreate(Activity.java:5008)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
01-12 20:20:35.374: E/AndroidRuntime(940):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
01-12 20:20:35.374: E/AndroidRuntime(940):     ... 11 more
Das heisst hier
Code:
thread.run();
und hier
Code:
response_str = client.execute(request, responseHandler);
ist was faul...
 
Zuletzt bearbeitet:
1.) Du gehst davon aus, dass der Main Thread nach start() blockt. Genau darum geht es doch, dass der Main Thread weiterlaufen soll. Mit anderen Worten, der Thread hat x noch gar nicht errechnet, wenn du in der Activity den Wert aus x auswertest.

2.) Was soll qc.x() sein? Sieht aus, wie schlecht aus einem C# Programm abgeguckt :). Java ruft nicht automagisch getter und setter Methoden auf. Du musst in der Hilfsklasse schon den Wert in x hineinschreiben(siehe jedoch unten). Du kannst aus deinem qc heraus den Wert explizit übertragen.

3.) Man ruft NEVER EVER selbst run() in einem Runnable auf! Das macht die Thread engine, wenn du start() aufrufst. Mit deinem expliziten Aufruf von run wird der Code im Main Thread aufgerufen, deshalb der Fehler.

4.) Nimm lieber einen AsyncTask, der ist für Anfänger leichter. Dort kannst du im doInBackground() deinen Netzwerkaufruf machen und dann im onPostExecute() (da bist du dann wieder im Main Thread) deine GUI entsprechend updaten. Die Variable x wird dann überflüssig, bzw gehört dann ins qc hinein.

5.) Klassennamen sollen selbstdokumentierend und groß sein. Also nicht "qc" sondern "WertHolen" oder so :D
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: andireas99
Code:
thread.run()
ist schonmal falsch :tongue: Man ruft immer nur die Methode start() auf, run() wird dann automatisch ausgeführt.

Code:
response_str = client.execute(request, responseHandler);
die Antwort vom Server wird in response_str gespeichert, wieso sollte es danach plötzlich in x drin sein? Tipp: Deine Methode x() hat nichts mit dem Attribut x zu tun, auch wenn es den gleichen Namen hat.
 
Ja es stimmt dass ich die Tendenz habe schlechte Nanen auszuwählen...
Und 2. *gegen die wand renn* ich habe den ungeordneten code mit den nichtssagenden namen gepostet.Soviel zum Thema alles nochmals durchlesen... ich werde das morgen korrigieren und hoffe dass ihr nicht graue Haare bekommen habt wegen meinem Programmierstil :tongue:

Lg Andreas
 
Ich kann nur den Tipp von DieGoldeneMitte wiederholen.
Versuchs lieber mit dem AsyncTask

Multithreading ist und bleibt selbst führ erfahrene Programmierer eine komplizierte Sache mit sehr vielen Fallstricken.
Und du scheinst mir dem Code nach zu Urteilen kein erfahreren Programmierer zu sein.
 
So ich nutze zwar immernoch mehrere Threads aber hab alles gefixt. Danke euch!!!

Der ursprüngliche Beitrag von 17:44 Uhr wurde um 19:30 Uhr ergänzt:

Jetzt aber noch was. Ich rufe mit diesem code den Quellcode von Google Bildersuche auf. Jetzt möchte ich die Urls der Bilder, welche darin eingebunden sind "parsen".
Bis jetzt liest es aber nur einen Bruchteil des gesamten Codes aus, da er warscheinlich zu gross ist. Da aber die Bilder nur in der 2. untersten Zeile eingebunden sind, wäre es möglich nur die auszulesen? Oder sonst einen längeren Code auszulesen?

LG Andreas
 
Ja indem du nicht einfach das ergebnis von execute in ein String "quetscht" sondern mit dem HttpResponse arbeitest dir dort das HttpEntity rausholst und dann dort mit getContent auf dem Stream arbeitest
:)
 
  • Danke
Reaktionen: andireas99
Uuups, habe gerade bemerkt, dass es garnicht ein Problem des Strings war, sondern ein Problem von System.out.println(). Das hat nur 4062 Zeichen von 37000 ausgegeben. Bei String.length(); ist aber alles ok.
 
Nur noch eine kleine Frage zum sichergehen: es ist doch erlaubt aus der Google Bildersuche die Links heraus zu nehmen und in meiner App anzuzeigen? Das heisst nicht ich bestimme was für Bilder dort sind sondern der Nutzer kann ein Suchwort eingeben und es werden Bilder von der Google Bildersuche angezeigt.

LG Andreas
 
Vermutlich nicht. Die bilder sind Copyright geschützt, selbst Google hat da so eine Probleme mit gehabt.
Dürfte aber auch davon abhängne was du damit machst.
Alles weitere sollte dir ein Anwalt erklären. Wobei der vermutlich keine definitive Antwort auf diese Frage hat.
 
Also der User kann ein Suchwort eingeben, das wird mit Google suche gesucht, ich muss die Bild-Urls parsen, damit man die Bilder runterladen kann. Für mich hört sich das wie ein ganz normaler Browser an... Oder muss man die Bilder einfach auf der Googel Seite anzeigen und dann ist das herunterladen legal? Oder haben die Browsers eine bestimmte Lizenz?
Naja viele Fragen... Tut mir leid, aber einen Anwalt habe ich nicht gerade in der Nähe :mellow: Sonst nutze nur ich die App und dann ist es legal...
 
Solange du das nur für dich selbst machst dürfte das kein Problem sein.

Was Googles Bildersuche angeht, ich meine dazu gab es schon einige Gerichtverfahren.
Die betrafen allerdings nur Google selber.

Wenn du nun hingehst und die Bildersuche von google "missbrauchst" verstößt du wahrscheinlich schon die die Nutzungbedingungen von Google.
Wie gesagt da müsstest du entweder dich selber einlesen oder einen Anwalt fragen.

Ich könnte mir vorstellen, dass Google in den Nutzungsbedingungen so etwas stehen hat wie "Die Bilderabfrage darf nicht maschinell erfolgen", dann wäre wiederum die Frage ob deine App, wo man ein Suchwort per Hand eintippt das schon erfüllt.

Im Prinzip hast du recht du machst nicht viel anderes als ein Browser.
Leider sind unsere gesetze und Gerichte nicht unbedingt immer der Meinung, dass technisch eigentlich identische Dinge, auch rechtlich gleich behandelt werden.

Ein Beispiel:
Ich hab eine Webseite und verlinke auf ein Bild im Internet, relativ unproblemtatisch.

Binde ich das Bild allerdings direkt ein, bekomm ich garantiert ein Problem mit demjenigen, dem das Bild gehört.
Technisch gesehen macht das eigentlich keinen großen Unterschied ausser, dass der User genau 1 mal mehr klicken muss, ansonsten passiert exakt das gleiche.

Was rechtliche Themen und Software angeht liegt halt noch sehr viel im argen, deswegen kann man niemanden der sich wirklich 100% sicher legal bewegen will empfehlen Software zu entwickeln.
Eigentlich ist das ohne Anwalt fast nicht möglich. ;)

Oder man macht sich weniger Gedanken darum, lebt aber mit den möglichen Konsequenzen.
 
Tjaaaa ich bin noch ein Kind - Darum hab ich auch nicht einen Anwalt zur Hand ://
Ich lese mich warscheinlich mal in die Nutzungsbedingungen ein... :D

Der ursprüngliche Beitrag von 22:30 Uhr wurde um 22:46 Uhr ergänzt:

Google Nutzungsbedingungen schrieb:
Sie sind beispielsweise nicht berechtigt, in die Dienste einzugreifen oder in anderer Weise als über die von Google bereitgestellte Benutzeroberfläche und gemäß unseren Vorgaben auf die Dienste zuzugreifen.

Also darf ich nur die Google Bildersuche anzeigen. Aber dann kann ich ja niht den Quellcode nicht so umwandeln, dass ich die Bilder downloaden kann. :(
 
Exakt sowas hab ich gemeint.
Nur niemand liest Nutzungsbedingungen wirklich in den meisten Fällen :)
Die Leute würden sich wundern was sie so alles zugestimmt haben.

Vorallem darfst du aber den Quellcode nicht ändern um die Bilder downloaden zu können. Du darfst streng genommen nicht mal in deinem Browser z.B. ein Greasymonkey script laufen lassen, dass dir die Bildersuche an deine Bedürfnisse anpasst.
Wenn man es ganz genau nimmt, darfst du nicht mal mit einer kommandozeile darauf zugreifen, weil das nicht den Vorgaben von Google entspricht.

UNd auf die Spitze getrieben darfst du wahrscheinlich nicht mal einen wirklich alten Browser verwenden da die Seite da garantiert auch komplett anders aussieht und nicht wirklich den Vorgaben entspricht ;)
 
Hahahahaha xD
Aber jetzt mal im Ernst: Wie machen ddiese Browser das, dass sie nicht gegen eine dieser Regeln verstossen und trotzdem Bilder herunterladen können?!! :confused2:
 
Wieso? der Browser ist die von Google bereit gestellte Benutzeroberfläche und entspricht vermutlich den Vorgaben um darauf zuzugreifen.

Wenn du aber hingehst, die Seite parst und quasi deine eigene Oberfläche baust liegst du nicht mehr in Googles Vorgaben.

Die Frage wäre noch ob der Entwickler dann dagegen verstößt (der muss den Nutzungsbedingungen evtl gar nicht zustimmen, wenn er Google sonst niemals benutzt hat) oder der User der die App nutzt.

Aber nochmal mein Hinweis:
Das ist alles rechtlich nicht so einfach mein Beitrag hier ist nur meine Meinung und keine Rechtsberatung, wenn du es halbwegs sicher haben willst musst du wirklich einen Anwalt beauftragen oder du schickst eine Mail an Google und fragst nach ob die was dagegen haben. Ansonsten kann dir das niemand beantworten.
 
  • Danke
Reaktionen: andireas99
So jetzt noch was: wenn client.execute(...).lenght(); eigebe, gibt das so ca. 35000 aus. Wenn ich aber im Firefox auf die genau gleiche Seite gehe und auf Quelltext anzeigen gehe, heisst es dass es ca. 350000 Zeichen hat!! Was muss ich tun dass es den ganzen Code ausliest oder sonst in mehreren Stücken?

LG Andreas
 
Ich zitiere mich mal selber
amfa schrieb:
Ja indem du nicht einfach das ergebnis von execute in ein String "quetscht" sondern mit dem HttpResponse arbeitest dir dort das HttpEntity rausholst und dann dort mit getContent auf dem Stream arbeitest
:)

execute sollte ein HttpResponse zurück geben und der hat eigentlich keine length methode oder variable.
Hast du wieder toString gemacht?

Ich hab doch oben schon geschrieben mit Execute holste du den response von dem kannste du dir das HTTPEntity holen (mit getEntity) und von dem Objekt dann mit getContent den Inputstream.

Mit dem kannst du dann wie mit jedem Stream arbeiten (Wie du mit streams arbeitest kannst du sicher bei Google finden).


toString wird irgendwann einfach abrechen weitere Strings rauszugeben, weil das theoretisch viel zu groß werden kann und du dann ein OutOfMemory bekommst deswegen hat man wohl bei 35.000 Zeichen aufgehört.
 
Hallo zusammen
ich hab mich mal wieder dran gesetzt und alles gefixt. Danke!
Es werden aber zurzeit die Zeilenumbrüche nicht mit geladen... Gibt es eine Möglichkeit dies zu ändern??

Lg Andreas
 
Zurück
Oben Unten