AJAX ページをどのようにスクレイピングしますか?
-
06-07-2019 - |
質問
AJAX ページをスクレイピングする方法を教えてください。
解決
概要:
すべての画面スクレイピングでは、最初にリソースを抽出するページの手動レビューが必要です。 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用のfirefox JavaScriptエンジンの使用も検討できます Rhino
.NETによる高度なスクレイピング:
複雑な使用法の場合、および.Netを使用している場合は、Microsoft.vsaアセンブリの使用も検討できます。最近ICodeCompiler / CodeDOMに置き換えられました。
他のヒント
私の意見では、最も簡単な解決策は、 Casperjs を使用することです。これは、WebKitヘッドレスブラウザーphantomjsに基づくフレームワークです。
ページ全体がロードされ、ajax関連のデータを非常に簡単にスクレイピングします。 この基本チュートリアルを確認して、自動化&amp; PhantomJSとCasperJSによるスクレイピング
また、このサンプルコードを見て、Googleが提案するキーワードをこすり落とす方法について説明することもできます。
/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var word = casper.cli.get(0);
if (!word) {
casper.echo('please provide a word').exit(1);
}
casper.start('http://www.google.com/', function() {
this.sendKeys('input[name=q]', word);
});
casper.waitFor(function() {
return this.fetchText('.gsq_a table span').indexOf(word) === 0
}, function() {
suggestions = this.evaluate(function() {
var nodes = document.querySelectorAll('.gsq_a table span');
return [].map.call(nodes, function(node){
return node.textContent;
});
});
});
casper.run(function() {
this.echo(suggestions.join('\n')).exit();
});
理解できたら、DOMツリーを調べてみてください。 Selenium は、ページのテストの一環としてこれを行います。また、ボタンをクリックしてリンクをたどる機能もあり、便利かもしれません。
Ajax を使用して Web ページをスクレイピングする、または Javascript を使用して一般的なページをスクレイピングする最良の方法は、ブラウザ自体またはヘッドレス ブラウザ (GUI のないブラウザ) を使用することです。現在 ファントムジス は、WebKit を使用した、よく宣伝されているヘッドレス ブラウザです。私が使用して成功した代替手段は、 HTMLユニット (Java または .NET で IKVM, 、これはシミュレートされたブラウザです。もう 1 つの既知の代替手段は、次のような Web 自動化ツールを使用することです。 セレン.
このテーマについては次のような記事をたくさん書きました Web スクレイピング Ajax および Javascript サイト そして Twitter の自動ブラウザレス OAuth 認証. 。最初の記事の最後には、2011 年から編集してきた追加のリソースがたくさんあります。
ajaxページに依存します。スクリーンスクレイピングの最初の部分は、ページの動作を決定することです。ページからすべてのデータを要求するために反復できる変数のようなものはありますか?個人的には、多くの画面スクレイピング関連タスクに Web Scraper Plus を使用しました。始めるには、プログラマーではない人でも比較的早く動作させることができます。
サイドノート:利用規約はおそらくこれを行う前に確認したいところです。すべてのサイトを反復処理するサイトによっては、いくつかのフラグが立てられる場合があります。
PhearJS が好きですが、それは部分的にそれを構築したためかもしれません。
それは、HTTP(S)を話し、必要なメタデータを含むJSONとしてページをレンダリングするバックグラウンドで実行するサービスです。
低コストのソリューションとして、次のこともお試しいただけます SWExplorer自動化 (SWEA)。このプログラムは、HTML、DHTML、または AJAX で開発された Web アプリケーション用の自動化 API を作成します。
Brian R. Bondyの答えは、ソースコードが読みやすい場合に役立つと思います。 WiresharkやHttpAnalyzerなどのツールを使用してパケットをキャプチャし、「ホスト」からURLを取得する簡単な方法が好きです。フィールドと&quot; GET&quot;フィールド。
たとえば、次のようなパケットをキャプチャします:
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
Selenium WebDriverは優れたソリューションです。ブラウザーをプログラムし、ブラウザーで行う必要のあることを自動化します。ブラウザ(Chrome、Firefoxなど)は、Seleniumで動作する独自のドライバーを提供します。自動化された REALブラウザとして機能するため、ページ(javascriptやAjaxを含む)は、そのブラウザを使用する人間と同じようにロードされます。
デメリットは、処理速度が遅いことです(単一ページでスクレイピングを行う前に、すべての画像とスクリプトがロードされるのを待つ可能性が最も高いため)。
以前は、Ajaxページを削除するための回答として、MITの溶媒とEnvJSにリンクしていました。これらのプロジェクトにはアクセスできなくなっているようです。
まったくの必要性から、私は実際にAjaxページをスクレイピングする別の方法を発明しました。それは、ヘッドレスjavascriptエンジンを見つけてデータを表示しないメソッドを持つfindthecompanyのような厳しいサイトで機能しました。
手法は、クロム拡張を使用してスクレイピングを行うことです。 Chrome拡張機能は、JavaScriptで修正されたDOMへのアクセスを実際に許可するため、Ajaxページを削除するのに最適な場所です。テクニックは次のとおりです。私はいつかコードをオープンソースにするでしょう。クローム拡張機能を作成します(作成方法と、そのアーキテクチャと機能を知っていると仮定します。サンプルがたくさんあるので、これは簡単に習得して練習できます)、
- xpathを使用して、コンテンツスクリプトを使用してDOMにアクセスします。リストまたはテーブル全体、または文字列HTMLノードとしてxpathを使用して動的にレンダリングされたコンテンツを取得します。 (コンテンツスクリプトのみがDOMにアクセスできますが、XMLHTTPを使用してURLにアクセスすることはできません)
- コンテンツスクリプトから、メッセージパッシングを使用して、ストリップされたDOM全体を文字列としてバックグラウンドスクリプトにメッセージ送信します。 (バックグラウンドスクリプトはURLと通信できますが、DOMに触れることはできません)。メッセージパッシングを使用して、これらを話させます。
- さまざまなイベントを使用して、Webページをループし、ストリップされた各HTMLノードコンテンツをバックグラウンドスクリプトに渡すことができます。
- 今度は、バックグラウンドスクリプトを使用して、Nodejs / pythonを使用して作成された単純な外部サーバー(ローカルホスト上の)と通信します。 HTMLノード全体を文字列としてサーバーに送信します。サーバーは、ページ番号またはURLを識別するための適切な変数を使用して、投稿されたコンテンツをファイルに保存します。
- AJAXコンテンツ(文字列としてのHTMLノード)をスクレイピングしましたが、これらは部分的なhtmlノードです。これで、お気に入りのXPATHライブラリを使用してこれらをメモリにロードし、XPATHを使用して情報をテーブルまたはテキストにスクレイピングできます。
あなたが理解できないならコメントしてください、私はそれをより良く書くことができます。 ( 最初の試み )。また、できるだけ早くサンプルコードをリリースしようとしています。