DOBON.NET DOBON.NETプログラミング掲示板過去ログ

JavaScriptで作成されるhtml部分の取得

環境/言語:[C# .NET Framework 2.0]
分類:[ASP.NET]

はじめて投稿させてもらいます。とっとことみんと言います。

html内のJavaScriptコードおよびjsファイルの実行結果を取得したいと考えています。
最初JScript.NETを使おうとしたのですが、html内のJavaScriptに対応していないとのことです。

いろいろ調べているとIEを呼び出して?(このあたりが不明なのですが)JavaScript部分を実行させ、html文を取得する方法があるといううわさを聞きました。これって実現可能でしょうか?

System.Window.WebBrowserを使ってブラウザもどきを作り、JavaScript実行後のhtmlソースを取得することは可能でしょうか?
■No18468に返信(とっとことみんさんの記事)
> System.Window.WebBrowserを使ってブラウザもどきを作り、

そんなクラスおよび、名前空間ってありましたっけ?

> JavaScript実行後のhtmlソースを取得することは可能でしょうか?

innerHTMLあたりのことでしょうか?
はいこーんさん。
ご回答ありがとうございます。

> そんなクラスおよび、名前空間ってありましたっけ?

はい。.NET Framework 2.0から追加されまようです。

> innerHTMLあたりのことでしょうか?
innerHTMLは指定したタグ内のHTML文書を取得することができるものです。
私が言いたかったのは<JavaScript>タグ内のJavaScript(Htmlファイルに直接記述
もしくはソースファイルが別ファイルでリンクされている)が実行されることで
動的に作成されるHTML文書(例えばGoogle Adsenseのような広告など)を取得する
方法を探しています。

>>そんなクラスおよび、名前空間ってありましたっけ?
> はい。.NET Framework 2.0から追加されまようです。

名前は正しく。ってことです。ひょっとしたら(回答者の知らない)何か別のものを指しているのかも知れないから。

>>innerHTMLあたりのことでしょうか?
> innerHTMLは指定したタグ内のHTML文書を取得することができるものです。
正しくは、その要素以下の解析後の HTML DOM ツリーを、整形した HTML の形で取得するプロパティです。
「解析後」です。
Hongliangさん。ご回答ありがとうございます。

> >>そんなクラスおよび、名前空間ってありましたっけ?
>>はい。.NET Framework 2.0から追加されまようです。
>
> 名前は正しく。ってことです。ひょっとしたら(回答者の知らない)何か別のものを指しているのかも知れないから。

すいません。
正しくはSystem.Windows.Formsの中のWebBrowserクラスですね。

> >>innerHTMLあたりのことでしょうか?
>>innerHTMLは指定したタグ内のHTML文書を取得することができるものです。
> 正しくは、その要素以下の解析後の HTML DOM ツリーを、整形した HTML の形で取得するプロパティです。
> 「解析後」です。

静的なHTML文に対しては解析後といえますが、JavaScript部分はJavaScriptのまま
なので、いずれにしても私が求めているものとは異なります。
あくまでJavaScriptが実行されて生成されるHTML部分を収集するのが目的です。
ひょっとして script 要素を新しい要素に置き換えるものであるとか考えてませんか?
body 要素の InnerHtml を Google Adsense を利用しているページで取得してみてください。ちゃんと広告表示に必要な要素が追加されていますから。
■No18481に返信(とっとことみんさんの記事)
> 静的なHTML文に対しては解析後といえますが、JavaScript部分はJavaScriptのまま
> なので、いずれにしても私が求めているものとは異なります。
> あくまでJavaScriptが実行されて生成されるHTML部分を収集するのが目的です。

あのー、試してから投稿した方がいいんじゃないかな。

と純粋に思います。

何だかムダなやりとりをしている感に襲われちゃいます。
Hongliangさん、はいこーんさん

ご回答ありがとうございます。

> あのー、試してから投稿した方がいいんじゃないかな。
>

試しに確認しましたが、確かにとることができました。
自分の知識不足で恥ずかしい限りです。

あといくつかお尋ねしたい点があります。
1.httpWebRequestクラスも同様にWebアクセスが可能かと思うのですが、これはブラウザの
ソース表示部分のところのみしか抽出できないという認識で間違えないでしょうか?
もしくはWebBrowserのようにJavaScriptの実行後部分も取得可能でしょうか?

2.httpWebRequeestで取得したhtmlをWebBrowserで読み込むまではうまくいきましたが、
この場合やはりJavaScriptの部分を実行させるのは不可能でしょうか?
WebBrowser.Document.InvokeScriptを使えばスクリプトの関数部分は動作するように
思えますが、全体を実行させるのは不可能でしょうか?

これらを聞いている理由はクローラを現在作成しているのですが、User-Agent設定や
Proxy設定、認証などがWebBrowserでできないように思えたため、一度httpWebRequest
でアクセスしてからWebBrowserに取り込んで、JavaScript実行部分を取得するように
考えているためです。
もっともWebBrowserでUser-Agentなどの設定が可能ならばこのような複雑なことを
しなくてもいいのですが。WebBrowserでUser-Agentなどを設定することは可能なの
でしょうか?
こんにちは

■No18468に返信(とっとことみんさんの記事)
> いろいろ調べているとIEを呼び出して?(このあたりが不明なのですが)JavaScript部分を実行させ、html文を取得する方法があるといううわさを聞きました。これって実現可能でしょうか?

はい、可能です。.NET Framework 1.1で同様のアプリを作ってるので参考までにその部分のソースを抜粋してみました。

例えば、<div id="hoge">〜</div>の中身は、Document3.getElementById("hoge").innerHTMLで参照できます。ただ、Ajaxなページのクローリングは以下の点に注意が必要です。
 ・Ajaxでページが更新されても DownloadCompleteイベントが発生しない
 ・レンダリングが完了しない時点で innerHTMLを参照すると例外が発生する
 ・都度レンダリングするため遅い
 ・CPUに負荷がかかる

また、No18506に「JavaScriptの実行後部分も取得可能か?」という質問がありましたが、「誰が」そのスクリプトを実行して HTMLにするのかを考えると答えが見えてくると思います。

  Private WithEvents MyBrowser As SHDocVw.WebBrowser
  Public Document3 As IHTMLDocument3

  Private Sub initializeBrowser()
    MyBrowser = CreateObject("InternetExplorer.Application")
  End Sub

  Public Sub openUrl(ByVal Url As String)
    BusyBrowser = True
    MyBrowser.Navigate(Url)
  End Sub

  Public Function execJScript(ByVal sScript As String) As Boolean
    Document3.parentWindow.execScript(sScript, "JavaScript")
  End Function

  Private Sub MyBrowser_DownloadComplete1() Handles MyBrowser.DownloadComplete
    If MyBrowser.ReadyState = SHDocVw.tagREADYSTATE.READYSTATE_INTERACTIVE OrElse MyBrowser.ReadyState = SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE Then
      If setHTMLDocument3() Then
        BusyBrowser = False
      End If
    End If
  End Sub

  Public Function setHTMLDocument3() As Boolean
    Document3 = CType(MyBrowser.Document, IHTMLDocument3)
    setHTMLDocument3 = Not (Document3 Is Nothing)
  End Function
>まんぼ りょういち さん

丁寧な解説ありがとうございます。
とても参考になります。

当初の目的は十分に達成できましたので、解決済みとします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板