とあるWEBサイトにて、スクレイピングをしたいと思っています。


ログインして色々な数値をPOSTしてセッション等も維持されないと表示されないページで、尚且つSSLで、尚且つ新規ウィンドウがポップアップして表示されるページがあります。
尚そのページにはフレームが入っており、Javascriptでフレーム内がレンダリングされるようになっています。

PHP,Mysql,UWSC言語等はわかるのですが、Javascriptで処理された後の文字列はPHPなどよりブラウザ関連で処理されるものなのでJava等が向いているのかと思います。

Microsoft .NET Framework 4.5を利用してEXE形式の自作簡易ソフトで取得していた方もいたのですが、その際は簡易ブラウザ的なものを使用し、該当ページまでは手動で進み、あとはボタンを押すとそのページでレンダリングされた、フレーム内含むソースが取得出来ていました。

あまり詳しくないのですが、例文等頂ければ参考にしてトライしていきたいと思っていますので、極力そのまま使えるくらい具体的な方法を教えて頂けますと幸いです。

宜しくお願い致します。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2015/02/23 11:46:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gizmo5 No.2

回答回数504ベストアンサー獲得回数141

ポイント166pt

javascript で可能だと思います。
フレームの内容が分かりませんので、仮にフレーム内にある id が data という要素の内容が変化したときに表示を行うようなスクリプトになっています。
表示されている内容を監視しているだけですのでサーバには負荷をかけません。
ブックマークレットでも Greasemonkey でも実行可能です。

(function () {

  // ウィンドウの右上に値を表示する
  function display_data(v) {
    var output_area = document.getElementById("output");
    if (! output_area) {
      output_area = document.createElement("div");
      output_area.id = "output";
      output_area.style.padding = "1ex";
      output_area.style.backgroundColor = "#eeffee";
      output_area.style.border = "2px solid green";
      output_area.style.position = "absolute";
      output_area.style.top = 0;
      output_area.style.right = 0;
      document.documentElement.appendChild(output_area);
    }
    e.innerHTML = v;
  }

  // フレーム id="f1" の中にある id="data" のエレメントを監視する
  var watch_function = (function() {
        var before_value;
        return function watch_data() {
          var f1_frame = document.getElementById("f1");
          var f1_window = f1_frame.contentWindow;
          var target_element = f1_window.document.getElementById("data");
          var value = target_element.innerHTML;
          // 値が前回と異なっていた場合に処理をする
          if (before_value != value) {
            display_data(value);
            console.log(value);
            before_value = value;
          }
        }
      })();

  // 1秒間隔で監視開始
  setInterval(watch_function, 1000);

})();
他10件のコメントを見る
id:iori753

その後、特定の、ブラウザ以外のソフトウエアのボタンをクリックしたい形なので、Javascript以外のもので読み取る必要があるのです。
ヴィジュアルスタジオのコミュニティという無料版が出ていたので、言語を覚えながら.NETで試すのが一番早いのかなと思ったのですが、いかがでしょうか。

(ご質問ばかりで恐れ入ります)

2015/02/22 11:04:18
id:gizmo5

早いかどうかは個人のスキルによるところが多いと思います。

特定の、ブラウザ以外のソフトウエアのボタンをクリックしたい

という処理を.NET系で処理する方法をご存じであれば、.NETで構わないと思います。
個人で利用するプログラムだと思いますので、好き嫌いで選ぶので十分だと思いますが。

2015/02/22 13:07:25

その他の回答2件)

id:syamaoka No.1

回答回数21ベストアンサー獲得回数9

ポイント168pt

Selenium でブラウザ操作を自動化する、キーボードやマウスの操作をマクロとして保存できるブラウザ拡張などでは駄目なのでしょうか…?
なお、以下についての情報がなければ誰も具体的なコードは書けないと思います。

* 「とあるサイト」のURL
* スクレイプしたい対象のデータ(ページの HTML すべてなのか、特定の DOM なのかなど)

他4件のコメントを見る
id:syamaoka

蛇足になりますが、web サイトへのログイン処理とページ遷移時のログインセッションの維持は自動化できないと思い込まれておられるように見受けられますが、そこまで含めて自動化可能です。私ならすべて自動化します。

