Delphiからグーグルの検索結果を利用するには?

解決


デル太  2006-12-13 12:11:04  No: 24222

いつもご指導ありがとうございます。

Delphiプログラムでインターネット上のWEBサービス(自作含む)を
利用したいと考えています。
その典型例として、Delphiでインタフェースを作り、
グーグルで検索した結果を次のように活用することを考えています。

a-1)TEditに検索ワードを入力し、
a-2)その単語をグーグルで検索する
a-3)検索結果をTStringListに保持してその後の処理をする

グーグルとのやり取りは、次のようにすると手軽に
実現できるかな?と考えました。

b-1)フォームにTWebBrowserを配置する
b-2)TWebBrowserでグーグル(www.google.co.jp)を表示する
b-3)グーグルページの検索用テキストボックス(name=q)にa-1)で
    TEditに入力した単語を反映する
b-4)グーグルページの検索ボタン(name=btnG)をクリックする
b-5)表示された検索結果ページのHTMLソースを取得する
b-6)HTMLソース(文字列)から必要な検索結果部分を抜き出す処理をする

最後のb-6)はグーグルの表示結果を分析する必要がありそうですが、
b-1)からb-5)までは、グーグルに限らず他のWEBサービスでも
同様の処理になるかもしれないと感じています。

ただ、b-3),b-4)をどのように実現するかわかりません。
具体的には、次の処理になると思います。

c-1)DelphiでTWebBrowser上のテキストボックスに値を設定する
c-2)DelphiでTWebBrowser上のボタンをクリックする

c-1),c-2)をどのように実現できるか、ご指導いただけますか?
たぶん典型的な質問とは思うのですが、過去ログをTWebBrowserで検索しても
見つけることができませんでした。
どうぞ、よろしくお願いいたします。


deldel  2006-12-13 18:19:26  No: 24223

以下は参考になりませんでしょうか?
  NMURL1.InputString := Edit1.Text;
  ShellExecute(Handle, nil, PChar('http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q=' + NMURL1.Encode), nil, nil, SW_SHOW);


デル太  2006-12-14 00:04:21  No: 24224

deldel様ありがとうございます。
大変参考になりました。
動作確認と不具合調査のため、回答が遅れてしまいました。
申し訳ございません。

deldelさんにご指導いただいた方法を試して、別ウィンドウでIEが開き、
検索結果が表示されました。

引き続きb-5)を実現したかったので、TWebBrowserを使う方法を調べて実装
してみました。
その結果、TWebBrowser上に検索結果が表示されました!

ただ、HTMLソースをうまく取得できません。
次の記事を参考にしてみたものの、実行すると読み込みエラーが発生しています。
https://www.petitmonte.com/bbs/answers?question_id=1697

WEBで見かけた次のコードで試してみたところ、HTMLソースが取得できました。
ただ、HEADタグ内が返され、BODYタグが抜けてしまっているようです。

  Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.outerhtml;

この点を解決するには、WebBrowser1.OleObject.Documentの部分の扱い方を勉強する
必要がありそうです。

検索してみたのですが、適当なキーワードなどがわかっていないためか、
うまく情報を見つけることができません。

よろしければ、正式な技術名やオススメのキーワードなど、ご指導いただけると幸いです。

ちょっと長いですが、ソースを添付させていただきます。
-----
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, NMURL, ShellApi, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    NMURL1: TNMURL;
    Edit1: TEdit;
    Button1: TButton;
    WebBrowser1: TWebBrowser;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure WebBrowser1NavigateComplete2(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//deldelさんにご指導いただいた方法→別WindowでIEが開き検索結果が表示される
procedure TForm1.Button1Click(Sender: TObject);
begin
  NMURL1.InputString := Edit1.Text;
  ShellExecute(Handle, nil, PChar('http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q=' + NMURL1.Encode), nil, nil, SW_SHOW);
end;

//TWebBrowserを使う方法を試してみる
procedure TForm1.Button2Click(Sender: TObject);
var
  URL: String;
begin
  NMURL1.InputString := Edit1.Text;
  URL := 'http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q=' + NMURL1.Encode;
  //URLエンコードした結果を表示する
  ShowMessage(URL);
  //TWebBrowserで表示する
  WebBrowser1.Navigate(URL);
end;

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  //ページが読み込まれたら、Memo1にソースを表示したい

  //HEADタグだけが表示される
  Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.outerhtml;

//検索結果←<BODY>タグがない
{
<HTML><HEAD><TITLE>入力キーワード - Google 検索</TITLE>
<META http-equiv=content-type content="text/html; charset=UTF-8">
    :
  (中略)
    :
</HEAD></HTML>
}

  //一部の文字のみが表示される
  //Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.innerTEXT;

  //参考
  //https://www.petitmonte.com/bbs/answers?question_id=1697
  //読み込み違反エラーになってしまう
  //Memo1.Text := WebBrowser1.OleObject.Document.Body.InnerText
end;

end.


deldel  2006-12-14 01:01:37  No: 24225

WebBrowser はよくわからないのですが、以下のようにするとソースをファイルに落とせます。
表示はWebBrowserで行い、内容はファイルにこっそり保存してそれを読む、
というのはどうでしょうか?

uses UrlMon;

UrlDownloadToFile(nil, PChar('http://www.google.co.jp/search?hl=ja&q=aaa&btnG=Google+%E6%A4%9C%E7%B4%A2&lr='), PChar('C:\aaa.txt'), 0, nil);


AL  2006-12-14 01:09:24  No: 24226

TWebBrowserを使うことは必須なのでしょうか?
単にGoogleで検索した結果をTStringListへ入れるだけなら、
IndyのIdHTTPを利用すれば簡単にできます。

たとえば、フォームにMemoとEditを配置し、Editへ入力したデータをGoogleで
検索Memoへソースを表示するなら一行でできます。

Memo1.Text := IdHTTP1.Get('http://www.google.co.jp/search?hl=ja&lr=&q=' + Edit1.Text);

Google、Yahoo等であればWeb API、SOAPが利用可能なところもあるので、
そちらも一度調べてみてはいかがでしょうか?


デル太  2006-12-14 08:26:08  No: 24227

deldelさん、ありがとうございます。
ご指導いただいたソースでファイルに落とすことができました。
取得したファイルを使い、目的の処理ができると思います。


デル太  2006-12-14 08:27:20  No: 24228

ALさん、ありがとうございます。
ご指導いただいたソースで、Memo1にソースを取得できました。
これを使って目的の処理ができると思います。


デル太  2006-12-14 08:31:31  No: 24229

当初の目的が達成できましたので、解決となりました。

次の課題に、b-6)のソースからタグを除去する作業があります。
これは次の疑問が解決できると、innerHTMLを使って簡単に処理できそうな気がしています。

> ただ、HEADタグ内が返され、BODYタグが抜けてしまっているようです。

>   Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.outerhtml;

> この点を解決するには、WebBrowser1.OleObject.Documentの部分の扱い方を勉強する
> 必要がありそうです。

> 検索してみたのですが、適当なキーワードなどがわかっていないためか、
> うまく情報を見つけることができません。

> よろしければ、正式な技術名やオススメのキーワードなど、ご指導いただけると幸いです。

もし、補足情報などございましたら、引き続き書き込んでいただけると幸いです。
よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加