Indyでホームページを取得し、タイトルを抽出

こんにちは太田アベルです。

Delphi Advent Calenderの投稿記事です。

昨日は@lynaさんの「IDEにおける背景変更機能の導入による開発効率への影響とその考察。」でした。タイトルに反して痛IDE作成記事となっていましたが、痛いIDE実現のためにプラグインを開発してしまうあたりが恐ろしいところです。

私は非常にライトに、Indyを使ったインターネットデータへのアクセスをしてみようと思います。もちろん健全なデータです(笑)

DelphiのIndyコンポーネントを使うと、さまざまなインターネットデータを非常に短い構文でやり取りすることができます。ホームページを取得し、そのタイトルを抽出してみます。

DelphiはXE3を使用しています。

フォームの設計

フォームに以下のコンポーネントを貼り付けます。

  • TLabel
  • TEdit
  • TButton
  • TMemo
  • TIdHTTP

レイアウトは次のようにしました。

2012-12-01_15h44_42

IdHTTPのみプロパティを変更します。

2012-12-01_15h27_31

HandleRedirectsを True にします。

このプロパティをTrueにしないと、Googleのような幾つかのアドレスを切り替えて運営している(ブラウザによりリダイレクトしている)サイトでは、Indyが切り替えに対応できず例外が発生してしまいます。

自分でリダイレクトのハンドラを書きたい場合など、特殊な状況を除いて常にTrueで問題ありません。

Label1はわかりやすいようにフォントサイズを大きくしておきます。

コーディング

次はイベントハンドラを書いていきます。

今回はホームページのタイトル部分を正規表現で取得します。XE3に標準で搭載されている「System.RegularExpressions」を使用します。

usesに「System.RegularExpressions」を追加します。
(Delphiのバージョンによりusesは違います)

2012-12-01_15h39_11

次にButton1をダブルクリックし、イベントハンドラを書きます。

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  m: TMatch;
  i: Integer;
begin
  if Edit1.Text <> '' then
  begin
    s := IdHTTP1.Get(Edit1.Text);  //Edit1のアドレスからページを取得
    Memo1.Lines.Text := s;  //memoに内容を表示

    m := TRegex.Match(s, '<title>(.*)</title>'); //正規表現の判定
    //取得が成功したか?
    if m.success then
    begin
      //成功したら正規表現グループの1からタイトルを取得
      Label1.Caption := m.Groups[1].Value;
    end
    else
    begin
      //成功しなかった
      Label1.Caption := '取得できませんでした';
    end;
  end;
end;

入力ができましたら、F9を押して実行してみましょう。

実行

エディット部分に「http://google.co.jp」と入力し、Button1を押してみましょう。

成功すると以下のように表示されるはずです。

2012-12-01_15h43_54

タイトル部分がLabel1に取得されていますね。

以上で実験は終わりです。Indyコンポーネントを使えば、非常にカンタンにインターネットデータを取得することができます。

もちろんさらに工夫をすればあんなデータやこんなデータが吸い上げ放題です。調子に乗ってクローラを作ったら速攻でIPブロックされました。次はがんばります(何をだ)

読んでいただきありがとうございました!

楽しかったらぜひシェアしてくださいね~↓