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

JavaScriptで動的に作成されるhtml部分の取得には、なにの言語が一番向いているでしょうか。
.NETのWebBrowserなどを使うのが一番なのでしょうか。

●質問者: maintour15
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● mjy
●50ポイント

言語でいうならば JavaScript だと思います。
PhantomJS などのツール、ライブラリが良さそうです。


maintour15さんのコメント
ご回答有り難うございます。 その後に数値を判別して別のソフトをクリックしたいのですが、PhantomJSでも可能でしょうか。

mjyさんのコメント
PhantomJS は内部的に Webkit 互換のブラウザを持っていて、それを操作したり、そこから情報を取ったりする物です。 他のソフトを操作するなら別のツールと組み合わせる必要があるでしょう。

2 ● lang_and_engine
●50ポイント

COMでIEを自動操作している限り,言語は問わないと思いますよ。
(InternetExplorer.ApplicationでCreateObjectする)

リッチUIのスクレイピングをしたい場合,ブラウザ上での再現性がものを言います。
ならば,ブラウザそのものを自動で動かせばよい。というわけです。

パケットをベースにした自動通信だと,UIの動的な再現がたいへんです。
その大変な作業はブラウザに肩代わりしてもらうのです。
スクレイピングする側は,HTMLからWebページを自力で再現しようと頑張る必要はなく,
あくまで再現済みのWebページを相手にすればよい。

自作プログラム内にブラウザコントロールを埋め込んで,
その窓の中でWebページを表示して・・・
という発想も,「Webページの再現を自力で行なわない」と言う点では
悪くはないのですが
ブラウザをちゃんと再現しきれないですよね。(複数ウィンドウなど)
自作プログラムでは,ブラウザコントロールの枠をはみ出るようなブラウザの挙動を再現できない,ということです。

自作プログラムで,ブラウザの機能を再現しようと頑張るのではなく,
はじめからブラウザを自動操作すればよい
という発想法を持つと作業が楽になりますね。


lang_and_engineさんのコメント
(補足) >(Webページ側で)出力されたものによっては,他のソフトをクリックしたい COMを使うならば言語は問わない,と先に述べましたが, たとえばUWSCを使うとしましょう。 CreateObjectでIEを立ち上げ,目的とするWebページを開きます。 DOM操作によって,Webページを操作します。 そののち「html部分の取得」をしたいならば,innerHTMLを取得して正規表現などで文字列判定すればよいですね。 ボタンの文言を取得したい,など特定のHTML部品の属性を調べたいのであれば,DOM操作によって取得できます。 ここまでで,Webページの情報を取得して,意味のある情報(判断を下すために必要な情報)を抽出し終わりました(Webスクレイピングの完了)。 この時点で,もうブラウザは不要ですから,UWSC側でIEはもう閉じてしまいます。 そこからはIEに関係のないコードを書きます。 クリックしたいソフトのウィンドウタイトルを指定して,getId関数などで,そのソフトを自動操作します。 マウスクリックがしたいのであればBTN関数,キーボード操作ならばKBD関数を呼びます。 このように,IEを自動操作した後で,別のソフトを自動操作すればよい というわけです。 上の例はUWSCでしたが,他の言語でも同様の処理内容にすればOKですね。

maintour15さんのコメント
ご回答有り難うございます。 UWSCは5年前から使っておりまして、簡易的なクローラー等は作っていたのですが、今回、どうもJavascriptが実行されなければフレーム内がレンダリングされないサイトで、フレーム内を取得することが出来ませんでした。 (自分より玄人の方でもUWSCでは無理かもと言いっていました。) そうなってしまいますと、Javascriptを実行させた後のHTMLを取得するには、何かしらの言語で取得し、それを比較的得意なUWSCで読み取り条件分岐するしかないかと思い奮闘しておりました。 フレーム内をJavascriptでレンダリングしている場合は、どうなのでしょうか。 また、そのレンダリングされたフレーム内で、とある箇所がとある時間にJavascriptで更新(数値発表)されます。 それを100ミリ秒毎に監視したいので、サーバ負担のかかるhttpアクセスではなくブラウザのHTMLを高速で読み込みを繰り返し、変化があればそれを取得、条件分岐で動作にしたいとおもうのですが、ご教授頂けますと幸いですm(__)m