2015/02/21 16:23:55
id:iori753

有り難うございます。
数値はAjaxで更新されるのですが、
50ミリ秒毎などに数値を見張りたい場合、httpアクセスですとサーバに負荷をかけるためモラル的にNGだと思うのですが、下記のソフトのようにレンダリングされているテキストを見張る事はGreasemonkeyでも可能でしょうか。
http://mt-soft.sakura.ne.jp/web_dl/dev_tool/gettext/index.htm

2015/02/21 17:13:31
id:iori753

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script></p> <p> function getRedirectTargetPath(){</p> <p> var path = "ges.jsp?ric=JPIP4=ECI,0,0;TRUNR=ECI,0,0;EUTBAL=ECI,0,0&ServerName=&debug=false";</p> <p> return path;</p> <p> } </p> <p> </script>

<title>FX外為どっとコム</title>

</head>

<frameset cols = "100%,0%" border="0">

<frame name="f1" id="f1" src="common/check_ajax_mode.jsp" />

<frame name="f2" id="f2" src="blank.jsp" />

</frameset>

</html>

証券の口座を作らなければアクセス出来ないのでURLをお伝えしてもセッションなどが無ければアクセス出来ないのですが、こういったソースコードのサイトです。

id:gizmo5 No.2

回答回数504ベストアンサー獲得回数141ここでベストアンサー

ポイント166pt

javascript で可能だと思います。
フレームの内容が分かりませんので、仮にフレーム内にある id が data という要素の内容が変化したときに表示を行うようなスクリプトになっています。
表示されている内容を監視しているだけですのでサーバには負荷をかけません。
ブックマークレットでも Greasemonkey でも実行可能です。

(function () {

  // ウィンドウの右上に値を表示する
  function display_data(v) {
    var output_area = document.getElementById("output");
    if (! output_area) {
      output_area = document.createElement("div");
      output_area.id = "output";
      output_area.style.padding = "1ex";
      output_area.style.backgroundColor = "#eeffee";
      output_area.style.border = "2px solid green";
      output_area.style.position = "absolute";
      output_area.style.top = 0;
      output_area.style.right = 0;
      document.documentElement.appendChild(output_area);
    }
    e.innerHTML = v;
  }

  // フレーム id="f1" の中にある id="data" のエレメントを監視する
  var watch_function = (function() {
        var before_value;
        return function watch_data() {
          var f1_frame = document.getElementById("f1");
          var f1_window = f1_frame.contentWindow;
          var target_element = f1_window.document.getElementById("data");
          var value = target_element.innerHTML;
          // 値が前回と異なっていた場合に処理をする
          if (before_value != value) {
            display_data(value);
            console.log(value);
            before_value = value;
          }
        }
      })();

  // 1秒間隔で監視開始
  setInterval(watch_function, 1000);

})();
他10件のコメントを見る
id:iori753

その後、特定の、ブラウザ以外のソフトウエアのボタンをクリックしたい形なので、Javascript以外のもので読み取る必要があるのです。
ヴィジュアルスタジオのコミュニティという無料版が出ていたので、言語を覚えながら.NETで試すのが一番早いのかなと思ったのですが、いかがでしょうか。

(ご質問ばかりで恐れ入ります)

2015/02/22 11:04:18
id:gizmo5

早いかどうかは個人のスキルによるところが多いと思います。

特定の、ブラウザ以外のソフトウエアのボタンをクリックしたい

という処理を.NET系で処理する方法をご存じであれば、.NETで構わないと思います。
個人で利用するプログラムだと思いますので、好き嫌いで選ぶので十分だと思いますが。

2015/02/22 13:07:25
id:blue_star22 No.3

回答回数297ベストアンサー獲得回数12

ポイント166pt

スクレイピングに便利なM.trader「HTML解析ソフト

http://wasuke.shioya.jp.net/?p=1044

id:iori753

有り難うございます。
AutBrowser系ですね。
UWSCでの要素吐き出しスクリプトも使ったのですが、フレーム内がエラーで取得できないんですよね。
おそらくJavascriptでフレーム内をレンダリングしているからだとおもうのですが、システムでフレーム内も吐き出した後を取得suru方法はあるのでしょうかね。

2015/02/22 01:29:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません