Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Ausführen von Google Suchen (https://www.delphipraxis.net/210455-ausfuehren-von-google-suchen.html)

JimmyB 27. Apr 2022 21:13

Ausführen von Google Suchen
 
Hallo allerseits,
ich möchte dazu Google Suchen aus einem Delphi Programm starten.
Ich finde leider den Einstieg nicht, wie ich das umsetzen kann.
Für Tipps bin ich sehr dankbar.
Viele Grüße
JB

juergen 27. Apr 2022 22:43

AW: Ausführen von Google Suchen
 
Du kannst das mit ShellExecute() aufrufen. In etwa so (Beispiel nutzt den Übersetzer):

Delphi-Quellcode:
ShellExecute( Handle, 'OPEN', PWideChar( 'https://translate.google.com/#auto/de/' + TURI.URLEncode( <dein Suchbegriff> ) ), NIL, NIL, SW_SHOWMAXIMIZED );


Edit: Für TURI.URLEncode musst du unter uses System.Net.URLClient hinzufügen.

JimmyB 14. Mai 2022 19:13

AW: Ausführen von Google Suchen
 
Hallo Jürgen,
besten Dank für die Rückmeldung. Ich habe mit der Befehlszeile, die Du mir geliefert hast, rumprobiert und funktioniert wirklich gut.

Was ich aber suche, ist die Möglichkeit eine Suche aus Delphi zu machen, die mir z.B. die Parameter:
filetype:"bestimmter Dateityp"
intitle:"bestimmter Text"
inurl:"bestimmter Text"
und so weiter.

Ich habe in Deiner Befehlszeile
ShellExecute( Handle, 'OPEN', PWideChar( 'https://translate.google.com/#auto/de/' + TURI.URLEncode('hallo') ), NIL, NIL, SW_SHOWMAXIMIZED );

anstelle von "'https://translate.google.com/#auto/de/" eine Suchkommando "google.com/search" eingetragen:

ShellExecute( Handle, 'OPEN', PWideChar( 'google.com/search' + TURI.URLEncode( 'Suchbegriff' ) ), NIL, NIL, SW_SHOWMAXIMIZED );

Leider funktioniert das überhaupt nicht. Der Browser wird nichtmal mehr aufgerufen.

Beste Grüße
JimmyB

juergen 14. Mai 2022 19:55

AW: Ausführen von Google Suchen
 
Versuch mal ein https:// am Anfang anzufügen.

JimmyB 14. Mai 2022 20:09

AW: Ausführen von Google Suchen
 
Hallo Jürgen,

das war gut, der Browser startet jetzt :thumb:
Jetzt müsste er noch suchen und damit ein Ergebnis produzieren.

ShellExecute( Handle, 'OPEN', PWideChar( 'https://google.com/search' + TURI.URLEncode( 'USA' ) ), NIL, NIL, SW_SHOWMAXIMIZED );
ShellExecute( Handle, 'OPEN', PWideChar( 'https://google.com/search' + TURI.URLEncode( 'intitle:USA' ) ), NIL, NIL, SW_SHOWMAXIMIZED );
Die Google Suche sagt dann: 404. That’s an error.
The requested URL /searchintitle%3AUSA was not found on this server. That’s all we know.

Ich denke ich bin nah dran, kriege aber keine Kombination hin, die funktioniert.

vg JimmyB

TurboMagic 14. Mai 2022 20:33

AW: Ausführen von Google Suchen
 
Vielleicht ist das, was du als URL übergibst ja syntaktisch falsch?

Gebe ich USA als SUchbegriff in Google ein, wird eine URL aufgerufen die so startet:
https://www.google.de/search?q=USA
(der Rest dürfte egal sein)

Siehst du den Unterschied zu deiner URL?
search?q=USA

Grüße
TurboMagic

JimmyB 14. Mai 2022 20:44

AW: Ausführen von Google Suchen
 
Hallo,

das hat geholfen:
ShellExecute( Handle, 'OPEN', PWideChar( 'https://google.com/search?q=' + TURI.URLEncode( 'USA' ) ), NIL, NIL, SW_SHOWMAXIMIZED );

Jetzt wird der Browser aufgerufen
Die Google Suche produziert Ergebnisse, in diesem Fall zum Begriff USA.

Klasse und vielen Dank. Jetzt komme ich weiter!

Viele Grüße
JimmyB

JimmyB 15. Mai 2022 22:32

AW: Ausführen von Google Suchen
 
Nochmal Danke für die klasse Infos, die sehr gut geholfen haben.

Ich habe versucht die Ergebnisse aus den Suchen, in einem Objekt (nur jeweils die Überschriften) darzustellen.
Bisher habe ich noch kein Objekt gefunden, was die Daten anzeigen könnte.
Wäre die Umsetzung überhaupt möglich?
Viele Grüße
JimmyB

juergen 15. Mai 2022 23:44

AW: Ausführen von Google Suchen
 
Zum Anzeigen wäre ein TWebBrowser geeignet. => Verwendung TWebBrowser

Wenn du die Informationen aus der Webseite (Suchergebisse) extrahieren willst, kannst du z.B. die HTML-Seite in eine TStringList laden und dort anhand deiner Merkmale alles raussuchen und die Ergebnisse in ein TMemo speichern.

JimmyB 16. Mai 2022 05:24

AW: Ausführen von Google Suchen
 
Hallo Jürgen,

diese Objekte hatte ich schon ausprobiert, aber da saß der Fehler doch vor der Tastatur:lol:.
Was ich vorhabe ist Teile aus den Suchen zu extrahieren. Von daher wäre der Weg über TStringList zu gehen der richtige.

Ich gucke es mir an und danke für die Richtungsweisung!


Viele Grüße
JimmyB

TurboMagic 16. Mai 2022 19:38

AW: Ausführen von Google Suchen
 
Naja, es gibt auch eine HTTP Download Komponente wenn ich mich richtig erinnere.
Der könnte amn so wie dem Webbrowser die URL füttern und bekäme dann den Inhalt
der sonst im Webbrowser angezeigten Ergebnisseite. Halt als HTML...
Das müsste man dann parsen...

Grüße

TurboMagic

peterbelow 17. Mai 2022 12:08

AW: Ausführen von Google Suchen
 
Hast Du Dir mal im Browser eine Ergebnisseite eine Suche angesehen, als Quelltext? Das ist nichts als ein Wust von Javascript, die Seite wird komplett dynamisch aufgebaut.

Rolf Frei 17. Mai 2022 16:47

AW: Ausführen von Google Suchen
 
Das was du hier machen willst, kannst du mit ShellExecute nicht machen. Das ist in diesem Fall der falsche Ansatz. Du brauchst da einen HTTP-Client, z.B. den bei Delphi enthaltenen THTTPClient ode TNetHTTPClient. Such mal nach "http client" in der Delphi Hilfe.

Wie peterbelow erwähnt hat, wirst du die HTML-Antwort von Google so praktisch nicht nutzen können, weil da alles zur Runtime im Broswer dynamisch per Javascript nachgeladen wird. Google hat hier einen gut Job geleistet, um genau das was du machen willst, nahezu zu verunmöglichen. Google will schliesslich mit der Werbung auf der Suchseite Geld verdienen und dann wäre das ein NoGo, wenn man das einfach so umgehen/missbrauchen könnte.

KodeZwerg 17. Mai 2022 17:12

AW: Ausführen von Google Suchen
 
Ich finds gerade nicht aber es gab da mal eine Google API bei der Du dein Request (Die Suche) als Antwort erhalten hast, dazu musste man bei Google Developer einen Account anlegen.

Was hast Du denn vor mit dem Suchergebiss?
Ich meine wenn ich "USA" eintippe kommen da eine zillion treffer....

JimmyB 23. Mai 2022 13:18

AW: Ausführen von Google Suchen
 
Hallo allerseits,
mein bisheriger Ansatz die Google Suchen in ein Objekt auszugeben, waren denke ich zu kompliziert und vom Ansatz her nicht brauchbar.
Ich möchte nachdem die Google Suche stattgefunden hat, diese vom Inhalt überprüfen.
Zum Beispiel möchte ich sagen feststellen:
Webseite: diesewebseite.de
enthält: 27 PDF Dokumente

Diese muss ich nicht direkt in einem Objekt in meinem Programm direkt anzeigen.
Der Umweg über die Ausgabe der Google Suche in eine Datei mit anschließender Analyse, was die Suche gefunden hat, meine ich könnte sich einfacher gestalten.

Jetzt kommt es wieder:
Das Ausgeben in eine Datei bekomme ich nicht hin.
Mit >> Pfad\Dateiname, sollte es eigentlich gelingen.
Hier ein Beispiel, welche nicht funktioniert. Ich habe endlos viele Stellen getestet, die gehen alles nicht.
Leider finde ich keine Stelle, wo ich die Umleitung einbauen kann, damit Delphi die auch ausführen kann.

ShellExecute( Handle, 'OPEN', PWideChar( 'https://google.com/search?q=' + TURI.URLEncode( 'site:'+edit1.text+ ' '+ 'filetype:doc' ) ),>> c:\test\tt.txt NIL, NIL, SW_SHOWMAXIMIZED );

Vielleicht fehlt auch wieder nur irgendein Hochkomma.....?

Viele Grüße
JimmyB

peterbelow 23. Mai 2022 16:36

AW: Ausführen von Google Suchen
 
Zitat:

Zitat von JimmyB (Beitrag 1506243)
Ich möchte nachdem die Google Suche stattgefunden hat, diese vom Inhalt überprüfen.
Zum Beispiel möchte ich sagen feststellen:
Webseite: diesewebseite.de
enthält: 27 PDF Dokumente

Diese muss ich nicht direkt in einem Objekt in meinem Programm direkt anzeigen.
Der Umweg über die Ausgabe der Google Suche in eine Datei mit anschließender Analyse, was die Suche gefunden hat, meine ich könnte sich einfacher gestalten.

Jetzt kommt es wieder:
Das Ausgeben in eine Datei bekomme ich nicht hin.
Mit >> Pfad\Dateiname, sollte es eigentlich gelingen.
Hier ein Beispiel, welche nicht funktioniert. Ich habe endlos viele Stellen getestet, die gehen alles nicht.
Leider finde ich keine Stelle, wo ich die Umleitung einbauen kann, damit Delphi die auch ausführen kann.

ShellExecute( Handle, 'OPEN', PWideChar( 'https://google.com/search?q=' + TURI.URLEncode( 'site:'+edit1.text+ ' '+ 'filetype:doc' ) ),>> c:\test\tt.txt NIL, NIL, SW_SHOWMAXIMIZED );

Vielleicht fehlt auch wieder nur irgendein Hochkomma.....?

Viele Grüße
JimmyB

Wieso glaubst Du das könnte funktionieren? Zum einen ist redirection eine Funktion des Kommand-Prozessors (cmd.exe), nicht von ShellExecute. Zum anderen kann man nur etwas redirecten, was das gestartete Programm auf stdout ausgibt. Das tut der Browser aber nicht, und den startet ShellExecute um deinen https request auszuführen.

Man kann zwar die erste Ergebnisseite im Browser selektieren (Strg-A), ins Clipboard kopieren (Strg-C) und von dort extrahieren (sText := Clipboard.AsText; ), aber das gibt wirklich plain text, kein HTML, d.h. auch keine Möglichkeit, Links zu identifizieren und zu verfolgen.

JimmyB 24. Mai 2022 10:47

AW: Ausführen von Google Suchen
 
Hallo,

so hatte ich es fast schon vermutet. Schade und Danke für die Rückmeldung.

Viele Grüße
JimmyB

peterbelow 24. Mai 2022 11:58

AW: Ausführen von Google Suchen
 
Zitat:

Zitat von JimmyB (Beitrag 1506307)
Hallo,

so hatte ich es fast schon vermutet. Schade und Danke für die Rückmeldung.

Viele Grüße
JimmyB

Hey, gib nicht so schnell auf:)
Die meisten Browser (on Windows) packen die selektierten Daten auch noch in ein paar anderen Formaten ins Clipboard, HTML Format könnte da was für Dich sein.