lang_and_engineさんのコメント
どうもです。 >Javascriptが実行されなければフレーム内がレンダリングされない すみませんが,これは正確にはどういう意味でしょう・・・。 ページ側のコードなのか,ユーザ側の独自のコードなのか, ページ側で呼び出しているのか,ユーザ側で呼び出しているのか Webサイトの正規の機能のルートとして呼び出すのか,正規でない勝手な呼び出しなのか などによって何通りかに解釈できるのですが・・・ (1)ページ側のコードをページ側で呼び出す。 ページ側でonloadイベントなどで勝手に実行されるJavaScript。 (2)ページ側のコードを,ユーザ側で正規のルートで呼び出す。 ページ内のボタンを押した時のイベントなどで手動実行される,ページ側の正常な機能の挙動として想定されているJavaScript。 (3)ページ側のコードを,ユーザ側で非正規に呼び出す。 ページ内で正規のルートとして実行が想定されていないが,ページ側に含まれているJavaScriptコード。 例えばページ側に記載されている関数を,ユーザ側で独自の形式で呼び出したい。 (4)ユーザ側のコードをページ内で実行したい。 ページ側で想定されていない処理を,ユーザ側で考えて,勝手にページ上で実行したい。 例えば,昔はやった javascript:document.body.innerHTML=document.body.innerHTML.replace(/ー/g,'━━━(゚∀゚)━━━');focus(); のように,Webページ側でもともと想定されていないページ上の挙動を,ユーザ側で独自に考えて引き起こしたい。 >フレーム内をJavascriptでレンダリングしている レンダリングしているのは,Webページの正規の挙動でしょうか。(「レンダリングしている」のが誰なのか主語が知りたいです。オレオレJavaScriptをユーザ側で注入しているということでしょうか?) 正規の挙動で,しかもフレームがWebページと同一のドメインなのであれば, フレーム内にDOMアクセスすればよいのではないでしょうか。 >レンダリングされたフレーム内で、とある箇所がとある時間にJavascriptで更新(数値発表)されます。それを100ミリ秒毎に監視したい 100ミリ秒おきにフレーム内にDOMアクセスすればよいのでは。(負荷もかからずにすみます。)

maintour15さんのコメント
ご丁寧なご解説有り難うございます。 (1)ページ側のコードをページ側で呼び出す。 ページ側でonloadイベントなどで勝手に実行されるJavaScript。 になります。 フレームが数個あり、それらの中をjavascriptによって出力しているので、Javascriptを実行できないUWSCのinnerHTMLですと取得が出来ない状態でした。 (多く配布されている用をチェックスクリプトでも、フレームの中身だけ取得エラーとなっていました。)

maintour15さんのコメント
>100ミリ秒おきにフレーム内にDOMアクセスすればよいのでは。(負荷もかからずにすみます。) というのはUWSCのinnerHTMLでもOKでしょうか。 極力UWSCが有り難いのですが、必要であれば.NETなども簡易的なコードだけでも書いて取得したりしなければならないのかと持っております。

lang_and_engineさんのコメント
ありがとうございます。状況がなんとなくわかりました。 ずばり, 「JavaScriptでの,フレーム要素に対するDOM操作」 をよく調べれば解決するのでは? http://yakinikunotare.boo.jp/orebase/index.php?Javascript%2Fiframe%A4%CE%C3%E6%BF%C8%A4%F2%C1%E0%BA%EE%A4%B9%A4%EB フレーム要素.contentWindow.document.getElementById(フレーム内で取得したい要素) ↑こういったコードをすでに十分に活用なさっていますか? innerHTMLだと,こうやって親フレームからフレーム内の子要素をたどる,などの操作ができません。 >フレームが数個あり フレームとはFRAMESETでしょうか,それともIFRAMEでしょうか。 数個あるというのは,入れ子になっているのでしょうか(フレームの階層が深くなってゆく?) それとも同一の階層上で複数のフレームが存在するのでしょうか。 リッチUIのWebスクレイピングでは,innerHTMLを使ってはダメです。 なぜなら,innerHTMLは単なる文字列ですから, それ以上の内部のDOM構造をたどることができなくなってしまうからです。 文字列ではなく,構造のあるデータやオブジェクト(DOM構造)を相手にするとうまくいきます。

maintour15さんのコメント
ご解説有り難うございます。 アイフレームではなく、<frame というタグになります。 それでも頂いた情報で大丈夫そうでしたら、じっくり時間をかけて試してみたいのですが・・・ 何度も誠に恐れ入りますが、宜しくお願い致します。 <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>

maintour15さんのコメント
ちなみにページのURLの拡張子はjspです。

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

maintour15さんのコメント
すみません、やはり拡張子はJSPでした。 .contentWindow.document.getElementByIdでは取得できず、調べた所、JSPですとソースコードにはタグが出力されていてもDOMアクセスなどでは取得出来ない場合もあるようなQ&Aが出来てましたので、そういった可能性があるのかもしれませんね。。

