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

.NETのWebBrowserなどを使うのが一番なのでしょうか。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2015/02/22 03:19:10
  • 終了:2015/03/01 03:20:04

回答(2件)

id:mjy No.1

mjy回答回数67ベストアンサー獲得回数202015/02/22 07:10:14

ポイント50pt

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

id:iori753

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

2015/02/22 12:45:48
id:mjy

PhantomJS は内部的に Webkit 互換のブラウザを持っていて、それを操作したり、そこから情報を取ったりする物です。

他のソフトを操作するなら別のツールと組み合わせる必要があるでしょう。

2015/02/22 12:55:12
id:language_and_engineering No.2

lang_and_engine回答回数170ベストアンサー獲得回数632015/02/22 12:28:34

ポイント50pt

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

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

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

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

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

他10件のコメントを見る
id:language_and_engineering

これはWeb技術の,ものすごく初歩の知識なのですが,,

ブラウザで見れている場合,拡張子は関係がないのです。
jsp, php, asp, その他どんな拡張子であっても,
画面に見えているのがHTMLであれば,全部同じです。

UWSCなどのツールからgetElementByIdする場合も,
それらは全部,単なるHTMLとして扱われます。(.htmlを相手にするのと同じ)

DOMアクセスで取得できないのは,DOMではない場合。
つまりHTMLタグではない場合です。
HTMLに埋め込まれたFlashとか,Javaアプレットなどが該当します。

Flashやアプレットは,HTMLタグで作られていません。なのでDOMアクセスできないのです。
逆に,HTMLタグで作られているものは,DOMですべて同じように扱えるんですよ。

2015/02/23 12:41:31
id:iori753

ご解説有り難うございます。
情報が足りるか自信が無いのですが、下記は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>




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"> 内)
------------------------------------------------------------------------------

<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>
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">







日付JST
指標名
期間
発表数値
調査予想
前回




--
中古住宅販売戸数
--
--
--
--





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>
------------------------------------------------------------------------------ 2015/02/23 13:08:21
id:iori753

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

  • id:TransFreeBSD
    質問だけで言えばjavascriptが最適だが、別アプリを操作することが出来ない。
    となるとjavascript+αで、javascriptでブラウザの状態を変化(例えばタイトルを変えるとか)させてそれを監視する別ソフト(UWSC)を使うとか。
    PhantomJSだと外部プログラムを起動は出来るので、それが他のソフトをクリックするとか。
    組み合わせた方が簡単になることもあります。

    UWSCはよく分かりませんけど、下記の様には書かれています。
    http://www.uwsc.info/faq.html#n37
    どうなんでしょうか。

    また、別解として、その表示されている内容の元データがajaxのように通信で得られているなら、直接サーバと通信した方が早いかもしれません。
    これは二通りのやり方があって、proxyなどで通信内容を記録して、それを真似る方法と、
    実行されているjavascriptを解析して、それを真似る方法です。
    こういうのはLL系の言語が向いていたりします。

    ただ、こういったリバースエンジニアリング系の事は、結局アドホックなので、王道ってものは存在せず、
    結局は勘と経験と手数じゃないかと思います(解析手法、ツール、実装言語、環境含め)。
  • id:iori753
    有り難うございます。
    確かに下記にはセキュリティ上操作できないと書いてありますね。
    恐らくそれが原因の可能性があります。平日にしかテスト出来ないので、明日以降試してみようと思います。
    http://www.uwsc.info/faq.html#n37
    Javascriptでタイトル変えという手法は思いつかなかったです。。有り難うございます!
  • id:syamaoka
    最終的にやりたいことを余さずすべて書いた方が適切な回答が得られると思います。すでにそうなりかけていますが、情報を小出しにすると何度も質問することになり、その度に前提条件の説明をする必要が発生します。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません