AJAX ページをスクレイピングする方法を教えてください。
10 に答える
概要:
すべてのスクリーン スクレイピングでは、最初に、リソースを抽出するページを手動で確認する必要があります。AJAX を扱うときは、通常、単に HTML を分析するだけでは不十分です。
AJAX を扱う場合、これは、要求した最初の HTML ドキュメントに必要な値が含まれていないことを意味しますが、必要な追加情報をサーバーに要求する JavaScript が実行されます。
したがって、通常は単純に JavaScript を分析して、JavaScript が行うリクエストを確認し、最初からこの URL を呼び出すだけで済みます。
例:
これを例として、スクレイピングしたいページに次のスクリプトがあると仮定します。
<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Your browser does not support AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
document.myForm.time.value=xmlHttp.responseText;
}
}
xmlHttp.open("GET","time.asp",true);
xmlHttp.send(null);
}
</script>
次に、代わりに同じサーバーの time.asp に対して HTTP 要求を実行するだけです。 w3schools の例。
C++ による高度なスクレイピング:
複雑な使用法や、C++ を使用している場合は、Firefox の JavaScript エンジンSpiderMonkeyを使用してページ上で JavaScript を実行することも検討できます。
Java による高度なスクレイピング:
複雑な使用法で、Java を使用している場合は、Java Rhino用の firefox javascript エンジンの使用を検討することもできます。
.NET による高度なスクレイピング:
複雑な使用法で、.Net を使用している場合は、Microsoft.vsa アセンブリの使用も検討できます。最近、ICodeCompiler/CodeDOM に置き換えられました。
理解できる場合は、DOM ツリーを調べてみてください。Seleniumは、ページのテストの一環としてこれを行います。ボタンをクリックしてリンクをたどる機能もあり、便利かもしれません。
ajax ページに依存します。スクリーンスクレイピングの最初の部分は、ページがどのように機能するかを決定することです。ページからすべてのデータを要求するために繰り返し処理できる変数はありますか? 個人的には、多くのスクリーンスクレイピング関連のタスクにWeb Scraper Plusを使用しました。これは、安価で、始めるのが難しくなく、プログラマーでなくても比較的すぐに機能するようになるためです。
補足: 利用規約はおそらく、これを行う前に確認したい場所です。サイトによっては、すべてを反復すると、いくつかのフラグが発生する場合があります。
ソースコードが読みやすい場合、Brian R. Bondyの回答が役立つと思います。Wireshark や HttpAnalyzer などのツールを使用してパケットをキャプチャし、「ホスト」フィールドと「GET」フィールドから URL を取得する簡単な方法を好みます。
たとえば、次のようなパケットをキャプチャします。
GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330
HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive
次に、URL は次のとおりです。
http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330
低コストのソリューションとして、SWExplorerAutomation (SWEA) を試すこともできます。このプログラムは、HTML、DHTML、または AJAX で開発された Web アプリケーション用のオートメーション API を作成します。
私は以前、Ajaxページを削り取るための答えとして、MITの溶媒とEnvJSにリンクしました。これらのプロジェクトにはアクセスできなくなったようです。
どうしても必要なことから、私は実際にAjaxページを削り取る別の方法を発明しました。これは、ヘッドレスjavascriptエンジンを検索し、データを表示しないメソッドを持つfindthecompanyのような厳しいサイトで機能しました。
テクニックは、クロム拡張機能を使用してスクレイピングを行うことです。Chrome拡張機能は、JavaScriptで変更されたDOMに実際にアクセスできるため、Ajaxページを削除するのに最適な場所です。テクニックは次のとおりです。いつかコードをオープンソース化する予定です。Chrome拡張機能を作成します(Chrome拡張機能の作成方法と、そのアーキテクチャと機能を知っていることを前提としています。サンプルがたくさんあるので、これは簡単に習得して練習できます)、
- xpathを使用して、コンテンツスクリプトを使用してDOMにアクセスします。リストまたはテーブル全体、またはxpathを使用して動的にレンダリングされたコンテンツを文字列HTMLノードとして変数に取得します。(コンテンツスクリプトのみがDOMにアクセスできますが、XMLHTTPを使用してURLに接続することはできません)
- コンテンツスクリプトから、メッセージパッシングを使用して、削除されたDOM全体を文字列としてバックグラウンドスクリプトにメッセージ送信します。(バックグラウンドスクリプトはURLと通信できますが、DOMにアクセスすることはできません)。メッセージパッシングを使用して、これらを話させます。
- さまざまなイベントを使用してWebページをループし、削除された各HTMLノードコンテンツをバックグラウンドスクリプトに渡すことができます。
- 次に、バックグラウンドスクリプトを使用して、Nodejs / pythonを使用して作成された単純な外部サーバー(ローカルホスト上)と通信します。HTMLノード全体を文字列としてサーバーに送信するだけです。サーバーは、ページ番号またはURLを識別するための適切な変数を使用して、投稿されたコンテンツをファイルに保持します。
- これでAJAXコンテンツ(文字列としてのHTMLノード)をスクレイピングしましたが、これらは部分的なhtmlノードです。これで、お気に入りのXPATHライブラリを使用してこれらをメモリにロードし、XPATHを使用して情報をテーブルまたはテキストにスクレイプできます。
あなたが理解できないならコメントしてください、そして私はそれをよりよく書くことができます。( 最初の試み )。また、サンプルコードをできるだけ早くリリースしようとしています。