KodeZwerg 25. Mai 2022 18:21

AW: Ausführen von Google Suchen
 
Vielleicht hilft Dir dieser Ansatz etwas weiter, hiermit erhälst du den quelltext einer web-seite.

Delphi-Quellcode:
uses
  System.NetEncoding,
  IdHttp;

...

function GetWebPage(const AURL: string): string;
var
  Remote: TIdHttp;
  ResponseText: string;
begin
  Result := '';
  ResponseText := '';
  Remote := TIdHTTP.Create(nil);
  try
    Remote.HandleRedirects := True;
    Remote.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
    ResponseText := Remote.Get(AURL);
  finally
    Remote.Free;
  end;

  if Length(ResponseText) = 0 then
    Exit;

  Result := ResponseText;
end;

function GetGoogleSearch(const ASearch: string): string;
begin
  Result := GetWebPage('https://www.google.com/search?q=' + TNetEncoding.URL.Encode(ASearch));
end;
//edit
Ich vermute per XML könnte man sich zum gewünschten Ergebis durchbuddeln, bestimmt auch programmatisch für deinen Zweck automatisieren lassen.
Das obige liefert jedenfalls schonmal etwas was zum parsen gebraucht wird :-]

TurboMagic 26. Mai 2022 08:32

AW: Ausführen von Google Suchen
 