lang_and_engineさんのコメント
これはWeb技術の,ものすごく初歩の知識なのですが,, ブラウザで見れている場合,拡張子は関係がないのです。 jsp, php, asp, その他どんな拡張子であっても, 画面に見えているのがHTMLであれば,全部同じです。 UWSCなどのツールからgetElementByIdする場合も, それらは全部,単なるHTMLとして扱われます。(.htmlを相手にするのと同じ) DOMアクセスで取得できないのは,DOMではない場合。 つまりHTMLタグではない場合です。 HTMLに埋め込まれたFlashとか,Javaアプレットなどが該当します。 Flashやアプレットは,HTMLタグで作られていません。なのでDOMアクセスできないのです。 逆に,HTMLタグで作られているものは,DOMですべて同じように扱えるんですよ。

maintour15さんのコメント
ご解説有り難うございます。 情報が足りるか自信が無いのですが、下記はDOMでは無いのでしょうか。 また、もう連絡が取れない方が簡易ブラウザを作って取得してくれた例もあったのですが、Javaアプレットなどの場合はUWSCではなく、そういった簡易ブラウザで取得するしかありませんでしょうか。 またその場合、httpアクセスで都度負担を掛けなくてもソースコード監視する事は可能なのでしょうか。 長々と恐れ入ります。。 会員制なのでソースコードは下記にご用意させて頂きました。 JSはこちらへアップ致しました。 【utils-003.js】http://pastie.org/9973588 【check_ajax_mode.jsp】http://pastie.org/9973595 【ges_data-001.js】http://pastie.org/9973602 ▼親ページ(対象ページ) ------------------------------------------------------------------------------ <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script> function getRedirectTargetPath(){ var path = "ges.jsp?ric=USEHSP=ECI,0,0&ServerName=&debug=false"; return path; } </script> </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> ------------------------------------------------------------------------------ ▼フレーム内ページ(<frame name="f1" id="f1" src="common/check_ajax_mode.jsp"> 内) ------------------------------------------------------------------------------ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link href="css/main-004.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="js/utils-003.js"></script> <script type="text/javascript" src="js/ges-007.js"></script> </head> <script> function closeWindow(){ try{ top.close(); }catch(e){} try{ window.close(); }catch(e2){} } </script> <body onunload="disconnectAJAX();" onload="loadJSPParamToJS('USEHS=ECI,USEHSP=ECI',2,'2B14BB1CD77D2883F5D74CFF8F1334F7A36C911151892005A26DB07A75F3109A382F75FF4F13E21757299F3E2E13446457EE35F3E866795F291133CE2BF8C3C91AE1899855BB2AB2CA052BBFFCCFE180','0','false','p0','false','0,0');init();"> <bgsound id="soundfiles"> <div id="bodyContainer"> <div id="container"> <table width="100%" border="0" cellspacing="0" cellpadding="0" id="tbl1"> <tr> <th width="6%" class="text_center">音</th> <th width="6%" class="text_center">国</th> <th width="12%">日付JST</th> <th width="31%">指標名</th> <th width="6%" class="text_center">期間</th> <th width="17%" style="text-align:right">発表数値</th> <th width="11%" style="text-align:right">調査予想</th> <th width="11%" style="text-align:right">前回</th> </tr> <tr > <td class="text_center"><img name='soundImage1' id='soundImage1' src="img/off.gif" title="off" width="34" height="16" /></td> <td class="text_center"><img src="img/country/us.gif" title="米国" width="22" height="15" /></td> <td class="" name='dt1' id='dt1'>--</td> <td><span class="big_show" name='name1' id='name1' >中古住宅販売戸数</span></td> <td class="text_center" name='pe1' id='pe1' >--</td> <td align="right"><span class="" name='av1' id='av1'>--</span></td> <td align="right" class="" name='sv1' id='sv1'>--</td> <td align="right" class="" name='pr1' id='pr1'>--</td> </tr> </table> </div> </div> <span id="iframeSpan" name="frameSpan"></span> <script> var titleStr = "<h1>本日のリアルタイム</h1>"; try{ document.getElementById("dateSpan").innerHTML = titleStr; }catch(e){} var ua = navigator.userAgent.toLowerCase(); if(ua.indexOf("msie") == -1 ){ document.getElementById("iframeSpan").innerHTML = "<iframe id=\"playSoundFrame\" name=\"playSoundFrame\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\" width=\"1\" height=\"1\" scrolling=\"no\" src=\"playSound.jsp\"></iframe>"; } </script> </body> </html> ------------------------------------------------------------------------------ ▼フレーム内ページ(<frame name="f2" id="f2" src="blank.jsp"> 内) ------------------------------------------------------------------------------ <head><script type="text/javascript" src="js/ges_data-001.js"></script> <script>loadRic();</script></head> ------------------------------------------------------------------------------

質問者から

その出力されたものによっては他のソフトをクリックしたいので、ブラウザ処理のJavascriptじゃないほうが良いのではと思うのですが、いかがでしょうか。


関連質問

●質問をもっと探す●



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