人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

宜しくお願い致します。

●質問者: maintour15
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● syamaoka
●168ポイント

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

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


maintour15さんのコメント
特定の要素のみです。 一旦ログインし、そのままマウス操作でページ遷移していかなければ辿り着かず、直接URLを叩いても表示されない仕組みになっていますので、ログイン、その後の取得したいページまでの遷移は手動で行い、そこで何かしらの実行ボタンなどを押すことで監視開始、変化があれば何かしらの処理がしたいのです。

maintour15さんのコメント
http://mt-soft.sakura.ne.jp/web_dl/dev_tool/gettext/index.htm ちなみに上記のスクリプトでマウスをフレーム内の文字の上に持って行くと、取得は出来ました。

maintour15さんのコメント
ですので何かしらの方法でフレーム内の文字を取得することは可能だと思うのですが、上記の「マウスポインタが停止したらその下の文字を取得」を少し変えて、 特定の(アクティブなブラウザのでもOK)ブラウザの特定の要素を取得する という事がしたいのです。

syamaokaさんのコメント
簡単にできそうならコードまで書いて差し上げようかと考えていましたが、証券口座が必要となると手間がかかりそうなので、私は具体的なコードの提示は致しません。悪しからず。 さて、ご所望の要件を満たすためには、Firefox の Greasemonkey というブラウザ拡張で JavaScript を書くだけで良さそうだと私は判断しました。おそらく Chrome や Safari でも同様の仕組みで実現できそうです。

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

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

質問者から

<head>




function getRedirectTargetPath(){ var path = "ges.jsp?ric=JPIP4=ECI,0,0;TRUNR=ECI,0,0;EUTBAL=ECI,0,0&ServerName=&debug=false"; return path; } </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をお伝えしてもセッションなどが無ければアクセス出来ないのですが、こういったソースコードのサイトです。
2 ● gizmo5
●166ポイント ベストアンサー

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);

})();

maintour15さんのコメント
有り難うございます。 頂いたスクリプトをGreasemonkeyにいれてみたのですが、動作テストとして下記サイトで idSS というIDが毎秒変わるようでしたので、dataの箇所にidSSをセットしてみたのですが、何も表示しなかったのですが、間違っていましたら教えて頂けますと幸いです。m(__)m http://www.wind.sannet.ne.jp/alfix/javascript/etc/3.html

maintour15さんのコメント
失礼しました、Frame内でしたね。

maintour15さんのコメント
http://www.wind.sannet.ne.jp/alfix/javascript/etc/3.html 上記サイトでの練習様に、該当箇所を下記のように変更させて頂いたのですが、何も変化が怒らないのですが、Greasemonkeyで動きますでしょうか。 //var target_element = f1_window.document.getElementById('idSS'); var target_element = document.getElementById('idSS');

gizmo5さんのコメント
>> 上記サイトでの練習様に、該当箇所を下記のように変更させて頂いたのですが、何も変化が怒らないのですが、Greasemonkeyで動きますでしょうか。 //var target_element = f1_window.document.getElementById('idSS'); var target_element = document.getElementById('idSS'); << f1_window というところがフレームを指定しているところなので、以下のようにした方が良いと思います。 >|| //var target_element = f1_window.document.getElementById('idSS'); //var target_element = document.getElementById('idSS'); var target_element = f1_window.document.getElementById('idSS'); ||<

gizmo5さんのコメント
すみません。練習用のサイトの場合をコメントされたのですね。 練習用のサイトはフレームの中にある要素が変化しているわけではないので、違った感じになると思いますが。 それとも練習用のサイトのコードをフレームの中で動かしているのでしょうか。

maintour15さんのコメント
有り難うございます。 http://www.wind.sannet.ne.jp/alfix/javascript/etc/3.html このサイトの場合はフレームがありませんので、f1_window.を省いた下記の方が宜しいでしょうか。 //var target_element = f1_window.document.getElementById('idSS'); //var target_element = document.getElementById('idSS'); var target_element = document.getElementById('idSS');

gizmo5さんのコメント
私が書いたコードだと変更した箇所よりも前にスクリプトエラーが出て止まってしまうので、それより前の部分もコメントにした方が良いです。 >|| 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 target_element = document.getElementById("idSS"); var value = target_element.innerHTML; // 値が前回と異なっていた場合に処理をする if (before_value != value) { display_data(value); console.log(value); before_value = value; } } })(); ||<

maintour15さんのコメント
有り難うございます、動きました。 あとはUWSCというCOM操作系で、Javascript実行後のHTMLを取得する方法を調べてみます。

maintour15さんのコメント
ちなみにJavascriptで動的に生成されたHTMLを取得したい場合は、 http://dobon.net/vb/bbs/log3-31/18468.html 上記なども拝見して参考にしますと.NETが一番向いているのでしょうか。 なにかオススメの言語がありましたら教えて頂けますと幸いです。

gizmo5さんのコメント
HTMLを一番手軽に扱えるのはjavascriptだと思いますが、その後にやりたいことが何かによると思います。 例えば取得したデータをDBに保存する場合にはjavascriptではどうにもなりません。 C#のような.NET系を使うか、RubyのようにNokogiriが使える言語を使うのが一般的ではないかと思います。

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

gizmo5さんのコメント
早いかどうかは個人のスキルによるところが多いと思います。 >> 特定の、ブラウザ以外のソフトウエアのボタンをクリックしたい << という処理を.NET系で処理する方法をご存じであれば、.NETで構わないと思います。 個人で利用するプログラムだと思いますので、好き嫌いで選ぶので十分だと思いますが。

3 ● blue_star22
●166ポイント

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

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


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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