Danke für den Ansatz um den Inhalt einer Webseite auszulesen, nur: wenn du mal weiteroben die Posts
list wirst du feststellen, dass das mit der Google Seite eher weniger helfen dürfte, da die scheinbar
alle möglichen relevanten Teile per JavaScript nachlädt :-(
Daher sollte man wohl das von Google bereit gestellte API benutzen...
Mit etwas Glück liefert das dann auch weniger für den Anwendungsfall unnützen Balast mit...

KodeZwerg 26. Mai 2022 20:33

AW: Ausführen von Google Suchen
 
Zitat:

Zitat von TurboMagic (Beitrag 1506378)
Danke für den Ansatz um den Inhalt einer Webseite auszulesen, nur: wenn du mal weiteroben die Posts
list wirst du feststellen, dass das mit der Google Seite eher weniger helfen dürfte, da die scheinbar
alle möglichen relevanten Teile per JavaScript nachlädt :-(
Daher sollte man wohl das von Google bereit gestellte API benutzen...
Mit etwas Glück liefert das dann auch weniger für den Anwendungsfall unnützen Balast mit...

Delphi-Quellcode:
function GetTextFromHtml(const AURL: string): string;
var
  Document: IHtmlDocument2;
  WebBrowser: TWebBrowser;
  HiddenForm: TForm;
begin
  Result := '';
  HiddenForm := TForm.Create(nil);
  try
    HiddenForm.Top    := 10;
    HiddenForm.Left   := 10;
    HiddenForm.Height := 600;
    HiddenForm.Width  := 800;
    HiddenForm.Visible := True;
    WebBrowser := TWebBrowser.Create(HiddenForm);
    try
      TWinControl(WebBrowser).Name  := 'WebBrowser';
      TWinControl(WebBrowser).Parent := HiddenForm;
      WebBrowser.Silent := True;
      WebBrowser.Visible:= True;
      WebBrowser.Align := alClient;
      WebBrowser.HandleNeeded;
      HiddenForm.InsertControl(WebBrowser);
      WebBrowser.Navigate(AURL);
      Document := WebBrowser.Document as IHtmlDocument2; // Diese
      Result := Trim(Document.Body.innerText);          // und diese Zeile bereiten mir noch Kopfschmerzen.
    finally
      HiddenForm.RemoveControl(WebBrowser);
      WebBrowser.Free;
    end;
  finally
    HiddenForm.Free;
  end;
end;

function GetGoogleSearch(const ASearch: string): string;
begin
  Result := GetTextFromHtml('https://www.google.com/search?q=' + TNetEncoding.URL.Encode(ASearch));
end;
Okay, habs gelesen und einen neuen Versuch gebastelt der allerdings bis jetzt nur pure Theorie ist da es nicht so möchte wie ich es gerne hätte.
Zitat:

EAccessViolation:Access violation at address 005F8794 in module 'Project49.exe'. Read of address 00000288
Meine Hauptanwendung ist ein Konsolenprogramm.
In diesem Versuch probiere ich die Google Suche in einem TWebBrowser darzustellen und dann lediglich den dargestellten Text rauszukopieren.

TurboMagic 27. Mai 2022 11:31

AW: Ausführen von Google Suchen
 
Hallo,

in einem Konsolenprogramm geht sowas wegen fehlender Windows Botschaften bearbeitung (GetMessage/DispatchMessage etc.)
evtl. nicht. Versuch es doch im ersten Schritt mal als GUI Programm.

Abstürzen sollte es als Konsolenprogramm aber trotzdem nicht.

Grüße

TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz