0

HTMLを取得した後にデータをロードしているある種のフラッシュプラグインを持つWebサイトをスクレイピングしようとしています。次のオブジェクトがページで受信されます

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="250" HEIGHT="20" id="Preloader"><PARAM NAME="movie" VALUE="/images/preloader.swf">
      <PARAM NAME="quality" VALUE="high">
      <PARAM NAME**strong text**="bgcolor" VALUE="#FFFFFF"><EMBED src="/images/preloader.swf" quality="high" bgcolor="#FFFFFF" WIDTH="250" HEIGHT="20" NAME="Preloader" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED></OBJECT>

Wireshark で受信しているデータを見つけようとしましたが、うまくいきませんでした。このフラッシュ プラグインまたはその仕組みに関する私の知識はゼロです。私はこれを行うことができないという最悪のシナリオを推測しています。

HttpWebRequest mainRequest = (HttpWebRequest)(WebRequest.Create(URL));
            mainRequest.Method = "GET";
            mainRequest.Proxy = null;
            WebResponse mainResponse = mainRequest.GetResponse();
            StreamReader dataReader = new StreamReader(mainResponse.GetResponseStream(), System.Text.Encoding.UTF8);
            string data = dataReader.ReadToEnd();
            dataReader.Close();
            mainResponse.Close();
            return data;

このデータを受信する方法、またはデータが受信される前にデータが html に注入されるのを Web 応答で待機させる方法を知っている人はいますか? どんな助けでも大歓迎です。

更新: フラッシュ オブジェクトで銃を少しジャンプさせたようです。これは、テーブルにデータが入力されている間の単なる読み込みアニメーションだと思います。私はフィドラーを使って何が起こっているのかを見てきました。ページは、読み込み中の div と内部に含まれる flash オブジェクトを含むリクエストの後に返されます。数秒後、データの準備が整うと、別のページがデータとともに返されます。私が覚えていることから(私は家にいないので、今は確認できません)、新しいページには元のページと同じリクエストヘッダーがあります。フィドラーにはjsonまたはajaxデータはありません。私が見ることができる更新を引き起こすスクリプトがクライアントにありません。これが更新される原因がわかりません。

Web ブラウザー オブジェクトを簡単に確認しましたが、約 200 ページをスクレイピングすると、現在 1 分ほどかかるため、これはかなりのパフォーマンス ヒットになると思います。後で amf ビューアーを試して、フラッシュ オブジェクトが更新元ではないことを確認します。

テーブルの準備ができたときに、サーバーがこのページを再送信していると推測しています。サーバーが読み込み中の div を見つけて、これをデータのテーブルに置き換えると、ページ全体が再送信されますか? または、これは ajax/json データに表示されませんか? サーバーがデータを再送信している場合、新しいページを送信する準備ができるまで応答を開いたままにしておくにはどうすればよいですか?

ありがとう。JM。

4

3 に答える 3

1

コンテンツが Flash ムービーに動的に読み込まれている場合は、標準の HTTP リクエストを介して行われている可能性が非常に高くなります。Wire Shark は、このようなものを検出するには少しやり過ぎかもしれません。Charles、HttpFox、screen-scraper など、HTTP をキャプチャするユーティリティを使用することをお勧めします。これらのツールのいずれかを使用して、コンテンツの読み込み中に発生する HTTP リクエストを監視します。それがどのリクエストであるかを判断したら、コードでそれを複製することができます。

とはいえ、Flash ムービーに読み込まれるデータがバイナリ プロトコルで行われるケースも見てきました (あまり一般的ではありませんが)。AMF は、多くの場合、これらの場合に使用されるプロトコルです。Charles プロキシはこのプロトコルを検出するため、この場合に使用するツールである可能性があります。少し前に、 AMF 経由で配信されるデータの抽出に関するブログ投稿を書きました。Java ライブラリを扱っていますが、.NET でも同等のものを見つけることができるかもしれません。

于 2013-06-12T21:19:19.593 に答える
0

HttpWebRequestFlash コンテンツが実行されていないため、プレーンでそれを行うことはできません。返される応答は単なる HTML です。実際に実行し、そのオブジェクトをロードし、コンテンツをプルダウンするには、ブラウザー (またはブラウザーに似たオブジェクト) が必要です。Javascript を実行するためのライブラリがあることは知っていますが、ブラウザの外部で Flash プラグインを実行できるものは知りません。

WebBrowserオブジェクトを使用したほうがよい場合があります。しかし、Flash コンテンツが実行されたとしても (正直なところ、実行されるかどうかはわかりません)、アクセスできない可能性があります。DOM を見て確認する必要があります。

于 2013-06-12T02:08:10.850 に答える